[gnome-shell/wip/fmuellner/es6-classes: 1/4] cleanup: Port non-GObject classes to JS6 classes



commit f4ec1a5f354d6312ad4d7652de40048925dcad3e
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Oct 31 02:19:44 2017 +0100

    cleanup: Port non-GObject classes to JS6 classes
    
    ES6 finally adds standard class syntax to the language, so we can
    replace our custom Lang.Class framework with the new syntax. Any
    classes that inherit from GObject will need special treatment,
    so limit the port to regular javascript classes for now.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/361

 js/extensionPrefs/main.js            |  34 ++-
 js/gdm/authPrompt.js                 |  65 +++--
 js/gdm/batch.js                      |  71 +++---
 js/gdm/loginDialog.js                |  68 +++---
 js/gdm/oVirt.js                      |  16 +-
 js/gdm/realmd.js                     |  21 +-
 js/gdm/util.js                       |  79 +++----
 js/misc/extensionUtils.js            |   9 +-
 js/misc/history.js                   |  25 +-
 js/misc/ibusManager.js               |  46 ++--
 js/misc/introspect.js                |  23 +-
 js/misc/keyboardManager.js           |  37 ++-
 js/misc/loginManager.js              |  35 ++-
 js/misc/modemManager.js              |  35 ++-
 js/misc/objectManager.js             |  28 +--
 js/misc/smartcardManager.js          |  20 +-
 js/misc/util.js                      |  24 +-
 js/misc/weather.js                   |  43 ++--
 js/ui/accessDialog.js                |  32 +--
 js/ui/altTab.js                      |  14 +-
 js/ui/animation.js                   |  53 ++---
 js/ui/appDisplay.js                  | 327 ++++++++++++-------------
 js/ui/appFavorites.js                |  36 ++-
 js/ui/audioDeviceSelection.js        |  43 ++--
 js/ui/background.js                  | 109 ++++-----
 js/ui/backgroundMenu.js              |  12 +-
 js/ui/barLevel.js                    |  32 ++-
 js/ui/calendar.js                    | 217 ++++++++---------
 js/ui/checkBox.js                    |  14 +-
 js/ui/components/__init__.js         |  20 +-
 js/ui/components/automountManager.js |  41 ++--
 js/ui/components/autorunManager.js   |  83 +++----
 js/ui/components/keyring.js          |  58 ++---
 js/ui/components/networkAgent.js     |  82 +++----
 js/ui/components/polkitAgent.js      |  68 +++---
 js/ui/components/telepathyClient.js  | 131 +++++------
 js/ui/ctrlAltTab.js                  |  55 ++---
 js/ui/dash.js                        |  43 ++--
 js/ui/dateMenu.js                    |  58 ++---
 js/ui/dnd.js                         |  58 +++--
 js/ui/endSessionDialog.js            |  52 ++--
 js/ui/extensionDownloader.js         |  18 +-
 js/ui/focusCaretTracker.js           |  21 +-
 js/ui/grabHelper.js                  |  41 ++--
 js/ui/ibusCandidatePopup.js          |  33 ++-
 js/ui/keyboard.js                    | 217 ++++++++---------
 js/ui/layout.js                      |  72 +++---
 js/ui/lightbox.js                    |  22 +-
 js/ui/lookingGlass.js                | 148 ++++++------
 js/ui/magnifier.js                   | 255 ++++++++++----------
 js/ui/magnifierDBus.js               |  65 +++--
 js/ui/main.js                        |  18 +-
 js/ui/messageList.js                 |  86 ++++---
 js/ui/messageTray.js                 | 296 +++++++++++------------
 js/ui/modalDialog.js                 |  35 ++-
 js/ui/mpris.js                       |  73 +++---
 js/ui/notificationDaemon.js          | 176 +++++++-------
 js/ui/osdMonitorLabeler.js           |  33 ++-
 js/ui/osdWindow.js                   |  66 +++---
 js/ui/overview.js                    |  98 ++++----
 js/ui/overviewControls.js            |  96 ++++----
 js/ui/padOsd.js                      | 118 +++++-----
 js/ui/panel.js                       |  18 +-
 js/ui/panelMenu.js                   |  12 +-
 js/ui/pointerWatcher.js              |  33 ++-
 js/ui/popupMenu.js                   | 326 ++++++++++++-------------
 js/ui/remoteMenu.js                  |  84 +++----
 js/ui/remoteSearch.js                |  42 ++--
 js/ui/runDialog.js                   |  30 +--
 js/ui/screenShield.js                | 142 ++++++-----
 js/ui/screencast.js                  |  27 +--
 js/ui/screenshot.js                  |  88 +++----
 js/ui/search.js                      | 167 ++++++-------
 js/ui/sessionMode.js                 |  19 +-
 js/ui/shellDBus.js                   | 108 ++++-----
 js/ui/shellEntry.js                  |  34 ++-
 js/ui/shellMountOperation.js         | 121 ++++------
 js/ui/slider.js                      |  39 ++-
 js/ui/status/bluetooth.js            |  20 +-
 js/ui/status/brightness.js           |  18 +-
 js/ui/status/keyboard.js             | 159 ++++++-------
 js/ui/status/location.js             |  86 +++----
 js/ui/status/network.js              | 445 +++++++++++++++++------------------
 js/ui/status/nightLight.js           |  16 +-
 js/ui/status/power.js                |  20 +-
 js/ui/status/remoteAccess.js         |  22 +-
 js/ui/status/rfkill.js               |  36 ++-
 js/ui/status/screencast.js           |  17 +-
 js/ui/status/system.js               |  42 ++--
 js/ui/status/thunderbolt.js          |  73 +++---
 js/ui/status/volume.js               | 123 +++++-----
 js/ui/tweener.js                     |  24 +-
 js/ui/unlockDialog.js                |  31 ++-
 js/ui/userWidget.js                  |  24 +-
 js/ui/viewSelector.js                |  76 +++---
 js/ui/windowAttentionHandler.js      |  34 ++-
 js/ui/windowManager.js               | 240 +++++++++----------
 js/ui/windowMenu.js                  |  35 +--
 js/ui/workspace.js                   | 234 +++++++++---------
 js/ui/workspaceThumbnail.js          |  95 ++++----
 js/ui/workspacesView.js              | 147 ++++++------
 js/ui/xdndHandler.js                 |  18 +-
 102 files changed, 3450 insertions(+), 4179 deletions(-)
---
diff --git a/js/extensionPrefs/main.js b/js/extensionPrefs/main.js
index 7660856f5..e6b1a6eb7 100644
--- a/js/extensionPrefs/main.js
+++ b/js/extensionPrefs/main.js
@@ -1,4 +1,3 @@
-
 const Lang = imports.lang;
 const Gettext = imports.gettext;
 const GLib = imports.gi.GLib;
@@ -24,9 +23,8 @@ function stripPrefix(string, prefix) {
     return string;
 }
 
-var Application = new Lang.Class({
-    Name: 'Application',
-    _init() {
+var Application = class {
+    constructor() {
         GLib.set_prgname('gnome-shell-extension-prefs');
         this.application = new Gtk.Application({
             application_id: 'org.gnome.shell.ExtensionPrefs',
@@ -42,7 +40,7 @@ var Application = new Lang.Class({
         this._startupUuid = null;
         this._loaded = false;
         this._skipMainWindow = false;
-    },
+    }
 
     _extensionAvailable(uuid) {
         let extension = ExtensionUtils.extensions[uuid];
@@ -54,7 +52,7 @@ var Application = new Lang.Class({
             return false;
 
         return true;
-    },
+    }
 
     _getExtensionPrefsModule(extension) {
         let uuid = extension.metadata.uuid;
@@ -69,7 +67,7 @@ var Application = new Lang.Class({
 
         this._extensionPrefsModules[uuid] = prefsModule;
         return prefsModule;
-    },
+    }
 
     _selectExtension(uuid) {
         if (!this._extensionAvailable(uuid))
@@ -104,7 +102,7 @@ var Application = new Lang.Class({
         dialog.set_default_size(600, 400);
         dialog.add(widget);
         dialog.show();
-    },
+    }
 
     _buildErrorUI(extension, exc) {
         let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
@@ -130,7 +128,7 @@ var Application = new Lang.Class({
 
         box.show_all();
         return box;
-    },
+    }
 
     _buildUI(app) {
         this._window = new Gtk.ApplicationWindow({ application: app,
@@ -167,13 +165,13 @@ var Application = new Lang.Class({
         });
 
         this._window.show_all();
-    },
+    }
 
     _sortList(row1, row2) {
         let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
         let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
         return name1.localeCompare(name2);
-    },
+    }
 
     _updateHeader(row, before) {
         if (!before || row.get_header())
@@ -181,14 +179,14 @@ var Application = new Lang.Class({
 
         let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL });
         row.set_header(sep);
-    },
+    }
 
     _scanExtensions() {
         let finder = new ExtensionUtils.ExtensionFinder();
         finder.connect('extension-found', this._extensionFound.bind(this));
         finder.scanExtensions();
         this._extensionsLoaded();
-    },
+    }
 
     _extensionFound(finder, extension) {
         let row = new ExtensionRow(extension.uuid);
@@ -200,7 +198,7 @@ var Application = new Lang.Class({
 
         row.show_all();
         this._extensionSelector.add(row);
-    },
+    }
 
     _extensionsLoaded() {
         if (this._startupUuid && this._extensionAvailable(this._startupUuid))
@@ -208,16 +206,16 @@ var Application = new Lang.Class({
         this._startupUuid = null;
         this._skipMainWindow = false;
         this._loaded = true;
-    },
+    }
 
     _onActivate() {
         this._window.present();
-    },
+    }
 
     _onStartup(app) {
         this._buildUI(app);
         this._scanExtensions();
-    },
+    }
 
     _onCommandLine(app, commandLine) {
         app.activate();
@@ -240,7 +238,7 @@ var Application = new Lang.Class({
         }
         return 0;
     }
-});
+};
 
 var DescriptionLabel = new Lang.Class({
     Name: 'DescriptionLabel',
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index fcb1a585b..6dd5cdba6 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -2,7 +2,6 @@
 
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Pango = imports.gi.Pango;
 const Signals = imports.signals;
 const St = imports.gi.St;
@@ -38,10 +37,8 @@ var BeginRequestType = {
     DONT_PROVIDE_USERNAME: 1
 };
 
-var AuthPrompt = new Lang.Class({
-    Name: 'AuthPrompt',
-
-    _init(gdmClient, mode) {
+var AuthPrompt = class {
+    constructor(gdmClient, mode) {
         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
 
         this._gdmClient = gdmClient;
@@ -131,12 +128,12 @@ var AuthPrompt = new Lang.Class({
         this._spinner.actor.opacity = 0;
         this._spinner.actor.show();
         this._defaultButtonWell.add_child(this._spinner.actor);
-    },
+    }
 
     _onDestroy() {
         this._userVerifier.destroy();
         this._userVerifier = null;
-    },
+    }
 
     _initButtons() {
         this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button',
@@ -184,7 +181,7 @@ var AuthPrompt = new Lang.Class({
             if (this.nextButton.reactive)
                 this.emit('next');
         });
-    },
+    }
 
     _onAskQuestion(verifier, serviceName, question, passwordChar) {
         if (this._queryingService)
@@ -210,12 +207,12 @@ var AuthPrompt = new Lang.Class({
 
         this.updateSensitivity(true);
         this.emit('prompted');
-    },
+    }
 
     _onOVirtUserAuthenticated() {
         if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
             this.reset();
-    },
+    }
 
     _onSmartcardStatusChanged() {
         this.smartcardDetected = this._userVerifier.smartcardDetected;
@@ -234,12 +231,12 @@ var AuthPrompt = new Lang.Class({
 
         if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
             this.reset();
-    },
+    }
 
     _onShowMessage(userVerifier, message, type) {
         this.setMessage(message, type);
         this.emit('prompted');
-    },
+    }
 
     _onVerificationFailed(userVerifier, canRetry) {
         this._queryingService = null;
@@ -248,22 +245,22 @@ var AuthPrompt = new Lang.Class({
         this.updateSensitivity(canRetry);
         this.setActorInDefaultButtonWell(null);
         this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
-    },
+    }
 
     _onVerificationComplete() {
         this.setActorInDefaultButtonWell(null);
         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
         this.cancelButton.reactive = false;
-    },
+    }
 
     _onReset() {
         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
         this.reset();
-    },
+    }
 
     addActorToDefaultButtonWell(actor) {
         this._defaultButtonWell.add_child(actor);
-    },
+    }
 
     setActorInDefaultButtonWell(actor, animate) {
         if (!this._defaultButtonWellActor &&
@@ -327,25 +324,25 @@ var AuthPrompt = new Lang.Class({
         }
 
         this._defaultButtonWellActor = actor;
-    },
+    }
 
     startSpinning() {
         this.setActorInDefaultButtonWell(this._spinner.actor, true);
-    },
+    }
 
     stopSpinning() {
         this.setActorInDefaultButtonWell(null, false);
-    },
+    }
 
     clear() {
         this._entry.text = '';
         this.stopSpinning();
-    },
+    }
 
     setPasswordChar(passwordChar) {
         this._entry.clutter_text.set_password_char(passwordChar);
         this._entry.menu.isPassword = passwordChar != '';
-    },
+    }
 
     setQuestion(question) {
         this._label.set_text(question);
@@ -354,7 +351,7 @@ var AuthPrompt = new Lang.Class({
         this._entry.show();
 
         this._entry.grab_key_focus();
-    },
+    }
 
     getAnswer() {
         let text;
@@ -367,7 +364,7 @@ var AuthPrompt = new Lang.Class({
         }
 
         return text;
-    },
+    }
 
     _fadeOutMessage() {
         if (this._message.opacity == 0)
@@ -378,7 +375,7 @@ var AuthPrompt = new Lang.Class({
                            time: MESSAGE_FADE_OUT_ANIMATION_TIME,
                            transition: 'easeOutQuad'
                          });
-    },
+    }
 
     setMessage(message, type) {
         if (type == GdmUtil.MessageType.ERROR)
@@ -398,18 +395,18 @@ var AuthPrompt = new Lang.Class({
         } else {
             this._message.opacity = 0;
         }
-    },
+    }
 
     _updateNextButtonSensitivity(sensitive) {
         this.nextButton.reactive = sensitive;
         this.nextButton.can_focus = sensitive;
-    },
+    }
 
     updateSensitivity(sensitive) {
         this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || 
this.verificationStatus == AuthPromptStatus.VERIFYING));
         this._entry.reactive = sensitive;
         this._entry.clutter_text.editable = sensitive;
-    },
+    }
 
     hide() {
         this.setActorInDefaultButtonWell(null, true);
@@ -420,7 +417,7 @@ var AuthPrompt = new Lang.Class({
 
         this.updateSensitivity(true);
         this._entry.set_text('');
-    },
+    }
 
     setUser(user) {
         let oldChild = this._userWell.get_child();
@@ -431,7 +428,7 @@ var AuthPrompt = new Lang.Class({
             let userWidget = new UserWidget.UserWidget(user);
             this._userWell.set_child(userWidget.actor);
         }
-    },
+    }
 
     reset() {
         let oldStatus = this.verificationStatus;
@@ -469,7 +466,7 @@ var AuthPrompt = new Lang.Class({
         }
 
         this.emit('reset', beginRequestType);
-    },
+    }
 
     addCharacter(unichar) {
         if (!this._entry.visible)
@@ -477,7 +474,7 @@ var AuthPrompt = new Lang.Class({
 
         this._entry.grab_key_focus();
         this._entry.clutter_text.insert_unichar(unichar);
-    },
+    }
 
     begin(params) {
         params = Params.parse(params, { userName: null,
@@ -491,7 +488,7 @@ var AuthPrompt = new Lang.Class({
 
         this._userVerifier.begin(params.userName, hold);
         this.verificationStatus = AuthPromptStatus.VERIFYING;
-    },
+    }
 
     finish(onComplete) {
         if (!this._userVerifier.hasPendingMessages) {
@@ -505,7 +502,7 @@ var AuthPrompt = new Lang.Class({
             this._userVerifier.clear();
             onComplete();
         });
-    },
+    }
 
     cancel() {
         if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
@@ -514,5 +511,5 @@ var AuthPrompt = new Lang.Class({
         this.reset();
         this.emit('cancelled');
     }
-});
+};
 Signals.addSignalMethods(AuthPrompt.prototype);
diff --git a/js/gdm/batch.js b/js/gdm/batch.js
index 29c222343..bd84c9230 100644
--- a/js/gdm/batch.js
+++ b/js/gdm/batch.js
@@ -44,45 +44,39 @@
  * replaced by something else.
  */
 
-const Lang = imports.lang;
 const Signals = imports.signals;
 
-var Task = new Lang.Class({
-    Name: 'Task',
-
-    _init(scope, handler) {
+var Task = class {
+    constructor(scope, handler) {
         if (scope)
             this.scope = scope;
         else
             this.scope = this;
 
         this.handler = handler;
-    },
+    }
 
     run() {
         if (this.handler)
             return this.handler.call(this.scope);
 
         return null;
-    },
-});
+    }
+};
 Signals.addSignalMethods(Task.prototype);
 
-var Hold = new Lang.Class({
-    Name: 'Hold',
-    Extends: Task,
-
-    _init() {
-        this.parent(this, () => this);
+var Hold = class extends Task {
+    constructor() {
+        super(null, () => this);
 
         this._acquisitions = 1;
-    },
+    }
 
     acquire() {
         if (this._acquisitions <= 0)
             throw new Error("Cannot acquire hold after it's been released");
         this._acquisitions++;
-    },
+    }
 
     acquireUntilAfter(hold) {
         if (!hold.isAcquired())
@@ -93,27 +87,24 @@ var Hold = new Lang.Class({
             hold.disconnect(signalId);
             this.release();
         });
-    },
+    }
 
     release() {
         this._acquisitions--;
 
         if (this._acquisitions == 0)
             this.emit('release');
-    },
+    }
 
     isAcquired() {
         return this._acquisitions > 0;
     }
-});
+};
 Signals.addSignalMethods(Hold.prototype);
 
-var Batch = new Lang.Class({
-    Name: 'Batch',
-    Extends: Task,
-
-    _init(scope, tasks) {
-        this.parent();
+var Batch = class extends Task {
+    constructor(scope, tasks) {
+        super();
 
         this.tasks = [];
 
@@ -130,11 +121,11 @@ var Batch = new Lang.Class({
 
             this.tasks.push(task);
         }
-    },
+    }
 
     process() {
         throw new Error('Not implemented');
-    },
+    }
 
     runTask() {
         if (!(this._currentTaskIndex in this.tasks)) {
@@ -142,11 +133,11 @@ var Batch = new Lang.Class({
         }
 
         return this.tasks[this._currentTaskIndex].run();
-    },
+    }
 
     _finish() {
         this.hold.release();
-    },
+    }
 
     nextTask() {
         this._currentTaskIndex++;
@@ -159,7 +150,7 @@ var Batch = new Lang.Class({
         }
 
         this.process();
-    },
+    }
 
     _start() {
         // acquire a hold to get released when the entire
@@ -167,7 +158,7 @@ var Batch = new Lang.Class({
         this.hold = new Hold();
         this._currentTaskIndex = 0;
         this.process();
-    },
+    }
 
     run() {
         this._start();
@@ -175,18 +166,15 @@ var Batch = new Lang.Class({
         // hold may be destroyed at this point
         // if we're already done running
         return this.hold;
-    },
+    }
 
     cancel() {
         this.tasks = this.tasks.splice(0, this._currentTaskIndex + 1);
     }
-});
+};
 Signals.addSignalMethods(Batch.prototype);
 
-var ConcurrentBatch = new Lang.Class({
-    Name: 'ConcurrentBatch',
-    Extends: Batch,
-
+var ConcurrentBatch = class extends Batch {
     process() {
        let hold = this.runTask();
 
@@ -199,13 +187,10 @@ var ConcurrentBatch = new Lang.Class({
        // concurrently.
        this.nextTask();
     }
-});
+};
 Signals.addSignalMethods(ConcurrentBatch.prototype);
 
-var ConsecutiveBatch = new Lang.Class({
-    Name: 'ConsecutiveBatch',
-    Extends: Batch,
-
+var ConsecutiveBatch = class extends Batch {
     process() {
        let hold = this.runTask();
 
@@ -222,5 +207,5 @@ var ConsecutiveBatch = new Lang.Class({
            this.nextTask();
        }
     }
-});
+};
 Signals.addSignalMethods(ConsecutiveBatch.prototype);
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 16a8682e2..252caa24d 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -50,10 +50,8 @@ const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
 const _LOGO_ICON_HEIGHT = 48;
 const _MAX_BOTTOM_MENU_ITEMS = 5;
 
-var UserListItem = new Lang.Class({
-    Name: 'UserListItem',
-
-    _init(user) {
+var UserListItem = class {
+    constructor(user) {
         this.user = user;
         this._userChangedId = this.user.connect('changed',
                                                  this._onUserChanged.bind(this));
@@ -91,26 +89,26 @@ var UserListItem = new Lang.Class({
 
         this.actor.connect('clicked', this._onClicked.bind(this));
         this._onUserChanged();
-    },
+    }
 
     _onUserChanged() {
         this._updateLoggedIn();
-    },
+    }
 
     _updateLoggedIn() {
         if (this.user.is_logged_in())
             this.actor.add_style_pseudo_class('logged-in');
         else
             this.actor.remove_style_pseudo_class('logged-in');
-    },
+    }
 
     _onDestroy() {
         this.user.disconnect(this._userChangedId);
-    },
+    }
 
     _onClicked() {
         this.emit('activate');
-    },
+    }
 
     _setSelected(selected) {
         if (selected) {
@@ -119,7 +117,7 @@ var UserListItem = new Lang.Class({
         } else {
             this.actor.remove_style_pseudo_class('selected');
         }
-    },
+    }
 
     showTimedLoginIndicator(time) {
         let hold = new Batch.Hold();
@@ -147,7 +145,7 @@ var UserListItem = new Lang.Class({
         GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
 
         return hold;
-    },
+    }
 
     hideTimedLoginIndicator() {
         if (this._timedLoginTimeoutId) {
@@ -158,13 +156,11 @@ var UserListItem = new Lang.Class({
         this._timedLoginIndicator.visible = false;
         this._timedLoginIndicator.scale_x = 0.;
     }
-});
+};
 Signals.addSignalMethods(UserListItem.prototype);
 
-var UserList = new Lang.Class({
-    Name: 'UserList',
-
-    _init() {
+var UserList = class {
+    constructor() {
         this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
         this.actor.set_policy(Gtk.PolicyType.NEVER,
                               Gtk.PolicyType.AUTOMATIC);
@@ -177,7 +173,7 @@ var UserList = new Lang.Class({
         this._items = {};
 
         this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this));
-    },
+    }
 
     _moveFocusToItems() {
         let hasItems = Object.keys(this._items).length > 0;
@@ -195,11 +191,11 @@ var UserList = new Lang.Class({
                 return false;
             });
         }
-    },
+    }
 
     _onItemActivated(activatedItem) {
         this.emit('activate', activatedItem);
-    },
+    }
 
     updateStyle(isExpanded) {
         let tasks = [];
@@ -213,7 +209,7 @@ var UserList = new Lang.Class({
             let item = this._items[userName];
             item.actor.sync_hover();
         }
-    },
+    }
 
     scrollToItem(item) {
         let box = item.actor.get_allocation_box();
@@ -226,7 +222,7 @@ var UserList = new Lang.Class({
                           { value: value,
                             time: _SCROLL_ANIMATION_TIME,
                             transition: 'easeOutQuad' });
-    },
+    }
 
     jumpToItem(item) {
         let box = item.actor.get_allocation_box();
@@ -236,7 +232,7 @@ var UserList = new Lang.Class({
         let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
 
         adjustment.set_value(value);
-    },
+    }
 
     getItemFromUserName(userName) {
         let item = this._items[userName];
@@ -245,11 +241,11 @@ var UserList = new Lang.Class({
             return null;
 
         return item;
-    },
+    }
 
     containsUser(user) {
         return this._items[user.get_user_name()] != null;
-    },
+    }
 
     addUser(user) {
         if (!user.is_loaded)
@@ -281,7 +277,7 @@ var UserList = new Lang.Class({
         this._moveFocusToItems();
 
         this.emit('item-added', item);
-    },
+    }
 
     removeUser(user) {
         if (!user.is_loaded)
@@ -299,18 +295,16 @@ var UserList = new Lang.Class({
 
         item.actor.destroy();
         delete this._items[userName];
-    },
+    }
 
     numItems() {
         return Object.keys(this._items).length;
     }
-});
+};
 Signals.addSignalMethods(UserList.prototype);
 
-var SessionMenuButton = new Lang.Class({
-    Name: 'SessionMenuButton',
-
-    _init() {
+var SessionMenuButton = class {
+    constructor() {
         let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' });
         this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
                                        reactive: true,
@@ -350,13 +344,13 @@ var SessionMenuButton = new Lang.Class({
         this._items = {};
         this._activeSessionId = null;
         this._populate();
-    },
+    }
 
     updateSensitivity(sensitive) {
         this._button.reactive = sensitive;
         this._button.can_focus = sensitive;
         this._menu.close(BoxPointer.PopupAnimation.NONE);
-    },
+    }
 
     _updateOrnament() {
         let itemIds = Object.keys(this._items);
@@ -366,7 +360,7 @@ var SessionMenuButton = new Lang.Class({
             else
                 this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.NONE);
         }
-    },
+    }
 
     setActiveSession(sessionId) {
          if (sessionId == this._activeSessionId)
@@ -374,11 +368,11 @@ var SessionMenuButton = new Lang.Class({
 
          this._activeSessionId = sessionId;
          this._updateOrnament();
-    },
+    }
 
     close() {
         this._menu.close();
-    },
+    }
 
     _populate() {
         let ids = Gdm.get_session_ids();
@@ -403,7 +397,7 @@ var SessionMenuButton = new Lang.Class({
             });
         }
     }
-});
+};
 Signals.addSignalMethods(SessionMenuButton.prototype);
 
 var LoginDialog = new Lang.Class({
diff --git a/js/gdm/oVirt.js b/js/gdm/oVirt.js
index e53e0ff7b..d5f6fbbac 100644
--- a/js/gdm/oVirt.js
+++ b/js/gdm/oVirt.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const OVirtCredentialsIface = `
@@ -28,33 +27,32 @@ function OVirtCredentials() {
     return self;
 }
 
-var OVirtCredentialsManager = new Lang.Class({
-    Name: 'OVirtCredentialsManager',
-    _init() {
+var OVirtCredentialsManager = class {
+    constructor() {
         this._token = null;
 
         this._credentials = new OVirtCredentials();
         this._credentials.connectSignal('UserAuthenticated',
                                         this._onUserAuthenticated.bind(this));
-    },
+    }
 
     _onUserAuthenticated(proxy, sender, [token]) {
         this._token = token;
         this.emit('user-authenticated', token);
-    },
+    }
 
     hasToken() {
         return this._token != null;
-    },
+    }
 
     getToken() {
         return this._token;
-    },
+    }
 
     resetToken() {
         this._token = null;
     }
-});
+};
 Signals.addSignalMethods(OVirtCredentialsManager.prototype);
 
 function getOVirtCredentialsManager() {
diff --git a/js/gdm/realmd.js b/js/gdm/realmd.js
index 7b1fb907d..94007aa49 100644
--- a/js/gdm/realmd.js
+++ b/js/gdm/realmd.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 
@@ -16,10 +15,8 @@ const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
 const RealmIface = loadInterfaceXML("org.freedesktop.realmd.Realm");
 const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
 
-var Manager = new Lang.Class({
-    Name: 'Manager',
-
-    _init(parentActor) {
+var Manager = class {
+    constructor(parentActor) {
         this._aggregateProvider = Provider(Gio.DBus.system,
                                            'org.freedesktop.realmd',
                                            '/org/freedesktop/realmd',
@@ -31,7 +28,7 @@ var Manager = new Lang.Class({
                 if ('Realms' in properties.deep_unpack())
                     this._reloadRealms();
             });
-    },
+    }
 
     _reloadRealms() {
         let realmPaths = this._aggregateProvider.Realms;
@@ -45,7 +42,7 @@ var Manager = new Lang.Class({
                               realmPaths[i],
                               this._onRealmLoaded.bind(this));
         }
-    },
+    }
 
     _reloadRealm(realm) {
         if (!realm.Configured) {
@@ -58,7 +55,7 @@ var Manager = new Lang.Class({
         this._realms[realm.get_object_path()] = realm;
 
         this._updateLoginFormat();
-    },
+    }
 
     _onRealmLoaded(realm, error) {
         if (error)
@@ -70,7 +67,7 @@ var Manager = new Lang.Class({
             if ('Configured' in properties.deep_unpack())
                 this._reloadRealm(realm);
         });
-    },
+    }
 
     _updateLoginFormat() {
         let newLoginFormat;
@@ -87,7 +84,7 @@ var Manager = new Lang.Class({
             this._loginFormat = newLoginFormat;
             this.emit('login-format-changed', newLoginFormat);
         }
-    },
+    }
 
     get loginFormat() {
         if (this._loginFormat !== undefined)
@@ -96,7 +93,7 @@ var Manager = new Lang.Class({
         this._updateLoginFormat();
 
         return this._loginFormat;
-    },
+    }
 
     release() {
         Service(Gio.DBus.system,
@@ -107,5 +104,5 @@ var Manager = new Lang.Class({
         this._realms = { };
         this._updateLoginFormat();
     }
-});
+};
 Signals.addSignalMethods(Manager.prototype)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index eac8ccd50..63376873e 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -3,7 +3,6 @@
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Signals = imports.signals;
 const St = imports.gi.St;
@@ -119,10 +118,8 @@ function cloneAndFadeOutActor(actor) {
     return hold;
 }
 
-var ShellUserVerifier = new Lang.Class({
-    Name: 'ShellUserVerifier',
-
-    _init(client, params) {
+var ShellUserVerifier = class {
+    constructor(client, params) {
         params = Params.parse(params, { reauthenticationOnly: false });
         this._reauthOnly = params.reauthenticationOnly;
 
@@ -165,7 +162,7 @@ var ShellUserVerifier = new Lang.Class({
 
         this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
                                                                                
this._oVirtUserAuthenticated.bind(this));
-    },
+    }
 
     begin(userName, hold) {
         this._cancellable = new Gio.Cancellable();
@@ -183,7 +180,7 @@ var ShellUserVerifier = new Lang.Class({
         } else {
             this._client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this));
         }
-    },
+    }
 
     cancel() {
         if (this._cancellable)
@@ -193,14 +190,14 @@ var ShellUserVerifier = new Lang.Class({
             this._userVerifier.call_cancel_sync(null);
             this.clear();
         }
-    },
+    }
 
     _clearUserVerifier() {
         if (this._userVerifier) {
             this._userVerifier.run_dispose();
             this._userVerifier = null;
         }
-    },
+    }
 
     clear() {
         if (this._cancellable) {
@@ -210,7 +207,7 @@ var ShellUserVerifier = new Lang.Class({
 
         this._clearUserVerifier();
         this._clearMessageQueue();
-    },
+    }
 
     destroy() {
         this.clear();
@@ -224,7 +221,7 @@ var ShellUserVerifier = new Lang.Class({
 
         this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
         this._oVirtCredentialsManager = null;
-    },
+    }
 
     answerQuery(serviceName, answer) {
         if (!this.hasPendingMessages) {
@@ -235,12 +232,12 @@ var ShellUserVerifier = new Lang.Class({
                 this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
             });
         }
-    },
+    }
 
     _getIntervalForMessage(message) {
         // We probably could be smarter here
         return message.length * USER_READ_TIME;
-    },
+    }
 
     finishMessageQueue() {
         if (!this.hasPendingMessages)
@@ -250,7 +247,7 @@ var ShellUserVerifier = new Lang.Class({
 
         this.hasPendingMessages = false;
         this.emit('no-more-messages');
-    },
+    }
 
     _queueMessageTimeout() {
         if (this._messageQueue.length == 0) {
@@ -273,7 +270,7 @@ var ShellUserVerifier = new Lang.Class({
                                                            return GLib.SOURCE_REMOVE;
                                                        });
         GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout');
-    },
+    }
 
     _queueMessage(message, messageType) {
         let interval = this._getIntervalForMessage(message);
@@ -281,7 +278,7 @@ var ShellUserVerifier = new Lang.Class({
         this.hasPendingMessages = true;
         this._messageQueue.push({ text: message, type: messageType, interval: interval });
         this._queueMessageTimeout();
-    },
+    }
 
     _clearMessageQueue() {
         this.finishMessageQueue();
@@ -291,7 +288,7 @@ var ShellUserVerifier = new Lang.Class({
             this._messageQueueTimeoutId = 0;
         }
         this.emit('show-message', null, MessageType.NONE);
-    },
+    }
 
     _checkForFingerprintReader() {
         this._haveFingerprintReader = false;
@@ -309,12 +306,12 @@ var ShellUserVerifier = new Lang.Class({
                     this._updateDefaultService();
                 }
             });
-    },
+    }
 
     _oVirtUserAuthenticated(token) {
         this._preemptingService = OVIRT_SERVICE_NAME;
         this.emit('ovirt-user-authenticated');
-    },
+    }
 
     _checkForSmartcard() {
         let smartcardDetected;
@@ -336,7 +333,7 @@ var ShellUserVerifier = new Lang.Class({
 
             this.emit('smartcard-status-changed');
         }
-    },
+    }
 
     _reportInitError(where, error) {
         logError(error, where);
@@ -344,7 +341,7 @@ var ShellUserVerifier = new Lang.Class({
 
         this._queueMessage(_("Authentication error"), MessageType.ERROR);
         this._verificationFailed(false);
-    },
+    }
 
     _reauthenticationChannelOpened(client, result) {
         try {
@@ -371,7 +368,7 @@ var ShellUserVerifier = new Lang.Class({
         this._connectSignals();
         this._beginVerification();
         this._hold.release();
-    },
+    }
 
     _userVerifierGot(client, result) {
         try {
@@ -387,7 +384,7 @@ var ShellUserVerifier = new Lang.Class({
         this._connectSignals();
         this._beginVerification();
         this._hold.release();
-    },
+    }
 
     _connectSignals() {
         this._userVerifier.connect('info', this._onInfo.bind(this));
@@ -397,22 +394,22 @@ var ShellUserVerifier = new Lang.Class({
         this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
         this._userVerifier.connect('reset', this._onReset.bind(this));
         this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
-    },
+    }
 
     _getForegroundService() {
         if (this._preemptingService)
             return this._preemptingService;
 
         return this._defaultService;
-    },
+    }
 
     serviceIsForeground(serviceName) {
         return serviceName == this._getForegroundService();
-    },
+    }
 
     serviceIsDefault(serviceName) {
         return serviceName == this._defaultService;
-    },
+    }
 
     _updateDefaultService() {
         if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
@@ -426,7 +423,7 @@ var ShellUserVerifier = new Lang.Class({
             log("no authentication service is enabled, using password authentication");
             this._defaultService = PASSWORD_SERVICE_NAME;
         }
-    },
+    }
 
     _startService(serviceName) {
         this._hold.acquire();
@@ -462,14 +459,14 @@ var ShellUserVerifier = new Lang.Class({
                this._hold.release();
            });
         }
-    },
+    }
 
     _beginVerification() {
         this._startService(this._getForegroundService());
 
         if (this._userName && this._haveFingerprintReader && 
!this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
             this._startService(FINGERPRINT_SERVICE_NAME);
-    },
+    }
 
     _onInfo(client, serviceName, info) {
         if (this.serviceIsForeground(serviceName)) {
@@ -484,21 +481,21 @@ var ShellUserVerifier = new Lang.Class({
             // to indicate the user can swipe their finger instead
             this._queueMessage(_("(or swipe finger)"), MessageType.HINT);
         }
-    },
+    }
 
     _onProblem(client, serviceName, problem) {
         if (!this.serviceIsForeground(serviceName))
             return;
 
         this._queueMessage(problem, MessageType.ERROR);
-    },
+    }
 
     _onInfoQuery(client, serviceName, question) {
         if (!this.serviceIsForeground(serviceName))
             return;
 
         this.emit('ask-question', serviceName, question, '');
-    },
+    }
 
     _onSecretInfoQuery(client, serviceName, secretQuestion) {
         if (!this.serviceIsForeground(serviceName))
@@ -511,7 +508,7 @@ var ShellUserVerifier = new Lang.Class({
         }
 
         this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
-    },
+    }
 
     _onReset() {
         // Clear previous attempts to authenticate
@@ -519,20 +516,20 @@ var ShellUserVerifier = new Lang.Class({
         this._updateDefaultService();
 
         this.emit('reset');
-    },
+    }
 
     _onVerificationComplete() {
         this.emit('verification-complete');
-    },
+    }
 
     _cancelAndReset() {
         this.cancel();
         this._onReset();
-    },
+    }
 
     _retry() {
         this.begin(this._userName, new Batch.Hold());
-    },
+    }
 
     _verificationFailed(retry) {
         // For Not Listed / enterprise logins, immediately reset
@@ -567,7 +564,7 @@ var ShellUserVerifier = new Lang.Class({
         }
 
         this.emit('verification-failed', canRetry);
-    },
+    }
 
     _onConversationStopped(client, serviceName) {
         // If the login failed with the preauthenticated oVirt credentials
@@ -586,6 +583,6 @@ var ShellUserVerifier = new Lang.Class({
         if (this.serviceIsForeground(serviceName)) {
             this._verificationFailed(true);
         }
-    },
-});
+    }
+};
 Signals.addSignalMethods(ShellUserVerifier.prototype);
diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js
index 6e39f87d7..be6db8343 100644
--- a/js/misc/extensionUtils.js
+++ b/js/misc/extensionUtils.js
@@ -3,7 +3,6 @@
 // Common utils for the extension system and the extension
 // preferences tool
 
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const Gio = imports.gi.Gio;
@@ -160,9 +159,7 @@ function installImporter(extension) {
     imports.searchPath = oldSearchPath;
 }
 
-var ExtensionFinder = new Lang.Class({
-    Name: 'ExtensionFinder',
-
+var ExtensionFinder = class {
     _loadExtension(extensionDir, info, perUserDir) {
         let fileType = info.get_file_type();
         if (fileType != Gio.FileType.DIRECTORY)
@@ -184,7 +181,7 @@ var ExtensionFinder = new Lang.Class({
             return;
         }
         this.emit('extension-found', extension);
-    },
+    }
 
     scanExtensions() {
         let perUserDir = Gio.File.new_for_path(global.userdatadir);
@@ -192,5 +189,5 @@ var ExtensionFinder = new Lang.Class({
             this._loadExtension(dir, info, perUserDir);
         });
     }
-});
+};
 Signals.addSignalMethods(ExtensionFinder.prototype);
diff --git a/js/misc/history.js b/js/misc/history.js
index f1d037018..fbe1c088f 100644
--- a/js/misc/history.js
+++ b/js/misc/history.js
@@ -1,16 +1,13 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Signals = imports.signals;
 const Clutter = imports.gi.Clutter;
 const Params = imports.misc.params;
 
 var DEFAULT_LIMIT = 512;
 
-var HistoryManager = new Lang.Class({
-    Name: 'HistoryManager',
-
-    _init(params) {
+var HistoryManager = class {
+    constructor(params) {
         params = Params.parse(params, { gsettingsKey: null,
                                         limit: DEFAULT_LIMIT,
                                         entry: null });
@@ -34,12 +31,12 @@ var HistoryManager = new Lang.Class({
             this._entry.connect('key-press-event', 
                                 this._onEntryKeyPress.bind(this));
         }
-    },
+    }
 
     _historyChanged() {
         this._history = global.settings.get_strv(this._key);
         this._historyIndex = this._history.length;
-    },
+    }
 
     _setPrevItem(text) {
         if (this._historyIndex <= 0)
@@ -50,7 +47,7 @@ var HistoryManager = new Lang.Class({
         this._historyIndex--;
         this._indexChanged();
         return true;
-    },
+    }
 
     _setNextItem(text) {
         if (this._historyIndex >= this._history.length)
@@ -61,7 +58,7 @@ var HistoryManager = new Lang.Class({
         this._historyIndex++;
         this._indexChanged();
         return true;
-    },
+    }
 
     lastItem() {
         if (this._historyIndex != this._history.length) {
@@ -70,7 +67,7 @@ var HistoryManager = new Lang.Class({
         }
 
         return this._historyIndex ? this._history[this._historyIndex -1] : null;
-    },
+    }
 
     addItem(input) {
         if (this._history.length == 0 ||
@@ -81,7 +78,7 @@ var HistoryManager = new Lang.Class({
             this._save();
         }
         this._historyIndex = this._history.length;
-    },
+    }
 
     _onEntryKeyPress(entry, event) {
         let symbol = event.get_key_symbol();
@@ -91,7 +88,7 @@ var HistoryManager = new Lang.Class({
             return this._setNextItem(entry.get_text());
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _indexChanged() {
         let current = this._history[this._historyIndex] || '';
@@ -99,7 +96,7 @@ var HistoryManager = new Lang.Class({
 
         if (this._entry)
             this._entry.set_text(current);
-    },
+    }
 
     _save() {
         if (this._history.length > this._limit)
@@ -108,5 +105,5 @@ var HistoryManager = new Lang.Class({
         if (this._key)
             global.settings.set_strv(this._key, this._history);
     }
-});
+};
 Signals.addSignalMethods(HistoryManager.prototype);
diff --git a/js/misc/ibusManager.js b/js/misc/ibusManager.js
index 33ad8777e..fe86a8326 100644
--- a/js/misc/ibusManager.js
+++ b/js/misc/ibusManager.js
@@ -2,7 +2,6 @@
 
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Signals = imports.signals;
 
@@ -32,16 +31,15 @@ function getIBusManager() {
     return _ibusManager;
 }
 
-var IBusManager = new Lang.Class({
-    Name: 'IBusManager',
+var IBusManager = class {
+    constructor() {
+        IBus.init();
 
-    // This is the longest we'll keep the keyboard frozen until an input
-    // source is active.
-    _MAX_INPUT_SOURCE_ACTIVATION_TIME: 4000, // ms
-    _PRELOAD_ENGINES_DELAY_TIME: 30, // sec
+        // This is the longest we'll keep the keyboard frozen until an input
+        // source is active.
+        this._MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms
+        this._PRELOAD_ENGINES_DELAY_TIME = 30; // sec
 
-    _init() {
-        IBus.init();
 
         this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
 
@@ -60,7 +58,7 @@ var IBusManager = new Lang.Class({
         this._ibus.connect('global-engine-changed', this._engineChanged.bind(this));
 
         this._spawn();
-    },
+    }
 
     _spawn() {
         try {
@@ -69,7 +67,7 @@ var IBusManager = new Lang.Class({
         } catch(e) {
             log('Failed to launch ibus-daemon: ' + e.message);
         }
-    },
+    }
 
     _clear() {
         if (this._panelService)
@@ -85,7 +83,7 @@ var IBusManager = new Lang.Class({
         this.emit('ready', false);
 
         this._spawn();
-    },
+    }
 
     _onConnected() {
         this._ibus.list_engines_async(-1, null, this._initEngines.bind(this));
@@ -93,7 +91,7 @@ var IBusManager = new Lang.Class({
                                       IBus.BusNameFlag.REPLACE_EXISTING,
                                       -1, null,
                                       this._initPanelService.bind(this));
-    },
+    }
 
     _initEngines(ibus, result) {
         let enginesList = this._ibus.list_engines_async_finish(result);
@@ -106,7 +104,7 @@ var IBusManager = new Lang.Class({
         } else {
             this._clear();
         }
-    },
+    }
 
     _initPanelService(ibus, result) {
         let success = this._ibus.request_name_async_finish(result);
@@ -151,13 +149,13 @@ var IBusManager = new Lang.Class({
         } else {
             this._clear();
         }
-    },
+    }
 
     _updateReadiness() {
         this._ready = (Object.keys(this._engines).length > 0 &&
                        this._panelService != null);
         this.emit('ready', this._ready);
-    },
+    }
 
     _engineChanged(bus, engineName) {
         if (!this._ready)
@@ -178,26 +176,26 @@ var IBusManager = new Lang.Class({
 
                 this.emit('properties-registered', this._currentEngineName, props);
             });
-    },
+    }
 
     _updateProperty(panel, prop) {
         this.emit('property-updated', this._currentEngineName, prop);
-    },
+    }
 
     _setContentType(panel, purpose, hints) {
         this.emit('set-content-type', purpose, hints);
-    },
+    }
 
     activateProperty(key, state) {
         this._panelService.property_activate(key, state);
-    },
+    }
 
     getEngineDesc(id) {
         if (!this._ready || !this._engines.hasOwnProperty(id))
             return null;
 
         return this._engines[id];
-    },
+    }
 
     setEngine(id, callback) {
         // Send id even if id == this._currentEngineName
@@ -211,7 +209,7 @@ var IBusManager = new Lang.Class({
 
         this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
                                            null, callback || null);
-    },
+    }
 
     preloadEngines(ids) {
         if (!this._ibus || ids.length == 0)
@@ -233,6 +231,6 @@ var IBusManager = new Lang.Class({
                                              this._preloadEnginesId = 0;
                                              return GLib.SOURCE_REMOVE;
                                          });
-    },
-});
+    }
+};
 Signals.addSignalMethods(IBusManager.prototype);
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
index 5599e1a66..b9b0a987b 100644
--- a/js/misc/introspect.js
+++ b/js/misc/introspect.js
@@ -1,6 +1,5 @@
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 
@@ -12,10 +11,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
 
 const IntrospectDBusIface = loadInterfaceXML('org.gnome.Shell.Introspect');
 
-var IntrospectService = new Lang.Class({
-    Name: 'IntrospectService',
-
-    _init() {
+var IntrospectService = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface,
                                                              this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect');
@@ -45,21 +42,21 @@ var IntrospectService = new Lang.Class({
                         });
 
         this._syncRunningApplications();
-    },
+    }
 
     _isStandaloneApp(app) {
         let windows = app.get_windows();
 
         return app.get_windows().some(w => w.transient_for == null);
-    },
+    }
 
     _isIntrospectEnabled() {
        return this._settings.get_boolean(INTROSPECT_KEY);
-    },
+    }
 
     _isSenderWhitelisted(sender) {
        return APP_WHITELIST.includes(sender);
-    },
+    }
 
     _syncRunningApplications() {
         let tracker = Shell.WindowTracker.get_default();
@@ -95,7 +92,7 @@ var IntrospectService = new Lang.Class({
         }
         this._runningApplicationsDirty = false;
         this._activeApplicationDirty = false;
-    },
+    }
 
     _isEligibleWindow(window) {
         if (window.is_override_redirect())
@@ -106,7 +103,7 @@ var IntrospectService = new Lang.Class({
                 type == Meta.WindowType.DIALOG ||
                 type == Meta.WindowType.MODAL_DIALOG ||
                 type == Meta.WindowType.UTILITY);
-    },
+    }
 
     GetRunningApplicationsAsync(params, invocation) {
         if (!this._isIntrospectEnabled() &&
@@ -118,7 +115,7 @@ var IntrospectService = new Lang.Class({
         }
 
         invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications]));
-    },
+    }
 
     GetWindowsAsync(params, invocation) {
         let focusWindow = global.display.get_focus_window();
@@ -163,4 +160,4 @@ var IntrospectService = new Lang.Class({
         }
         invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
     }
-});
+};
diff --git a/js/misc/keyboardManager.js b/js/misc/keyboardManager.js
index f4001f130..5d720e88a 100644
--- a/js/misc/keyboardManager.js
+++ b/js/misc/keyboardManager.js
@@ -2,7 +2,6 @@
 
 const GLib = imports.gi.GLib;
 const GnomeDesktop = imports.gi.GnomeDesktop;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 
 const Main = imports.ui.main;
@@ -38,22 +37,20 @@ function holdKeyboard() {
     global.display.freeze_keyboard(global.get_current_time());
 }
 
-var KeyboardManager = new Lang.Class({
-    Name: 'KeyboardManager',
+var KeyboardManager = class {
+    constructor() {
+        // The XKB protocol doesn't allow for more that 4 layouts in a
+        // keymap. Wayland doesn't impose this limit and libxkbcommon can
+        // handle up to 32 layouts but since we need to support X clients
+        // even as a Wayland compositor, we can't bump this.
+        this.MAX_LAYOUTS_PER_GROUP = 4;
 
-    // The XKB protocol doesn't allow for more that 4 layouts in a
-    // keymap. Wayland doesn't impose this limit and libxkbcommon can
-    // handle up to 32 layouts but since we need to support X clients
-    // even as a Wayland compositor, we can't bump this.
-    MAX_LAYOUTS_PER_GROUP: 4,
-
-    _init() {
         this._xkbInfo = getXkbInfo();
         this._current = null;
         this._localeLayoutInfo = this._getLocaleLayout();
         this._layoutInfos = {};
         this._currentKeymap = null;
-    },
+    }
 
     _applyLayoutGroup(group) {
         let options = this._buildOptionsString();
@@ -67,11 +64,11 @@ var KeyboardManager = new Lang.Class({
 
         this._currentKeymap = {layouts, variants, options};
         Meta.get_backend().set_keymap(layouts, variants, options);
-    },
+    }
 
     _applyLayoutGroupIndex(idx) {
         Meta.get_backend().lock_layout_group(idx);
-    },
+    }
 
     apply(id) {
         let info = this._layoutInfos[id];
@@ -87,7 +84,7 @@ var KeyboardManager = new Lang.Class({
         }
 
         this._current = info;
-    },
+    }
 
     reapply() {
         if (!this._current)
@@ -95,7 +92,7 @@ var KeyboardManager = new Lang.Class({
 
         this._applyLayoutGroup(this._current.group);
         this._applyLayoutGroupIndex(this._current.groupIndex);
-    },
+    }
 
     setUserLayouts(ids) {
         this._current = null;
@@ -126,7 +123,7 @@ var KeyboardManager = new Lang.Class({
 
             i += 1;
         }
-    },
+    }
 
     _getLocaleLayout() {
         let locale = GLib.get_language_names()[0];
@@ -143,21 +140,21 @@ var KeyboardManager = new Lang.Class({
             return { layout: _layout, variant: _variant };
         else
             return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT };
-    },
+    }
 
     _buildGroupStrings(_group) {
         let group = _group.concat(this._localeLayoutInfo);
         let layouts = group.map(g => g.layout).join(',');
         let variants = group.map(g => g.variant).join(',');
         return [layouts, variants];
-    },
+    }
 
     setKeyboardOptions(options) {
         this._xkbOptions = options;
-    },
+    }
 
     _buildOptionsString() {
         let options = this._xkbOptions.join(',');
         return options;
     }
-});
+};
diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js
index d3868184e..139129b60 100644
--- a/js/misc/loginManager.js
+++ b/js/misc/loginManager.js
@@ -2,7 +2,6 @@
 
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
@@ -70,10 +69,8 @@ function getLoginManager() {
     return _loginManager;
 }
 
-var LoginManagerSystemd = new Lang.Class({
-    Name: 'LoginManagerSystemd',
-
-    _init() {
+var LoginManagerSystemd = class {
+    constructor() {
         this._proxy = new SystemdLoginManager(Gio.DBus.system,
                                               'org.freedesktop.login1',
                                               '/org/freedesktop/login1');
@@ -82,7 +79,7 @@ var LoginManagerSystemd = new Lang.Class({
                                                '/org/freedesktop/login1/user/self');
         this._proxy.connectSignal('PrepareForSleep',
                                   this._prepareForSleep.bind(this));
-    },
+    }
 
     getCurrentSessionProxy(callback) {
         if (this._currentSession) {
@@ -129,7 +126,7 @@ var LoginManagerSystemd = new Lang.Class({
                 callback(this._currentSession);
             }
         });
-    },
+    }
 
     canSuspend(asyncCallback) {
         this._proxy.CanSuspendRemote((result, error) => {
@@ -141,7 +138,7 @@ var LoginManagerSystemd = new Lang.Class({
                 asyncCallback(canSuspend, needsAuth);
             }
         });
-    },
+    }
 
     listSessions(asyncCallback) {
         this._proxy.ListSessionsRemote((result, error) => {
@@ -150,11 +147,11 @@ var LoginManagerSystemd = new Lang.Class({
             else
                 asyncCallback(result[0]);
         });
-    },
+    }
 
     suspend() {
         this._proxy.SuspendRemote(true);
-    },
+    }
 
     inhibit(reason, callback) {
         let inVariant = GLib.Variant.new('(ssss)',
@@ -174,38 +171,36 @@ var LoginManagerSystemd = new Lang.Class({
                     callback(null);
                 }
             });
-    },
+    }
 
     _prepareForSleep(proxy, sender, [aboutToSuspend]) {
         this.emit('prepare-for-sleep', aboutToSuspend);
     }
-});
+};
 Signals.addSignalMethods(LoginManagerSystemd.prototype);
 
-var LoginManagerDummy = new Lang.Class({
-    Name: 'LoginManagerDummy',
-
+var LoginManagerDummy = class {
     getCurrentSessionProxy(callback) {
         // we could return a DummySession object that fakes whatever callers
         // expect (at the time of writing: connect() and connectSignal()
         // methods), but just never calling the callback should be safer
-    },
+    }
 
     canSuspend(asyncCallback) {
         asyncCallback(false, false);
-    },
+    }
 
     listSessions(asyncCallback) {
         asyncCallback([]);
-    },
+    }
 
     suspend() {
         this.emit('prepare-for-sleep', true);
         this.emit('prepare-for-sleep', false);
-    },
+    }
 
     inhibit(reason, callback) {
         callback(null);
     }
-});
+};
 Signals.addSignalMethods(LoginManagerDummy.prototype);
diff --git a/js/misc/modemManager.js b/js/misc/modemManager.js
index f57057848..82849ba1e 100644
--- a/js/misc/modemManager.js
+++ b/js/misc/modemManager.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const NMA = imports.gi.NMA;
 const Signals = imports.signals;
 
@@ -100,10 +99,8 @@ const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInter
 const ModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager.Modem.Cdma');
 const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
 
-var ModemGsm = new Lang.Class({
-    Name: 'ModemGsm',
-
-    _init(path) {
+var ModemGsm = class {
+    constructor(path) {
         this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
 
         this.signal_quality = 0;
@@ -139,13 +136,11 @@ var ModemGsm = new Lang.Class({
             this.emit('notify::signal-quality');
         });
     }
-});
+};
 Signals.addSignalMethods(ModemGsm.prototype);
 
-var ModemCdma = new Lang.Class({
-    Name: 'ModemCdma',
-
-    _init(path) {
+var ModemCdma = class {
+    constructor(path) {
         this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
 
         this.signal_quality = 0;
@@ -169,7 +164,7 @@ var ModemCdma = new Lang.Class({
             }
             this.emit('notify::signal-quality');
         });
-    },
+    }
 
     _refreshServingSystem() {
         this._proxy.GetServingSystemRemote(([result], err) => {
@@ -184,7 +179,7 @@ var ModemCdma = new Lang.Class({
             this.emit('notify::operator-name');
         });
     }
-});
+};
 Signals.addSignalMethods(ModemCdma.prototype);
 
 
@@ -201,10 +196,8 @@ const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gp
 const BroadbandModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem.ModemCdma');
 const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
 
-var BroadbandModem = new Lang.Class({
-    Name: 'BroadbandModem',
-
-    _init(path, capabilities) {
+var BroadbandModem = class {
+    constructor(path, capabilities) {
         this._proxy = new BroadbandModemProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
         this._proxy_3gpp = new BroadbandModem3gppProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', 
path);
         this._proxy_cdma = new BroadbandModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', 
path);
@@ -229,13 +222,13 @@ var BroadbandModem = new Lang.Class({
                 this._reloadCdmaOperatorName();
         });
         this._reloadCdmaOperatorName();
-    },
+    }
 
     _reloadSignalQuality() {
         let [quality, recent] = this._proxy.SignalQuality;
         this.signal_quality = quality;
         this.emit('notify::signal-quality');
-    },
+    }
 
     _reloadOperatorName() {
         let new_name = "";
@@ -250,19 +243,19 @@ var BroadbandModem = new Lang.Class({
 
         this.operator_name = new_name;
         this.emit('notify::operator-name');
-    },
+    }
 
     _reload3gppOperatorName() {
         let name = this._proxy_3gpp.OperatorName;
         let code = this._proxy_3gpp.OperatorCode;
         this.operator_name_3gpp = _findProviderForMccMnc(name, code);
         this._reloadOperatorName();
-    },
+    }
 
     _reloadCdmaOperatorName() {
         let sid = this._proxy_cdma.Sid;
         this.operator_name_cdma = _findProviderForSid(sid);
         this._reloadOperatorName();
     }
-});
+};
 Signals.addSignalMethods(BroadbandModem.prototype);
diff --git a/js/misc/objectManager.js b/js/misc/objectManager.js
index a1b7eb9d2..5a1ee3180 100644
--- a/js/misc/objectManager.js
+++ b/js/misc/objectManager.js
@@ -2,7 +2,6 @@
 
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Params = imports.misc.params;
 const Signals = imports.signals;
 
@@ -27,9 +26,8 @@ const ObjectManagerIface = `
 
 const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
 
-var ObjectManager = new Lang.Class({
-    Name: 'ObjectManager',
-    _init(params) {
+var ObjectManager = class {
+    constructor(params) {
         params = Params.parse(params, { connection: null,
                                         name: null,
                                         objectPath: null,
@@ -63,7 +61,7 @@ var ObjectManager = new Lang.Class({
         this._managerProxy.init_async(GLib.PRIORITY_DEFAULT,
                                       this._cancellable,
                                       this._onManagerProxyLoaded.bind(this));
-    },
+    }
 
     _tryToCompleteLoad() {
         if (this._numLoadInhibitors == 0)
@@ -74,7 +72,7 @@ var ObjectManager = new Lang.Class({
             if (this._onLoaded)
                 this._onLoaded();
         }
-    },
+    }
 
     _addInterface(objectPath, interfaceName, onFinished) {
         let info = this._interfaceInfos[interfaceName];
@@ -129,7 +127,7 @@ var ObjectManager = new Lang.Class({
                if (onFinished)
                    onFinished();
         });
-    },
+    }
 
     _removeInterface(objectPath, interfaceName) {
         if (!this._objects[objectPath])
@@ -155,7 +153,7 @@ var ObjectManager = new Lang.Class({
             delete this._objects[objectPath];
             this.emit('object-removed', objectPath);
         }
-    },
+    }
 
     _onManagerProxyLoaded(initable, result) {
         let error = null;
@@ -194,7 +192,7 @@ var ObjectManager = new Lang.Class({
 
         if (this._managerProxy.g_name_owner)
             this._onNameAppeared();
-    },
+    }
 
     _onNameAppeared() {
         this._managerProxy.GetManagedObjectsRemote((result, error) => {
@@ -232,7 +230,7 @@ var ObjectManager = new Lang.Class({
             }
             this._tryToCompleteLoad();
         });
-    },
+    }
 
     _onNameVanished() {
         let objectPaths = Object.keys(this._objects);
@@ -248,14 +246,14 @@ var ObjectManager = new Lang.Class({
                     this._removeInterface(objectPath, interfaceName);
             }
         }
-    },
+    }
 
     _registerInterfaces(interfaces) {
         for (let i = 0; i < interfaces.length; i++) {
             let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
             this._interfaceInfos[info.name] = info;
         }
-    },
+    }
 
     getProxy(objectPath, interfaceName) {
         let object = this._objects[objectPath];
@@ -264,7 +262,7 @@ var ObjectManager = new Lang.Class({
             return null;
 
         return object[interfaceName];
-    },
+    }
 
     getProxiesForInterface(interfaceName) {
         let proxyList = this._interfaces[interfaceName];
@@ -273,7 +271,7 @@ var ObjectManager = new Lang.Class({
             return [];
 
         return proxyList;
-    },
+    }
 
     getAllProxies() {
         let proxies = [];
@@ -292,5 +290,5 @@ var ObjectManager = new Lang.Class({
 
         return proxies;
     }
-});
+};
 Signals.addSignalMethods(ObjectManager.prototype);
diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
index 51d2ea9cc..b67f9a785 100644
--- a/js/misc/smartcardManager.js
+++ b/js/misc/smartcardManager.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 
@@ -26,9 +25,8 @@ function getSmartcardManager() {
     return _smartcardManager;
 }
 
-var SmartcardManager = new Lang.Class({
-    Name: 'SmartcardManager',
-    _init() {
+var SmartcardManager = class {
+    constructor() {
         this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
                                                                 name: "org.gnome.SettingsDaemon.Smartcard",
                                                                 objectPath: 
'/org/gnome/SettingsDaemon/Smartcard',
@@ -36,7 +34,7 @@ var SmartcardManager = new Lang.Class({
                                                                 onLoaded: this._onLoaded.bind(this) });
         this._insertedTokens = {};
         this._loginToken = null;
-    },
+    }
 
     _onLoaded() {
         let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token');
@@ -53,7 +51,7 @@ var SmartcardManager = new Lang.Class({
             if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
                 this._removeToken(proxy);
         });
-    },
+    }
 
     _updateToken(token) {
         let objectPath = token.get_object_path();
@@ -65,7 +63,7 @@ var SmartcardManager = new Lang.Class({
 
         if (token.UsedToLogin)
             this._loginToken = token;
-    },
+    }
 
     _addToken(token) {
         this._updateToken(token);
@@ -85,7 +83,7 @@ var SmartcardManager = new Lang.Class({
         // Emit a smartcard-inserted at startup if it's already plugged in
         if (token.IsInserted)
             this.emit('smartcard-inserted', token);
-    },
+    }
 
     _removeToken(token) {
         let objectPath = token.get_object_path();
@@ -99,11 +97,11 @@ var SmartcardManager = new Lang.Class({
             this._loginToken = null;
 
         token.disconnectAll();
-    },
+    }
 
     hasInsertedTokens() {
         return Object.keys(this._insertedTokens).length > 0;
-    },
+    }
 
     hasInsertedLoginToken() {
         if (!this._loginToken)
@@ -115,5 +113,5 @@ var SmartcardManager = new Lang.Class({
         return true;
     }
 
-});
+};
 Signals.addSignalMethods(SmartcardManager.prototype);
diff --git a/js/misc/util.js b/js/misc/util.js
index 4e1f5de55..25fe3d02e 100644
--- a/js/misc/util.js
+++ b/js/misc/util.js
@@ -437,10 +437,8 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
                        transition: 'easeOutQuad' });
 }
 
-var AppSettingsMonitor = new Lang.Class({
-    Name: 'AppSettingsMonitor',
-
-    _init(appId, schemaId) {
+var AppSettingsMonitor = class {
+    constructor(appId, schemaId) {
         this._appId = appId;
         this._schemaId = schemaId;
 
@@ -454,23 +452,23 @@ var AppSettingsMonitor = new Lang.Class({
         this._appSystem.connect('installed-changed',
                                 this._onInstalledChanged.bind(this));
         this._onInstalledChanged();
-    },
+    }
 
     get available() {
         return this._app != null && this._settings != null;
-    },
+    }
 
     activateApp() {
         if (this._app)
             this._app.activate();
-    },
+    }
 
     watchSetting(key, callback) {
         let handler = { id: 0, key: key, callback: callback };
         this._handlers.push(handler);
 
         this._connectHandler(handler);
-    },
+    }
 
     _connectHandler(handler) {
         if (!this._settings || handler.id > 0)
@@ -479,13 +477,13 @@ var AppSettingsMonitor = new Lang.Class({
         handler.id = this._settings.connect('changed::' + handler.key,
                                             handler.callback);
         handler.callback(this._settings, handler.key);
-    },
+    }
 
     _disconnectHandler(handler) {
         if (this._settings && handler.id > 0)
             this._settings.disconnect(handler.id);
         handler.id = 0;
-    },
+    }
 
     _onInstalledChanged() {
         let hadApp = (this._app != null);
@@ -499,7 +497,7 @@ var AppSettingsMonitor = new Lang.Class({
             this._checkSettings();
         else
             this._setSettings(null);
-    },
+    }
 
     _setSettings(settings) {
         this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
@@ -512,7 +510,7 @@ var AppSettingsMonitor = new Lang.Class({
 
         if (hadSettings != haveSettings)
             this.emit('available-changed');
-    },
+    }
 
     _checkSettings() {
         let schema = this._schemaSource.lookup(this._schemaId, true);
@@ -525,5 +523,5 @@ var AppSettingsMonitor = new Lang.Class({
             });
         }
     }
-});
+};
 Signals.addSignalMethods(AppSettingsMonitor.prototype);
diff --git a/js/misc/weather.js b/js/misc/weather.js
index 398f1fd52..ce50b2ff4 100644
--- a/js/misc/weather.js
+++ b/js/misc/weather.js
@@ -4,7 +4,6 @@ const Geoclue = imports.gi.Geoclue;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const GWeather = imports.gi.GWeather;
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const PermissionStore = imports.misc.permissionStore;
@@ -13,10 +12,8 @@ const Util = imports.misc.util;
 // Minimum time between updates to show loading indication
 var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
 
-var WeatherClient = new Lang.Class({
-    Name: 'WeatherClient',
-
-    _init() {
+var WeatherClient = class {
+    constructor() {
         this._loading = false;
         this._locationValid = false;
         this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
@@ -71,27 +68,27 @@ var WeatherClient = new Lang.Class({
                                          this._onAutomaticLocationChanged.bind(this));
         this._weatherAppMon.watchSetting('locations',
                                          this._onLocationsChanged.bind(this));
-    },
+    }
 
     get available() {
         return this._weatherAppMon.available;
-    },
+    }
 
     get loading() {
         return this._loading;
-    },
+    }
 
     get hasLocation() {
         return this._locationValid;
-    },
+    }
 
     get info() {
         return this._weatherInfo;
-    },
+    }
 
     activateApp() {
         this._weatherAppMon.activateApp();
-    },
+    }
 
     update() {
         if (!this._locationValid)
@@ -104,13 +101,13 @@ var WeatherClient = new Lang.Class({
             this._weatherInfo.update();
         else
             this._loadInfo();
-    },
+    }
 
     get _useAutoLocation() {
         return this._autoLocationRequested &&
                this._locationSettings.get_boolean('enabled') &&
                this._weatherAuthorized;
-    },
+    }
 
     _loadInfo() {
         let id = this._weatherInfo.connect('updated', () => {
@@ -122,7 +119,7 @@ var WeatherClient = new Lang.Class({
         this.emit('changed');
 
         this._weatherInfo.update();
-    },
+    }
 
     _locationsEqual(loc1, loc2) {
         if (loc1 == loc2)
@@ -132,7 +129,7 @@ var WeatherClient = new Lang.Class({
             return false;
 
         return loc1.equal(loc2);
-    },
+    }
 
     _setLocation(location) {
         if (this._locationsEqual(this._weatherInfo.location, location))
@@ -148,7 +145,7 @@ var WeatherClient = new Lang.Class({
             this._loadInfo();
         else
             this.emit('changed');
-    },
+    }
 
     _updateLocationMonitoring() {
         if (this._useAutoLocation) {
@@ -164,7 +161,7 @@ var WeatherClient = new Lang.Class({
                 this._gclueService.disconnect(this._gclueLocationChangedId);
             this._gclueLocationChangedId = 0;
         }
-    },
+    }
 
     _startGClueService() {
         if (this._gclueStarting)
@@ -185,7 +182,7 @@ var WeatherClient = new Lang.Class({
                 this._gclueService.get_client().distance_threshold = 100;
                 this._updateLocationMonitoring();
             });
-    },
+    }
 
     _onGClueLocationChanged() {
         let geoLocation = this._gclueService.location;
@@ -194,7 +191,7 @@ var WeatherClient = new Lang.Class({
                                                       geoLocation.latitude,
                                                       geoLocation.longitude);
         this._setLocation(location);
-    },
+    }
 
     _onAutomaticLocationChanged(settings, key) {
         let useAutoLocation = settings.get_boolean(key);
@@ -204,7 +201,7 @@ var WeatherClient = new Lang.Class({
         this._autoLocationRequested = useAutoLocation;
 
         this._updateAutoLocation();
-    },
+    }
 
     _updateAutoLocation() {
         this._updateLocationMonitoring();
@@ -213,7 +210,7 @@ var WeatherClient = new Lang.Class({
             this._startGClueService();
         else
             this._setLocation(this._mostRecentLocation);
-    },
+    }
 
     _onLocationsChanged(settings, key) {
         let serialized = settings.get_value(key).deep_unpack().shift();
@@ -229,7 +226,7 @@ var WeatherClient = new Lang.Class({
 
         if (!this._useAutoLocation || !this._gclueStarted)
             this._setLocation(this._mostRecentLocation);
-    },
+    }
 
     _onPermStoreChanged(proxy, sender, params) {
         let [table, id, deleted, data, perms] = params;
@@ -243,5 +240,5 @@ var WeatherClient = new Lang.Class({
 
         this._updateAutoLocation();
     }
-});
+};
 Signals.addSignalMethods(WeatherClient.prototype);
diff --git a/js/ui/accessDialog.js b/js/ui/accessDialog.js
index ca0ff54a5..c6a5a1882 100644
--- a/js/ui/accessDialog.js
+++ b/js/ui/accessDialog.js
@@ -1,7 +1,6 @@
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Pango = imports.gi.Pango;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -21,12 +20,9 @@ var DialogResponse = {
     CLOSED: 2
 };
 
-var AccessDialog = new Lang.Class({
-    Name: 'AccessDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(invocation, handle, title, subtitle, body, options) {
-        this.parent({ styleClass: 'access-dialog' });
+var AccessDialog = class extends ModalDialog.ModalDialog {
+    constructor(invocation, handle, title, subtitle, body, options) {
+        super({ styleClass: 'access-dialog' });
 
         this._invocation = invocation;
         this._handle = handle;
@@ -38,7 +34,7 @@ var AccessDialog = new Lang.Class({
             options[option] = options[option].deep_unpack();
 
         this._buildLayout(title, subtitle, body, options);
-    },
+    }
 
     _buildLayout(title, subtitle, body, options) {
         // No support for non-modal system dialogs, so ignore the option
@@ -78,14 +74,14 @@ var AccessDialog = new Lang.Class({
                          action: () => {
                              this._sendResponse(DialogResponse.OK);
                          }});
-    },
+    }
 
     open() {
-        this.parent();
+        super.open();
 
         let connection = this._invocation.get_connection();
         this._requestExported = this._request.export(connection, this._handle);
-    },
+    }
 
     CloseAsync(invocation, params) {
         if (this._invocation.get_sender() != invocation.get_sender()) {
@@ -96,7 +92,7 @@ var AccessDialog = new Lang.Class({
         }
 
         this._sendResponse(DialogResponse.CLOSED);
-    },
+    }
 
     _sendResponse(response) {
         if (this._requestExported)
@@ -118,12 +114,10 @@ var AccessDialog = new Lang.Class({
         });
         this.close();
     }
-});
-
-var AccessDialogDBus = new Lang.Class({
-    Name: 'AccessDialogDBus',
+};
 
-    _init() {
+var AccessDialogDBus = class {
+    constructor() {
         this._accessDialog = null;
 
         this._windowTracker = Shell.WindowTracker.get_default();
@@ -132,7 +126,7 @@ var AccessDialogDBus = new Lang.Class({
         this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
 
         Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', 
Gio.BusNameOwnerFlags.REPLACE, null, null);
-    },
+    }
 
     AccessDialogAsync(params, invocation) {
         if (this._accessDialog) {
@@ -160,4 +154,4 @@ var AccessDialogDBus = new Lang.Class({
 
         this._accessDialog = dialog;
     }
-});
+};
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index d6d99f270..7544a3d1f 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -411,10 +411,8 @@ var AppSwitcherPopup = new Lang.Class({
     }
 });
 
-var CyclerHighlight = new Lang.Class({
-    Name: 'CyclerHighlight',
-
-    _init() {
+class CyclerHighlight {
+    constructor() {
         this._window = null;
 
         this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() });
@@ -434,7 +432,7 @@ var CyclerHighlight = new Lang.Class({
         this.actor.connect('notify::allocation',
                            this._onAllocationChanged.bind(this));
         this.actor.connect('destroy', this._onDestroy.bind(this));
-    },
+    }
 
     set window(w) {
         if (this._window == w)
@@ -452,7 +450,7 @@ var CyclerHighlight = new Lang.Class({
             windowActor.hide();
 
         this._clone.source = windowActor;
-    },
+    }
 
     _onAllocationChanged() {
         if (!this._window) {
@@ -465,12 +463,12 @@ var CyclerHighlight = new Lang.Class({
             this._highlight.set_position(rect.x - x, rect.y - y);
             this._highlight.show();
         }
-    },
+    }
 
     _onDestroy() {
         this.window = null;
     }
-});
+};
 
 // We don't show an actual popup, so just provide what SwitcherPopup
 // expects instead of inheriting from SwitcherList
diff --git a/js/ui/animation.js b/js/ui/animation.js
index 5b4a10c08..26c9cde46 100644
--- a/js/ui/animation.js
+++ b/js/ui/animation.js
@@ -2,7 +2,6 @@
 
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const St = imports.gi.St;
 const Signals = imports.signals;
@@ -14,10 +13,8 @@ var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
 var SPINNER_ANIMATION_TIME = 0.3;
 var SPINNER_ANIMATION_DELAY = 1.0;
 
-var Animation = new Lang.Class({
-    Name: 'Animation',
-
-    _init(file, width, height, speed) {
+var Animation = class {
+    constructor(file, width, height, speed) {
         this.actor = new St.Bin();
         this.actor.connect('destroy', this._onDestroy.bind(this));
         this._speed = speed;
@@ -31,7 +28,7 @@ var Animation = new Lang.Class({
         this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
                                                                             
this._animationsLoaded.bind(this));
         this.actor.set_child(this._animations);
-    },
+    }
 
     play() {
         if (this._isLoaded && this._timeoutId == 0) {
@@ -43,7 +40,7 @@ var Animation = new Lang.Class({
         }
 
         this._isPlaying = true;
-    },
+    }
 
     stop() {
         if (this._timeoutId > 0) {
@@ -52,7 +49,7 @@ var Animation = new Lang.Class({
         }
 
         this._isPlaying = false;
-    },
+    }
 
     _showFrame(frame) {
         let oldFrameActor = this._animations.get_child_at_index(this._frame);
@@ -64,51 +61,45 @@ var Animation = new Lang.Class({
         let newFrameActor = this._animations.get_child_at_index(this._frame);
         if (newFrameActor)
             newFrameActor.show();
-    },
+    }
 
     _update() {
         this._showFrame(this._frame + 1);
         return GLib.SOURCE_CONTINUE;
-    },
+    }
 
     _animationsLoaded() {
         this._isLoaded = this._animations.get_n_children() > 0;
 
         if (this._isPlaying)
             this.play();
-    },
+    }
 
     _onDestroy() {
         this.stop();
     }
-});
-
-var AnimatedIcon = new Lang.Class({
-    Name: 'AnimatedIcon',
-    Extends: Animation,
+};
 
-    _init(file, size) {
-        this.parent(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
+var AnimatedIcon = class extends Animation {
+    constructor(file, size) {
+        super(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
     }
-});
-
-var Spinner = new Lang.Class({
-    Name: 'Spinner',
-    Extends: AnimatedIcon,
+};
 
-    _init(size, animate=false) {
+var Spinner = class extends AnimatedIcon {
+    constructor(size, animate=false) {
         let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
-        this.parent(file, size);
+        super(file, size);
 
         this.actor.opacity = 0;
         this._animate = animate;
-    },
+    }
 
     play() {
         Tweener.removeTweens(this.actor);
 
         if (this._animate) {
-            this.parent();
+            super.play();
             Tweener.addTween(this.actor, {
                 opacity: 255,
                 delay: SPINNER_ANIMATION_DELAY,
@@ -117,9 +108,9 @@ var Spinner = new Lang.Class({
             });
         } else {
             this.actor.opacity = 255;
-            this.parent();
+            super.play();
         }
-    },
+    }
 
     stop() {
         Tweener.removeTweens(this.actor);
@@ -135,7 +126,7 @@ var Spinner = new Lang.Class({
             });
         } else {
             this.actor.opacity = 0;
-            this.parent();
+            super.stop();
         }
     }
-});
+};
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index c705a0d77..0feb26ff5 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -108,11 +108,11 @@ function clamp(value, min, max) {
     return Math.max(min, Math.min(max, value));
 }
 
-var BaseAppView = new Lang.Class({
-    Name: 'BaseAppView',
-    Abstract: true,
+class BaseAppView {
+    constructor(params, gridParams) {
+        if (new.target === BaseAppView)
+            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 
-    _init(params, gridParams) {
         gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
                                                 columnLimit: MAX_COLUMNS,
                                                 minRows: MIN_ROWS,
@@ -134,26 +134,26 @@ var BaseAppView = new Lang.Class({
 
         this._items = {};
         this._allItems = [];
-    },
+    }
 
     _childFocused(actor) {
         // Nothing by default
-    },
+    }
 
     removeAll() {
         this._grid.destroyAll();
         this._items = {};
         this._allItems = [];
-    },
+    }
 
     _redisplay() {
         this.removeAll();
         this._loadApps();
-    },
+    }
 
     getAllItems() {
         return this._allItems;
-    },
+    }
 
     addItem(icon) {
         let id = icon.id;
@@ -162,24 +162,24 @@ var BaseAppView = new Lang.Class({
 
         this._allItems.push(icon);
         this._items[id] = icon;
-    },
+    }
 
     _compareItems(a, b) {
         return a.name.localeCompare(b.name);
-    },
+    }
 
     loadGrid() {
         this._allItems.sort(this._compareItems);
         this._allItems.forEach(item => { this._grid.addItem(item); });
         this.emit('view-loaded');
-    },
+    }
 
     _selectAppInternal(id) {
         if (this._items[id])
             this._items[id].actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
         else
             log('No such application ' + id);
-    },
+    }
 
     selectApp(id) {
         if (this._items[id] && this._items[id].actor.mapped) {
@@ -200,13 +200,13 @@ var BaseAppView = new Lang.Class({
                 this.selectApp(id);
             });
         }
-    },
+    }
 
     _doSpringAnimation(animationDirection) {
         this._grid.opacity = 255;
         this._grid.animateSpring(animationDirection,
                                  Main.overview.getShowAppsButton());
-    },
+    }
 
     animate(animationDirection, onComplete) {
         if (onComplete) {
@@ -224,7 +224,7 @@ var BaseAppView = new Lang.Class({
         } else {
             this._doSpringAnimation(animationDirection);
         }
-    },
+    }
 
     animateSwitch(animationDirection) {
         Tweener.removeTweens(this.actor);
@@ -244,7 +244,7 @@ var BaseAppView = new Lang.Class({
 
         Tweener.addTween(this._grid, params);
     }
-});
+};
 Signals.addSignalMethods(BaseAppView.prototype);
 
 var PageIndicatorsActor = new Lang.Class({
@@ -271,10 +271,8 @@ var PageIndicatorsActor = new Lang.Class({
     }
 });
 
-var PageIndicators = new Lang.Class({
-    Name:'PageIndicators',
-
-    _init() {
+class PageIndicators {
+    constructor() {
         this.actor = new PageIndicatorsActor();
         this._nPages = 0;
         this._currentPage = undefined;
@@ -282,7 +280,7 @@ var PageIndicators = new Lang.Class({
         this.actor.connect('notify::mapped', () => {
             this.animateIndicators(IconGrid.AnimationDirection.IN);
         });
-    },
+    }
 
     setNPages(nPages) {
         if (this._nPages == nPages)
@@ -311,7 +309,7 @@ var PageIndicators = new Lang.Class({
         }
         this._nPages = nPages;
         this.actor.visible = (this._nPages > 1);
-    },
+    }
 
     setCurrentPage(currentPage) {
         this._currentPage = currentPage;
@@ -319,7 +317,7 @@ var PageIndicators = new Lang.Class({
         let children = this.actor.get_children();
         for (let i = 0; i < children.length; i++)
             children[i].set_checked(i == this._currentPage);
-    },
+    }
 
     animateIndicators(animationDirection) {
         if (!this.actor.mapped)
@@ -358,15 +356,12 @@ var PageIndicators = new Lang.Class({
                              });
         }
     }
-});
+};
 Signals.addSignalMethods(PageIndicators.prototype);
 
-var AllView = new Lang.Class({
-    Name: 'AllView',
-    Extends: BaseAppView,
-
-    _init() {
-        this.parent({ usePagination: true }, null);
+var AllView = class AllView extends BaseAppView {
+    constructor() {
+        super({ usePagination: true }, null);
         this._scrollView = new St.ScrollView({ style_class: 'all-apps',
                                                x_expand: true,
                                                y_expand: true,
@@ -462,12 +457,12 @@ var AllView = new Lang.Class({
         this._folderSettings.connect('changed::folder-children', () => {
             Main.queueDeferredWork(this._redisplayWorkId);
         });
-    },
+    }
 
     removeAll() {
         this.folderIcons = [];
-        this.parent();
-    },
+        super.removeAll();
+    }
 
     _itemNameChanged(item) {
         // If an item's name changed, we can pluck it out of where it's
@@ -478,7 +473,7 @@ var AllView = new Lang.Class({
 
         this._grid.removeItem(item);
         this._grid.addItem(item, newIdx);
-    },
+    }
 
     _refilterApps() {
         this._allItems.forEach(icon => {
@@ -493,7 +488,7 @@ var AllView = new Lang.Class({
                 appIcon.actor.visible = false;
             });
         });
-    },
+    }
 
     _loadApps() {
         let apps = Gio.AppInfo.get_all().filter(appInfo => {
@@ -535,7 +530,7 @@ var AllView = new Lang.Class({
 
         this.loadGrid();
         this._refilterApps();
-    },
+    }
 
     // Overriden from BaseAppView
     animate(animationDirection, onComplete) {
@@ -551,21 +546,17 @@ var AllView = new Lang.Class({
             this._currentPopup.popdown();
             let spaceClosedId = this._grid.connect('space-closed', () => {
                 this._grid.disconnect(spaceClosedId);
-                // Given that we can't call this.parent() inside the
-                // signal handler, call again animate which will
-                // call the parent given that popup is already
-                // closed.
-                this.animate(animationDirection, completionFunc);
+                super.animate(animationDirection, completionFunc);
             });
         } else {
-            this.parent(animationDirection, completionFunc);
+            super.animate(animationDirection, completionFunc);
             if (animationDirection == IconGrid.AnimationDirection.OUT)
                 this._pageIndicators.animateIndicators(animationDirection);
         }
-    },
+    }
 
     animateSwitch(animationDirection) {
-        this.parent(animationDirection);
+        super.animateSwitch(animationDirection);
 
         if (this._currentPopup && this._displayingPopup &&
             animationDirection == IconGrid.AnimationDirection.OUT)
@@ -579,11 +570,11 @@ var AllView = new Lang.Class({
 
         if (animationDirection == IconGrid.AnimationDirection.OUT)
             this._pageIndicators.animateIndicators(animationDirection);
-    },
+    }
 
     getCurrentPageY() {
         return this._grid.getPageY(this._grid.currentPage);
-    },
+    }
 
     goToPage(pageNumber) {
         pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
@@ -625,18 +616,18 @@ var AllView = new Lang.Class({
                            time: time,
                            transition: 'easeOutQuad' });
         this._pageIndicators.setCurrentPage(pageNumber);
-    },
+    }
 
     _diffToPage(pageNumber) {
         let currentScrollPosition = this._adjustment.value;
         return Math.abs(currentScrollPosition - this._grid.getPageY(pageNumber));
-    },
+    }
 
     openSpaceForPopup(item, side, nRows) {
         this._updateIconOpacities(true);
         this._displayingPopup = true;
         this._grid.openExtraSpace(item, side, nRows);
-    },
+    }
 
     _closeSpaceForPopup() {
         this._updateIconOpacities(false);
@@ -646,7 +637,7 @@ var AllView = new Lang.Class({
             fadeEffect.enabled = true;
 
         this._grid.closeExtraSpace();
-    },
+    }
 
     _onScroll(actor, event) {
         if (this._displayingPopup || !this._scrollView.reactive)
@@ -659,7 +650,7 @@ var AllView = new Lang.Class({
             this.goToPage(this._grid.currentPage + 1);
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onPan(action) {
         if (this._displayingPopup)
@@ -670,7 +661,7 @@ var AllView = new Lang.Class({
         let adjustment = this._adjustment;
         adjustment.value -= (dy / this._scrollView.height) * adjustment.page_size;
         return false;
-    },
+    }
 
     _onPanEnd(action) {
          if (this._displayingPopup)
@@ -689,7 +680,7 @@ var AllView = new Lang.Class({
         this.goToPage(closestPage);
 
         this._panning = false;
-    },
+    }
 
     _onKeyPressEvent(actor, event) {
         if (this._displayingPopup)
@@ -704,7 +695,7 @@ var AllView = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     addFolderPopup(popup) {
         this._stack.add_actor(popup.actor);
@@ -715,12 +706,12 @@ var AllView = new Lang.Class({
             if(!isOpen)
                 this._closeSpaceForPopup();
         });
-    },
+    }
 
     _childFocused(icon) {
         let itemPage = this._grid.getItemPage(icon);
         this.goToPage(itemPage);
-    },
+    }
 
     _updateIconOpacities(folderOpen) {
         for (let id in this._items) {
@@ -734,7 +725,7 @@ var AllView = new Lang.Class({
                        transition: 'easeOutQuad' };
             Tweener.addTween(this._items[id].actor, params);
         }
-    },
+    }
 
     // Called before allocation to calculate dynamic spacing
     adaptToSize(width, height) {
@@ -773,15 +764,12 @@ var AllView = new Lang.Class({
         for (let i = 0; i < this.folderIcons.length; i++)
             this.folderIcons[i].adaptToSize(availWidth, availHeight);
     }
-});
+};
 Signals.addSignalMethods(AllView.prototype);
 
-var FrequentView = new Lang.Class({
-    Name: 'FrequentView',
-    Extends: BaseAppView,
-
-    _init() {
-        this.parent(null, { fillParent: true });
+var FrequentView = class FrequentView extends BaseAppView {
+    constructor() {
+        super(null, { fillParent: true });
 
         this.actor = new St.Widget({ style_class: 'frequent-apps',
                                      layout_manager: new Clutter.BinLayout(),
@@ -806,11 +794,11 @@ var FrequentView = new Lang.Class({
             if (this.actor.mapped)
                 this._redisplay();
         });
-    },
+    }
 
     hasUsefulData() {
         return this._usage.get_most_used().length >= MIN_FREQUENT_APPS_COUNT;
-    },
+    }
 
     _loadApps() {
         let mostUsed = this._usage.get_most_used();
@@ -834,7 +822,7 @@ var FrequentView = new Lang.Class({
                                       { isDraggable: favoritesWritable });
             this._grid.addItem(appIcon, -1);
         }
-    },
+    }
 
     // Called before allocation to calculate dynamic spacing
     adaptToSize(width, height) {
@@ -848,7 +836,7 @@ var FrequentView = new Lang.Class({
         let availHeight = box.y2 - box.y1;
         this._grid.adaptToSize(availWidth, availHeight);
     }
-});
+};
 
 var Views = {
     FREQUENT: 0,
@@ -896,10 +884,8 @@ var ViewStackLayout = new Lang.Class({
     }
 });
 
-var AppDisplay = new Lang.Class({
-    Name: 'AppDisplay',
-
-    _init() {
+var AppDisplay = class AppDisplay {
+    constructor() {
         this._privacySettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.privacy' });
         this._privacySettings.connect('changed::remember-app-usage',
                                       this._updateFrequentVisibility.bind(this));
@@ -972,14 +958,14 @@ var AppDisplay = new Lang.Class({
                                        this._switcherooProxy = null;
                                        this._updateDiscreteGpuAvailable();
                                    });
-    },
+    }
 
     _updateDiscreteGpuAvailable() {
         if (!this._switcherooProxy)
             discreteGpuAvailable = false;
         else
             discreteGpuAvailable = this._switcherooProxy.HasDualGpu;
-    },
+    }
 
     _switcherooProxyAppeared() {
         this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, 
SWITCHEROO_OBJECT_PATH,
@@ -990,7 +976,7 @@ var AppDisplay = new Lang.Class({
                 }
                 this._updateDiscreteGpuAvailable();
             });
-    },
+    }
 
     animate(animationDirection, onComplete) {
         let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
@@ -1013,7 +999,7 @@ var AppDisplay = new Lang.Class({
                           });
 
         currentView.animate(animationDirection, onComplete);
-    },
+    }
 
     _showView(activeIndex) {
         for (let i = 0; i < this._views.length; i++) {
@@ -1026,7 +1012,7 @@ var AppDisplay = new Lang.Class({
                                                         IconGrid.AnimationDirection.OUT;
             this._views[i].view.animateSwitch(animationDirection);
         }
-    },
+    }
 
     _updateFrequentVisibility() {
         let enabled = this._privacySettings.get_boolean('remember-app-usage');
@@ -1037,12 +1023,12 @@ var AppDisplay = new Lang.Class({
 
         if (!enabled && this._views[Views.FREQUENT].view.actor.visible)
             this._showView(Views.ALL);
-    },
+    }
 
     selectApp(id) {
         this._showView(Views.ALL);
         this._views[Views.ALL].view.selectApp(id);
-    },
+    }
 
     _onAllocatedSizeChanged(actor, width, height) {
         let box = new Clutter.ActorBox();
@@ -1055,19 +1041,17 @@ var AppDisplay = new Lang.Class({
         for (let i = 0; i < this._views.length; i++)
             this._views[i].view.adaptToSize(availWidth, availHeight);
     }
-})
-
-var AppSearchProvider = new Lang.Class({
-    Name: 'AppSearchProvider',
+};
 
-    _init() {
+var AppSearchProvider = class AppSearchProvider {
+    constructor() {
         this._appSys = Shell.AppSystem.get_default();
         this.id = 'applications';
         this.isRemoteProvider = false;
         this.canLaunchSearch = false;
 
         this._systemActions = new SystemActions.getDefault();
-    },
+    }
 
     getResultMetas(apps, callback) {
         let metas = [];
@@ -1095,11 +1079,11 @@ var AppSearchProvider = new Lang.Class({
         }
 
         callback(metas);
-    },
+    }
 
     filterResults(results, maxNumber) {
         return results.slice(0, maxNumber);
-    },
+    }
 
     getInitialResultSet(terms, callback, cancellable) {
         let query = terms.join(' ');
@@ -1119,11 +1103,11 @@ var AppSearchProvider = new Lang.Class({
         results = results.concat(this._systemActions.getMatchingActions(terms));
 
         callback(results);
-    },
+    }
 
     getSubsearchResultSet(previousResults, terms, callback, cancellable) {
         this.getInitialResultSet(terms, callback, cancellable);
-    },
+    }
 
     createResultObject(resultMeta) {
         if (resultMeta.id.endsWith('.desktop'))
@@ -1131,14 +1115,11 @@ var AppSearchProvider = new Lang.Class({
         else
             return new SystemActionIcon(this, resultMeta);
     }
-});
-
-var FolderView = new Lang.Class({
-    Name: 'FolderView',
-    Extends: BaseAppView,
+};
 
-    _init() {
-        this.parent(null, null);
+var FolderView = class FolderView extends BaseAppView {
+    constructor() {
+        super(null, null);
         // If it not expand, the parent doesn't take into account its preferred_width when allocating
         // the second time it allocates, so we apply the "Standard hack for ClutterBinLayout"
         this._grid.x_expand = true;
@@ -1152,16 +1133,16 @@ var FolderView = new Lang.Class({
         let action = new Clutter.PanAction({ interpolate: true });
         action.connect('pan', this._onPan.bind(this));
         this.actor.add_action(action);
-    },
+    }
 
     _childFocused(actor) {
         Util.ensureActorVisibleInScrollView(this.actor, actor);
-    },
+    }
 
     // Overriden from BaseAppView
     animate(animationDirection) {
         this._grid.animatePulse(animationDirection);
-    },
+    }
 
     createFolderIcon(size) {
         let layout = new Clutter.GridLayout();
@@ -1181,14 +1162,14 @@ var FolderView = new Lang.Class({
         }
 
         return icon;
-    },
+    }
 
     _onPan(action) {
         let [dist, dx, dy] = action.get_motion_delta(0);
         let adjustment = this.actor.vscroll.adjustment;
         adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
         return false;
-    },
+    }
 
     adaptToSize(width, height) {
         this._parentAvailableWidth = width;
@@ -1212,7 +1193,7 @@ var FolderView = new Lang.Class({
 
         this.actor.set_width(this.usedWidth());
         this.actor.set_height(this.usedHeight());
-    },
+    }
 
     _getPageAvailableSize() {
         let pageBox = new Clutter.ActorBox();
@@ -1224,32 +1205,30 @@ var FolderView = new Lang.Class({
         // We only can show icons inside the collection view boxPointer
         // so we have to substract the required padding etc of the boxpointer
         return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - 
contentBox.y1) - 2 * this._offsetForEachSide];
-    },
+    }
 
     usedWidth() {
         let [availWidthPerPage, availHeightPerPage] = this._getPageAvailableSize();
         return this._grid.usedWidth(availWidthPerPage);
-    },
+    }
 
     usedHeight() {
         return this._grid.usedHeightForNRows(this.nRowsDisplayedAtOnce());
-    },
+    }
 
     nRowsDisplayedAtOnce() {
         let [availWidthPerPage, availHeightPerPage] = this._getPageAvailableSize();
         let maxRows = this._grid.rowsForHeight(availHeightPerPage) - 1;
         return Math.min(this._grid.nRows(availWidthPerPage), maxRows);
-    },
+    }
 
     setPaddingOffsets(offset) {
         this._offsetForEachSide = offset;
     }
-});
-
-var FolderIcon = new Lang.Class({
-    Name: 'FolderIcon',
+};
 
-    _init(id, path, parentView) {
+var FolderIcon = class FolderIcon {
+    constructor(id, path, parentView) {
         this.id = id;
         this.name = '';
         this._parentView = parentView;
@@ -1284,11 +1263,11 @@ var FolderIcon = new Lang.Class({
 
         this._folder.connect('changed', this._redisplay.bind(this));
         this._redisplay();
-    },
+    }
 
     getAppIds() {
         return this.view.getAllItems().map(item => item.id);
-    },
+    }
 
     _updateName() {
         let name = _getFolderName(this._folder);
@@ -1298,7 +1277,7 @@ var FolderIcon = new Lang.Class({
         this.name = name;
         this.icon.label.text = this.name;
         this.emit('name-changed');
-    },
+    }
 
     _redisplay() {
         this._updateName();
@@ -1340,16 +1319,16 @@ var FolderIcon = new Lang.Class({
         this.actor.visible = this.view.getAllItems().length > 0;
         this.view.loadGrid();
         this.emit('apps-changed');
-    },
+    }
 
     _createIcon(iconSize) {
         return this.view.createFolderIcon(iconSize, this);
-    },
+    }
 
     _popupHeight() {
         let usedHeight = this.view.usedHeight() + this._popup.getOffset(St.Side.TOP) + 
this._popup.getOffset(St.Side.BOTTOM);
         return usedHeight;
-    },
+    }
 
     _openSpaceForPopup() {
         let id = this._parentView.connect('space-ready', () => {
@@ -1358,14 +1337,14 @@ var FolderIcon = new Lang.Class({
             this._updatePopupPosition();
         });
         this._parentView.openSpaceForPopup(this, this._boxPointerArrowside, 
this.view.nRowsDisplayedAtOnce());
-    },
+    }
 
     _calculateBoxPointerArrowSide() {
         let spaceTop = this.actor.y - this._parentView.getCurrentPageY();
         let spaceBottom = this._parentView.actor.height - (spaceTop + this.actor.height);
 
         return spaceTop > spaceBottom ? St.Side.BOTTOM : St.Side.TOP;
-    },
+    }
 
     _updatePopupSize() {
         // StWidget delays style calculation until needed, make sure we use the correct values
@@ -1377,7 +1356,7 @@ var FolderIcon = new Lang.Class({
         // Add extra padding to prevent boxpointer decorations and close button being cut off
         this.view.setPaddingOffsets(offsetForEachSide);
         this.view.adaptToSize(this._parentAvailableWidth, this._parentAvailableHeight);
-    },
+    }
 
     _updatePopupPosition() {
         if (!this._popup)
@@ -1387,7 +1366,7 @@ var FolderIcon = new Lang.Class({
             this._popup.actor.y = this.actor.allocation.y1 + this.actor.translation_y - this._popupHeight();
         else
             this._popup.actor.y = this.actor.allocation.y1 + this.actor.translation_y + this.actor.height;
-    },
+    }
 
     _ensurePopup() {
         if (this._popup && !this._popupInvalidated)
@@ -1406,7 +1385,7 @@ var FolderIcon = new Lang.Class({
         this._updatePopupSize();
         this._updatePopupPosition();
         this._popupInvalidated = false;
-    },
+    }
 
     adaptToSize(width, height) {
         this._parentAvailableWidth = width;
@@ -1414,14 +1393,12 @@ var FolderIcon = new Lang.Class({
         if(this._popup)
             this.view.adaptToSize(width, height);
         this._popupInvalidated = true;
-    },
-});
+    }
+};
 Signals.addSignalMethods(FolderIcon.prototype);
 
-var AppFolderPopup = new Lang.Class({
-    Name: 'AppFolderPopup',
-
-    _init(source, side) {
+var AppFolderPopup = class AppFolderPopup {
+    constructor(source, side) {
         this._source = source;
         this._view = source.view;
         this._arrowSide = side;
@@ -1467,7 +1444,7 @@ var AppFolderPopup = new Lang.Class({
         });
         this._grabHelper.addActor(Main.layoutManager.overviewGroup);
         this.actor.connect('key-press-event', this._onKeyPress.bind(this));
-    },
+    }
 
     _onKeyPress(actor, event) {
         if (global.stage.get_key_focus() != actor)
@@ -1511,14 +1488,14 @@ var AppFolderPopup = new Lang.Class({
                 return Clutter.EVENT_PROPAGATE;
         }
         return actor.navigate_focus(null, direction, false);
-    },
+    }
 
     toggle() {
         if (this._isOpen)
             this.popdown();
         else
             this.popup();
-    },
+    }
 
     popup() {
         if (this._isOpen)
@@ -1545,7 +1522,7 @@ var AppFolderPopup = new Lang.Class({
             });
 
         this.emit('open-state-changed', true);
-    },
+    }
 
     popdown() {
         if (!this._isOpen)
@@ -1557,30 +1534,28 @@ var AppFolderPopup = new Lang.Class({
                                BoxPointer.PopupAnimation.SLIDE);
         this._isOpen = false;
         this.emit('open-state-changed', false);
-    },
+    }
 
     getCloseButtonOverlap() {
         return this.closeButton.get_theme_node().get_length('-shell-close-overlap-y');
-    },
+    }
 
     getOffset(side) {
         let offset = this._boxPointer.getPadding(side);
         if (this._arrowSide == side)
             offset += this._boxPointer.getArrowHeight();
         return offset;
-    },
+    }
 
     updateArrowSide(side) {
         this._arrowSide = side;
         this._boxPointer.updateArrowSide(side);
     }
-});
+};
 Signals.addSignalMethods(AppFolderPopup.prototype);
 
-var AppIcon = new Lang.Class({
-    Name: 'AppIcon',
-
-    _init(app, iconParams) {
+var AppIcon = class AppIcon {
+    constructor(app, iconParams) {
         this.app = app;
         this.id = app.get_id();
         this.name = app.get_name();
@@ -1651,32 +1626,32 @@ var AppIcon = new Lang.Class({
             this._updateRunningStyle();
         });
         this._updateRunningStyle();
-    },
+    }
 
     _onDestroy() {
         if (this._stateChangedId > 0)
             this.app.disconnect(this._stateChangedId);
         this._stateChangedId = 0;
         this._removeMenuTimeout();
-    },
+    }
 
     _createIcon(iconSize) {
         return this.app.create_icon_texture(iconSize);
-    },
+    }
 
     _removeMenuTimeout() {
         if (this._menuTimeoutId > 0) {
             Mainloop.source_remove(this._menuTimeoutId);
             this._menuTimeoutId = 0;
         }
-    },
+    }
 
     _updateRunningStyle() {
         if (this.app.state != Shell.AppState.STOPPED)
             this._dot.show();
         else
             this._dot.hide();
-    },
+    }
 
     _setPopupTimeout() {
         this._removeMenuTimeout();
@@ -1686,12 +1661,12 @@ var AppIcon = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
         GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
-    },
+    }
 
     _onLeaveEvent(actor, event) {
         this.actor.fake_release();
         this._removeMenuTimeout();
-    },
+    }
 
     _onButtonPress(actor, event) {
         let button = event.get_button();
@@ -1702,28 +1677,28 @@ var AppIcon = new Lang.Class({
             return Clutter.EVENT_STOP;
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onTouchEvent(actor, event) {
         if (event.type() == Clutter.EventType.TOUCH_BEGIN)
             this._setPopupTimeout();
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onClicked(actor, button) {
         this._removeMenuTimeout();
         this.activate(button);
-    },
+    }
 
     _onKeyboardPopupMenu() {
         this.popupMenu();
         this._menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
-    },
+    }
 
     getId() {
         return this.app.get_id();
-    },
+    }
 
     popupMenu() {
         this._removeMenuTimeout();
@@ -1759,7 +1734,7 @@ var AppIcon = new Lang.Class({
         this.emit('sync-tooltip');
 
         return false;
-    },
+    }
 
     activateWindow(metaWindow) {
         if (metaWindow) {
@@ -1767,12 +1742,12 @@ var AppIcon = new Lang.Class({
         } else {
             Main.overview.hide();
         }
-    },
+    }
 
     _onMenuPoppedDown() {
         this.actor.sync_hover();
         this.emit('menu-state-changed', false);
-    },
+    }
 
     activate(button) {
         let event = Clutter.get_current_event();
@@ -1792,45 +1767,42 @@ var AppIcon = new Lang.Class({
             this.app.activate();
 
         Main.overview.hide();
-    },
+    }
 
     animateLaunch() {
         this.icon.animateZoomOut();
-    },
+    }
 
     shellWorkspaceLaunch(params) {
         params = Params.parse(params, { workspace: -1,
                                         timestamp: 0 });
 
         this.app.open_new_window(params.workspace);
-    },
+    }
 
     getDragActor() {
         return this.app.create_icon_texture(Main.overview.dashIconSize);
-    },
+    }
 
     // Returns the original actor that should align with the actor
     // we show as the item is being dragged.
     getDragActorSource() {
         return this.icon.icon;
-    },
+    }
 
     shouldShowTooltip() {
         return this.actor.hover && (!this._menu || !this._menu.isOpen);
-    },
-});
+    }
+};
 Signals.addSignalMethods(AppIcon.prototype);
 
-var AppIconMenu = new Lang.Class({
-    Name: 'AppIconMenu',
-    Extends: PopupMenu.PopupMenu,
-
-    _init(source) {
+var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
+    constructor(source) {
         let side = St.Side.LEFT;
         if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
             side = St.Side.RIGHT;
 
-        this.parent(source.actor, 0.5, side);
+        super(source.actor, 0.5, side);
 
         // We want to keep the item hovered while the menu is up
         this.blockSourceEvents = true;
@@ -1850,7 +1822,7 @@ var AppIconMenu = new Lang.Class({
         });
 
         Main.uiGroup.add_actor(this.actor);
-    },
+    }
 
     _redisplay() {
         this.removeAll();
@@ -1960,33 +1932,30 @@ var AppIconMenu = new Lang.Class({
                 });
             }
         }
-    },
+    }
 
     _appendSeparator() {
         let separator = new PopupMenu.PopupSeparatorMenuItem();
         this.addMenuItem(separator);
-    },
+    }
 
     _appendMenuItem(labelText) {
         // FIXME: app-well-menu-item style
         let item = new PopupMenu.PopupMenuItem(labelText);
         this.addMenuItem(item);
         return item;
-    },
+    }
 
     popup(activatingButton) {
         this._redisplay();
         this.open();
     }
-});
+};
 Signals.addSignalMethods(AppIconMenu.prototype);
 
-var SystemActionIcon = new Lang.Class({
-    Name: 'SystemActionIcon',
-    Extends: Search.GridSearchResult,
-
+var SystemActionIcon = class SystemActionIcon extends Search.GridSearchResult {
     activate() {
         SystemActions.getDefault().activateAction(this.metaInfo['id']);
         Main.overview.hide();
     }
-});
+};
diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
index 3bdf04efb..0bdf41b22 100644
--- a/js/ui/appFavorites.js
+++ b/js/ui/appFavorites.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Shell = imports.gi.Shell;
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const Main = imports.ui.main;
@@ -49,21 +48,18 @@ const RENAMED_DESKTOP_IDS = {
     'evince.desktop': 'org.gnome.Evince.desktop',
 };
 
-var AppFavorites = new Lang.Class({
-    Name: 'AppFavorites',
-
-    FAVORITE_APPS_KEY: 'favorite-apps',
-
-    _init() {
+class AppFavorites {
+    constructor() {
+        this.FAVORITE_APPS_KEY = 'favorite-apps';
         this._favorites = {};
         global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this));
         this.reload();
-    },
+    }
 
     _onFavsChanged() {
         this.reload();
         this.emit('changed');
-    },
+    }
 
     reload() {
         let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
@@ -91,29 +87,29 @@ var AppFavorites = new Lang.Class({
             let app = apps[i];
             this._favorites[app.get_id()] = app;
         }
-    },
+    }
 
     _getIds() {
         let ret = [];
         for (let id in this._favorites)
             ret.push(id);
         return ret;
-    },
+    }
 
     getFavoriteMap() {
         return this._favorites;
-    },
+    }
 
     getFavorites() {
         let ret = [];
         for (let id in this._favorites)
             ret.push(this._favorites[id]);
         return ret;
-    },
+    }
 
     isFavorite(appId) {
         return appId in this._favorites;
-    },
+    }
 
     _addFavorite(appId, pos) {
         if (appId in this._favorites)
@@ -131,7 +127,7 @@ var AppFavorites = new Lang.Class({
             ids.splice(pos, 0, appId);
         global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
         return true;
-    },
+    }
 
     addFavoriteAtPos(appId, pos) {
         if (!this._addFavorite(appId, pos))
@@ -145,16 +141,16 @@ var AppFavorites = new Lang.Class({
                                        this._removeFavorite(appId);
                                    }
                                  });
-    },
+    }
 
     addFavorite(appId) {
         this.addFavoriteAtPos(appId, -1);
-    },
+    }
 
     moveFavoriteToPos(appId, pos) {
         this._removeFavorite(appId);
         this._addFavorite(appId, pos);
-    },
+    }
 
     _removeFavorite(appId) {
         if (!appId in this._favorites)
@@ -163,7 +159,7 @@ var AppFavorites = new Lang.Class({
         let ids = this._getIds().filter(id => id != appId);
         global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
         return true;
-    },
+    }
 
     removeFavorite(appId) {
         let ids = this._getIds();
@@ -180,7 +176,7 @@ var AppFavorites = new Lang.Class({
                                    }
                                  });
     }
-});
+};
 Signals.addSignalMethods(AppFavorites.prototype);
 
 var appFavoritesInstance = null;
diff --git a/js/ui/audioDeviceSelection.js b/js/ui/audioDeviceSelection.js
index b44a3e7ac..b10eb7d3e 100644
--- a/js/ui/audioDeviceSelection.js
+++ b/js/ui/audioDeviceSelection.js
@@ -1,7 +1,6 @@
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -19,12 +18,10 @@ var AudioDevice = {
 
 const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
 
-var AudioDeviceSelectionDialog = new Lang.Class({
-    Name: 'AudioDeviceSelectionDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(devices) {
-        this.parent({ styleClass: 'audio-device-selection-dialog' });
+var AudioDeviceSelectionDialog =
+class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
+    constructor(devices) {
+        super({ styleClass: 'audio-device-selection-dialog' });
 
         this._deviceItems = {};
 
@@ -39,11 +36,11 @@ var AudioDeviceSelectionDialog = new Lang.Class({
 
         if (this._selectionBox.get_n_children() < 2)
             throw new Error('Too few devices for a selection');
-    },
+    }
 
     destroy() {
-        this.parent();
-    },
+        super.destroy();
+    }
 
     _buildLayout(devices) {
         let title = new St.Label({ style_class: 'audio-selection-title',
@@ -62,7 +59,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
         this.addButton({ action: this.close.bind(this),
                          label: _("Cancel"),
                          key: Clutter.Escape });
-    },
+    }
 
     _getDeviceLabel(device) {
         switch(device) {
@@ -75,7 +72,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
             default:
                 return null;
         }
-    },
+    }
 
     _getDeviceIcon(device) {
         switch(device) {
@@ -88,7 +85,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
             default:
                 return null;
         }
-    },
+    }
 
     _addDevice(device) {
         let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
@@ -118,7 +115,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
             this.close();
             Main.overview.hide();
         });
-    },
+    }
 
     _openSettings() {
         let desktopFile = 'gnome-sound-panel.desktop'
@@ -133,23 +130,21 @@ var AudioDeviceSelectionDialog = new Lang.Class({
         Main.overview.hide();
         app.activate();
     }
-});
-
-var AudioDeviceSelectionDBus = new Lang.Class({
-    Name: 'AudioDeviceSelectionDBus',
+};
 
-    _init() {
+var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
+    constructor() {
         this._audioSelectionDialog = null;
 
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
 
         Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, 
null, null);
-    },
+    }
 
     _onDialogClosed() {
         this._audioSelectionDialog = null;
-    },
+    }
 
     _onDeviceSelected(dialog, device) {
         let connection = this._dbusImpl.get_connection();
@@ -162,7 +157,7 @@ var AudioDeviceSelectionDBus = new Lang.Class({
                                info ? info.name : null,
                                'DeviceSelected',
                                GLib.Variant.new('(s)', [deviceName]));
-    },
+    }
 
     OpenAsync(params, invocation) {
         if (this._audioSelectionDialog) {
@@ -190,7 +185,7 @@ var AudioDeviceSelectionDBus = new Lang.Class({
 
         this._audioSelectionDialog = dialog;
         invocation.return_value(null);
-    },
+    }
 
     CloseAsync(params, invocation) {
         if (this._audioSelectionDialog &&
@@ -199,4 +194,4 @@ var AudioDeviceSelectionDBus = new Lang.Class({
 
         invocation.return_value(null);
     }
-});
+};
diff --git a/js/ui/background.js b/js/ui/background.js
index 941b28903..874bda390 100644
--- a/js/ui/background.js
+++ b/js/ui/background.js
@@ -98,7 +98,6 @@ const GDesktopEnums = imports.gi.GDesktopEnums;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const GnomeDesktop = imports.gi.GnomeDesktop;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Signals = imports.signals;
 
@@ -138,14 +137,12 @@ function _fileEqual0(file1, file2) {
     return file1.equal(file2);
 }
 
-var BackgroundCache = new Lang.Class({
-    Name: 'BackgroundCache',
-
-    _init() {
+var BackgroundCache = class BackgroundCache {
+    constructor() {
         this._fileMonitors = {};
         this._backgroundSources = {};
         this._animations = {};
-    },
+    }
 
     monitorFile(file) {
         let key = file.hash();
@@ -163,7 +160,7 @@ var BackgroundCache = new Lang.Class({
                         });
 
         this._fileMonitors[key] = monitor;
-    },
+    }
 
     getAnimation(params) {
         params = Params.parse(params, { file: null,
@@ -195,7 +192,7 @@ var BackgroundCache = new Lang.Class({
                 GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
             }
         });
-    },
+    }
 
     getBackgroundSource(layoutManager, settingsSchema) {
         // The layoutManager is always the same one; we pass in it since
@@ -209,7 +206,7 @@ var BackgroundCache = new Lang.Class({
         }
 
         return this._backgroundSources[settingsSchema];
-    },
+    }
 
     releaseBackgroundSource(settingsSchema) {
         if (settingsSchema in this._backgroundSources) {
@@ -221,7 +218,7 @@ var BackgroundCache = new Lang.Class({
             }
         }
     }
-});
+};
 Signals.addSignalMethods(BackgroundCache.prototype);
 
 function getBackgroundCache() {
@@ -230,10 +227,8 @@ function getBackgroundCache() {
     return _backgroundCache;
 }
 
-var Background = new Lang.Class({
-    Name: 'Background',
-
-    _init(params) {
+var Background = class Background {
+    constructor(params) {
         params = Params.parse(params, { monitorIndex: 0,
                                         layoutManager: Main.layoutManager,
                                         settings: null,
@@ -272,7 +267,7 @@ var Background = new Lang.Class({
         });
 
         this._load();
-    },
+    }
 
     destroy() {
         this._cancellable.cancel();
@@ -298,12 +293,12 @@ var Background = new Lang.Class({
         if (this._settingsChangedSignalId != 0)
             this._settings.disconnect(this._settingsChangedSignalId);
         this._settingsChangedSignalId = 0;
-    },
+    }
 
     updateResolution() {
         if (this._animation)
             this._refreshAnimation();
-    },
+    }
 
     _refreshAnimation() {
         if (!this._animation)
@@ -311,7 +306,7 @@ var Background = new Lang.Class({
 
         this._removeAnimationTimeout();
         this._updateAnimation();
-    },
+    }
 
     _setLoaded() {
         if (this.isLoaded)
@@ -324,7 +319,7 @@ var Background = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
         GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit');
-    },
+    }
 
     _loadPattern() {
         let colorString, res, color, secondColor;
@@ -340,7 +335,7 @@ var Background = new Lang.Class({
             this.background.set_color(color);
         else
             this.background.set_gradient(shadingType, color, secondColor);
-    },
+    }
 
     _watchFile(file) {
         let key = file.hash();
@@ -357,14 +352,14 @@ var Background = new Lang.Class({
                                                }
                                            });
         this._fileWatches[key] = signalId;
-    },
+    }
 
     _removeAnimationTimeout() {
         if (this._updateAnimationTimeoutId) {
             GLib.source_remove(this._updateAnimationTimeoutId);
             this._updateAnimationTimeoutId = 0;
         }
-    },
+    }
 
     _updateAnimation() {
         this._updateAnimationTimeoutId = 0;
@@ -404,7 +399,7 @@ var Background = new Lang.Class({
                 });
             }
         }
-    },
+    }
 
     _queueUpdateAnimation() {
         if (this._updateAnimationTimeoutId != 0)
@@ -433,7 +428,7 @@ var Background = new Lang.Class({
                                                           return GLib.SOURCE_REMOVE;
                                                       });
         GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
-    },
+    }
 
     _loadAnimation(file) {
         this._cache.getAnimation({ file: file,
@@ -450,7 +445,7 @@ var Background = new Lang.Class({
                                        this._watchFile(file);
                                    }
                                  });
-    },
+    }
 
     _loadImage(file) {
         this.background.set_file(file, this._style);
@@ -466,14 +461,14 @@ var Background = new Lang.Class({
                 image.disconnect(id);
             });
         }
-    },
+    }
 
     _loadFile(file) {
         if (file.get_basename().endsWith('.xml'))
             this._loadAnimation(file);
         else
             this._loadImage(file);
-    },
+    }
 
     _load() {
         this._cache = getBackgroundCache();
@@ -486,16 +481,14 @@ var Background = new Lang.Class({
         }
 
         this._loadFile(this._file);
-    },
-});
+    }
+};
 Signals.addSignalMethods(Background.prototype);
 
 let _systemBackground;
 
-var SystemBackground = new Lang.Class({
-    Name: 'SystemBackground',
-
-    _init() {
+var SystemBackground = class SystemBackground {
+    constructor() {
         let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
 
         if (_systemBackground == null) {
@@ -524,14 +517,12 @@ var SystemBackground = new Lang.Class({
                 image = null;
             });
         }
-    },
-});
+    }
+};
 Signals.addSignalMethods(SystemBackground.prototype);
 
-var BackgroundSource = new Lang.Class({
-    Name: 'BackgroundSource',
-
-    _init(layoutManager, settingsSchema) {
+var BackgroundSource = class BackgroundSource {
+    constructor(layoutManager, settingsSchema) {
         // Allow override the background image setting for performance testing
         this._layoutManager = layoutManager;
         this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
@@ -542,7 +533,7 @@ var BackgroundSource = new Lang.Class({
         this._monitorsChangedId =
             monitorManager.connect('monitors-changed',
                                    this._onMonitorsChanged.bind(this));
-    },
+    }
 
     _onMonitorsChanged() {
         for (let monitorIndex in this._backgrounds) {
@@ -556,7 +547,7 @@ var BackgroundSource = new Lang.Class({
                 delete this._backgrounds[monitorIndex];
             }
         }
-    },
+    }
 
     getBackground(monitorIndex) {
         let file = null;
@@ -603,7 +594,7 @@ var BackgroundSource = new Lang.Class({
         }
 
         return this._backgrounds[monitorIndex];
-    },
+    }
 
     destroy() {
         let monitorManager = Meta.MonitorManager.get();
@@ -617,12 +608,10 @@ var BackgroundSource = new Lang.Class({
 
         this._backgrounds = null;
     }
-});
-
-var Animation = new Lang.Class({
-    Name: 'Animation',
+};
 
-    _init(params) {
+var Animation = class Animation {
+    constructor(params) {
         params = Params.parse(params, { file: null });
 
         this.file = params.file;
@@ -630,7 +619,7 @@ var Animation = new Lang.Class({
         this.transitionProgress = 0.0;
         this.transitionDuration = 0.0;
         this.loaded = false;
-    },
+    }
 
     load(callback) {
         this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() });
@@ -640,7 +629,7 @@ var Animation = new Lang.Class({
             if (callback)
                 callback();
         });
-    },
+    }
 
     update(monitor) {
         this.keyFrameFiles = [];
@@ -661,14 +650,12 @@ var Animation = new Lang.Class({
 
         if (filename2)
             this.keyFrameFiles.push(Gio.File.new_for_path(filename2));
-    },
-});
+    }
+};
 Signals.addSignalMethods(Animation.prototype);
 
-var BackgroundManager = new Lang.Class({
-    Name: 'BackgroundManager',
-
-    _init(params) {
+var BackgroundManager = class BackgroundManager {
+    constructor(params) {
         params = Params.parse(params, { container: null,
                                         layoutManager: Main.layoutManager,
                                         monitorIndex: null,
@@ -688,7 +675,7 @@ var BackgroundManager = new Lang.Class({
 
         this.backgroundActor = this._createBackgroundActor();
         this._newBackgroundActor = null;
-    },
+    }
 
     destroy() {
         let cache = getBackgroundCache();
@@ -704,7 +691,7 @@ var BackgroundManager = new Lang.Class({
             this.backgroundActor.destroy();
             this.backgroundActor = null;
         }
-    },
+    }
 
     _swapBackgroundActor() {
         let oldBackgroundActor = this.backgroundActor;
@@ -721,7 +708,7 @@ var BackgroundManager = new Lang.Class({
                                oldBackgroundActor.destroy();
                            }
                          });
-    },
+    }
 
     _updateBackgroundActor() {
         if (this._newBackgroundActor) {
@@ -750,7 +737,7 @@ var BackgroundManager = new Lang.Class({
                     this._swapBackgroundActor();
                 });
         }
-    },
+    }
 
     _createBackgroundActor() {
         let background = this._backgroundSource.getBackground(this._monitorIndex);
@@ -787,6 +774,6 @@ var BackgroundManager = new Lang.Class({
         });
 
         return backgroundActor;
-    },
-});
+    }
+};
 Signals.addSignalMethods(BackgroundManager.prototype);
diff --git a/js/ui/backgroundMenu.js b/js/ui/backgroundMenu.js
index 4d748bd63..352c7d31a 100644
--- a/js/ui/backgroundMenu.js
+++ b/js/ui/backgroundMenu.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 
@@ -9,12 +8,9 @@ const BoxPointer = imports.ui.boxpointer;
 const Main = imports.ui.main;
 const PopupMenu = imports.ui.popupMenu;
 
-var BackgroundMenu = new Lang.Class({
-    Name: 'BackgroundMenu',
-    Extends: PopupMenu.PopupMenu,
-
-    _init(layoutManager) {
-        this.parent(layoutManager.dummyCursor, 0, St.Side.TOP);
+var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
+    constructor(layoutManager) {
+        super(layoutManager.dummyCursor, 0, St.Side.TOP);
 
         this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop');
         this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -26,7 +22,7 @@ var BackgroundMenu = new Lang.Class({
         layoutManager.uiGroup.add_actor(this.actor);
         this.actor.hide();
     }
-});
+};
 
 function addBackgroundMenu(actor, layoutManager) {
     actor.reactive = true;
diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js
index 408f10dbf..6b0e72464 100644
--- a/js/ui/barLevel.js
+++ b/js/ui/barLevel.js
@@ -3,14 +3,11 @@
 const Atk = imports.gi.Atk;
 const Cairo = imports.cairo;
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Signals = imports.signals;
 
-var BarLevel = new Lang.Class({
-    Name: "BarLevel",
-
-    _init(value, params) {
+var BarLevel = class {
+    constructor(value, params) {
         if (isNaN(value))
             // Avoid spreading NaNs around
             throw TypeError('The bar level value must be a number');
@@ -40,7 +37,7 @@ var BarLevel = new Lang.Class({
         this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
 
         this.connect('value-changed', this._valueChanged.bind(this));
-    },
+    }
 
     setValue(value) {
         if (isNaN(value))
@@ -48,7 +45,7 @@ var BarLevel = new Lang.Class({
 
         this._value = Math.max(Math.min(value, this._maxValue), 0);
         this.actor.queue_repaint();
-    },
+    }
 
     setMaximumValue(value) {
         if (isNaN(value))
@@ -57,7 +54,7 @@ var BarLevel = new Lang.Class({
         this._maxValue = Math.max(value, 1);
         this._overdriveStart = Math.min(this._overdriveStart, this._maxValue);
         this.actor.queue_repaint();
-    },
+    }
 
     setOverdriveStart(value) {
         if (isNaN(value))
@@ -69,7 +66,7 @@ var BarLevel = new Lang.Class({
         this._overdriveStart = value;
         this._value = Math.max(Math.min(value, this._maxValue), 0);
         this.actor.queue_repaint();
-    },
+    }
 
     _barLevelRepaint(area) {
         let cr = area.get_context();
@@ -176,35 +173,34 @@ var BarLevel = new Lang.Class({
         }
 
         cr.$dispose();
-    },
+    }
 
     _getCurrentValue(actor) {
         return this._value;
-    },
+    }
 
     _getOverdriveStart(actor) {
         return this._overdriveStart;
-    },
+    }
 
     _getMinimumValue(actor) {
         return 0;
-    },
+    }
 
     _getMaximumValue(actor) {
         return this._maxValue;
-    },
+    }
 
     _setCurrentValue(actor, value) {
         this._value = value;
-    },
+    }
 
     _valueChanged(barLevel, value, property) {
         this._customAccessible.notify("accessible-value");
-    },
+    }
 
     get value() {
         return this._value;
     }
-});
-
+};
 Signals.addSignalMethods(BarLevel.prototype);
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index a64cba89c..bbe44d022 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
@@ -89,46 +88,42 @@ function _getCalendarDayAbbreviation(dayNumber) {
 
 // Abstraction for an appointment/event in a calendar
 
-var CalendarEvent = new Lang.Class({
-    Name: 'CalendarEvent',
-
-    _init(id, date, end, summary, allDay) {
+var CalendarEvent = class CalendarEvent {
+    constructor(id, date, end, summary, allDay) {
         this.id = id;
         this.date = date;
         this.end = end;
         this.summary = summary;
         this.allDay = allDay;
     }
-});
+};
 
 // Interface for appointments/events - e.g. the contents of a calendar
 //
 
 // First, an implementation with no events
-var EmptyEventSource = new Lang.Class({
-    Name: 'EmptyEventSource',
-
-    _init() {
+var EmptyEventSource = class EmptyEventSource {
+    constructor() {
         this.isLoading = false;
         this.isDummy = true;
         this.hasCalendars = false;
-    },
+    }
 
     destroy() {
-    },
+    }
 
     requestRange(begin, end) {
-    },
+    }
 
     getEvents(begin, end) {
         let result = [];
         return result;
-    },
+    }
 
     hasEvents(day) {
         return false;
     }
-});
+};
 Signals.addSignalMethods(EmptyEventSource.prototype);
 
 const CalendarServerIface = `
@@ -174,10 +169,8 @@ function _dateIntervalsOverlap(a0, a1, b0, b1)
 }
 
 // an implementation that reads data from a session bus service
-var DBusEventSource = new Lang.Class({
-    Name: 'DBusEventSource',
-
-    _init() {
+var DBusEventSource = class DBusEventSource {
+    constructor() {
         this._resetCache();
         this.isLoading = false;
         this.isDummy = false;
@@ -224,39 +217,39 @@ var DBusEventSource = new Lang.Class({
                 this._onNameAppeared();
             }
         });
-    },
+    }
 
     destroy() {
         this._dbusProxy.run_dispose();
-    },
+    }
 
     get hasCalendars() {
         if (this._initialized)
             return this._dbusProxy.HasCalendars;
         else
             return false;
-    },
+    }
 
     _resetCache() {
         this._events = [];
         this._lastRequestBegin = null;
         this._lastRequestEnd = null;
-    },
+    }
 
     _onNameAppeared(owner) {
         this._initialized = true;
         this._resetCache();
         this._loadEvents(true);
-    },
+    }
 
     _onNameVanished(oldOwner) {
         this._resetCache();
         this.emit('changed');
-    },
+    }
 
     _onChanged() {
         this._loadEvents(false);
-    },
+    }
 
     _onEventsReceived(results, error) {
         let newEvents = [];
@@ -278,7 +271,7 @@ var DBusEventSource = new Lang.Class({
         this._events = newEvents;
         this.isLoading = false;
         this.emit('changed');
-    },
+    }
 
     _loadEvents(forceReload) {
         // Ignore while loading
@@ -292,7 +285,7 @@ var DBusEventSource = new Lang.Class({
                                             this._onEventsReceived.bind(this),
                                             Gio.DBusCallFlags.NONE);
         }
-    },
+    }
 
     requestRange(begin, end) {
         if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
@@ -303,7 +296,7 @@ var DBusEventSource = new Lang.Class({
             this._curRequestEnd = end;
             this._loadEvents(false);
         }
-    },
+    }
 
     getEvents(begin, end) {
         let result = [];
@@ -321,7 +314,7 @@ var DBusEventSource = new Lang.Class({
             return d1.getTime() - d2.getTime();
         });
         return result;
-    },
+    }
 
     hasEvents(day) {
         let dayBegin = _getBeginningOfDay(day);
@@ -334,13 +327,11 @@ var DBusEventSource = new Lang.Class({
 
         return true;
     }
-});
+};
 Signals.addSignalMethods(DBusEventSource.prototype);
 
-var Calendar = new Lang.Class({
-    Name: 'Calendar',
-
-    _init() {
+var Calendar = class Calendar {
+    constructor() {
         this._weekStart = Shell.util_get_week_start();
         this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
 
@@ -378,7 +369,7 @@ var Calendar = new Lang.Class({
                            this._onScroll.bind(this));
 
         this._buildHeader ();
-    },
+    }
 
     // @eventSource: is an object implementing the EventSource API, e.g. the
     // requestRange(), getEvents(), hasEvents() methods and the ::changed signal.
@@ -390,7 +381,7 @@ var Calendar = new Lang.Class({
         });
         this._rebuildCalendar();
         this._update();
-    },
+    }
 
     // Sets the calendar to show a specific date
     setDate(date) {
@@ -400,14 +391,14 @@ var Calendar = new Lang.Class({
         this._selectedDate = date;
         this._update();
         this.emit('selected-date-changed', new Date(this._selectedDate));
-    },
+    }
 
     updateTimeZone() {
         // The calendar need to be rebuilt after a time zone update because
         // the date might have changed.
         this._rebuildCalendar();
         this._update();
-    },
+    }
 
     _buildHeader() {
         let layout = this.actor.layout_manager;
@@ -464,7 +455,7 @@ var Calendar = new Lang.Class({
 
         // All the children after this are days, and get removed when we update the calendar
         this._firstDayIndex = this.actor.get_n_children();
-    },
+    }
 
     _onScroll(actor, event) {
         switch (event.get_scroll_direction()) {
@@ -478,7 +469,7 @@ var Calendar = new Lang.Class({
             break;
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onPrevMonthButtonClicked() {
         let newDate = new Date(this._selectedDate);
@@ -502,7 +493,7 @@ var Calendar = new Lang.Class({
         this._backButton.grab_key_focus();
 
         this.setDate(newDate);
-    },
+    }
 
     _onNextMonthButtonClicked() {
         let newDate = new Date(this._selectedDate);
@@ -526,14 +517,14 @@ var Calendar = new Lang.Class({
         this._forwardButton.grab_key_focus();
 
         this.setDate(newDate);
-    },
+    }
 
     _onSettingsChange() {
         this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
         this._buildHeader();
         this._rebuildCalendar();
         this._update();
-    },
+    }
 
     _rebuildCalendar() {
         let now = new Date();
@@ -654,7 +645,7 @@ var Calendar = new Lang.Class({
         // Signal to the event source that we are interested in events
         // only from this date range
         this._eventSource.requestRange(beginDate, iter);
-    },
+    }
 
     _update() {
         let now = new Date();
@@ -677,18 +668,17 @@ var Calendar = new Lang.Class({
                 button.remove_style_pseudo_class('selected');
         });
     }
-});
+};
 Signals.addSignalMethods(Calendar.prototype);
 
-var EventMessage = new Lang.Class({
-    Name: 'EventMessage',
-    Extends: MessageList.Message,
+var EventMessage = class EventMessage extends MessageList.Message {
+    constructor(event, date) {
+        super('', event.summary);
 
-    _init(event, date) {
         this._event = event;
         this._date = date;
 
-        this.parent(this._formatEventTime(), event.summary);
+        this.setTitle(this._formatEventTime());
 
         this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
         this.setIcon(this._icon);
@@ -697,7 +687,7 @@ var EventMessage = new Lang.Class({
             let iconVisible = this.actor.get_parent().has_style_pseudo_class('first-child');
             this._icon.opacity = (iconVisible ? 255 : 0);
         });
-    },
+    }
 
     _formatEventTime() {
         let periodBegin = _getBeginningOfDay(this._date);
@@ -731,18 +721,16 @@ var EventMessage = new Lang.Class({
         }
         return title;
     }
-});
+};
 
-var NotificationMessage = new Lang.Class({
-    Name: 'NotificationMessage',
-    Extends: MessageList.Message,
+var NotificationMessage =
+class NotificationMessage extends MessageList.Message {
+    constructor(notification) {
+        super(notification.title, notification.bannerBodyText);
+        this.setUseBodyMarkup(notification.bannerBodyMarkup);
 
-    _init(notification) {
         this.notification = notification;
 
-        this.parent(notification.title, notification.bannerBodyText);
-        this.setUseBodyMarkup(notification.bannerBodyMarkup);
-
         this.setIcon(this._getIcon());
 
         this.connect('close', () => {
@@ -758,7 +746,7 @@ var NotificationMessage = new Lang.Class({
         });
         this._updatedId = notification.connect('updated',
                                                this._onUpdated.bind(this));
-    },
+    }
 
     _getIcon() {
         if (this.notification.gicon)
@@ -766,23 +754,23 @@ var NotificationMessage = new Lang.Class({
                                  icon_size: MESSAGE_ICON_SIZE });
         else
             return this.notification.source.createIcon(MESSAGE_ICON_SIZE);
-    },
+    }
 
     _onUpdated(n, clear) {
         this.setIcon(this._getIcon());
         this.setTitle(n.title);
         this.setBody(n.bannerBodyText);
         this.setUseBodyMarkup(n.bannerBodyMarkup);
-    },
+    }
 
     _onClicked() {
         this.notification.activate();
-    },
+    }
 
     _onDestroy() {
-        this.parent();
+        super._onDestroy();
         this._disconnectNotificationSignals();
-    },
+    }
 
     _disconnectNotificationSignals() {
         if (this._updatedId)
@@ -792,26 +780,23 @@ var NotificationMessage = new Lang.Class({
         if (this._destroyId)
             this.notification.disconnect(this._destroyId);
         this._destroyId = 0;
-    },
+    }
 
     canClose() {
         return true;
     }
-});
+};
 
-var EventsSection = new Lang.Class({
-    Name: 'EventsSection',
-    Extends: MessageList.MessageListSection,
+var EventsSection = class EventsSection extends MessageList.MessageListSection {
+    constructor() {
+        super();
 
-    _init() {
         this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
         this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
         this._eventSource = new EmptyEventSource();
 
         this._messageById = new Map();
 
-        this.parent();
-
         this._title = new St.Button({ style_class: 'events-section-title',
                                       label: '',
                                       x_align: St.Align.START,
@@ -824,16 +809,16 @@ var EventsSection = new Lang.Class({
         Shell.AppSystem.get_default().connect('installed-changed',
                                               this._appInstalledChanged.bind(this));
         this._appInstalledChanged();
-    },
+    }
 
     setEventSource(eventSource) {
         this._eventSource = eventSource;
         this._eventSource.connect('changed', this._reloadEvents.bind(this));
-    },
+    }
 
     get allowed() {
         return Main.sessionMode.showCalendarEvents;
-    },
+    }
 
     _updateTitle() {
         this._title.visible = !isToday(this._date);
@@ -852,7 +837,7 @@ var EventsSection = new Lang.Class({
             dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
                                                              "%A, %B %-d, %Y"));
         this._title.label = this._date.toLocaleFormat(dayFormat);
-    },
+    }
 
     _reloadEvents() {
         if (this._eventSource.isLoading)
@@ -887,12 +872,12 @@ var EventsSection = new Lang.Class({
 
         this._reloading = false;
         this._sync();
-    },
+    }
 
     _appInstalledChanged() {
         this._calendarApp = undefined;
         this._title.reactive = (this._getCalendarApp() != null);
-    },
+    }
 
     _getCalendarApp() {
         if (this._calendarApp !== undefined)
@@ -907,7 +892,7 @@ var EventsSection = new Lang.Class({
             this._calendarApp = null;
         }
         return this._calendarApp;
-    },
+    }
 
     _onTitleClicked() {
         Main.overview.hide();
@@ -917,32 +902,30 @@ var EventsSection = new Lang.Class({
         if (app.get_id() == 'evolution.desktop')
             app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
         app.launch([], global.create_app_launch_context(0, -1));
-    },
+    }
 
     setDate(date) {
-        this.parent(date);
+        super.setDate(date);
         this._updateTitle();
         this._reloadEvents();
-    },
+    }
 
     _shouldShow() {
         return !this.empty || !isToday(this._date);
-    },
+    }
 
     _sync() {
         if (this._reloading)
             return;
 
-        this.parent();
+        super._sync();
     }
-});
-
-var NotificationSection = new Lang.Class({
-    Name: 'NotificationSection',
-    Extends: MessageList.MessageListSection,
+};
 
-    _init() {
-        this.parent();
+var NotificationSection =
+class NotificationSection extends MessageList.MessageListSection {
+    constructor() {
+        super();
 
         this._sources = new Map();
         this._nUrgent = 0;
@@ -953,12 +936,12 @@ var NotificationSection = new Lang.Class({
         });
 
         this.actor.connect('notify::mapped', this._onMapped.bind(this));
-    },
+    }
 
     get allowed() {
         return Main.sessionMode.hasNotifications &&
                !Main.sessionMode.isGreeter;
-    },
+    }
 
     _createTimeLabel(datetime) {
         let label = new St.Label({ style_class: 'event-time',
@@ -969,7 +952,7 @@ var NotificationSection = new Lang.Class({
                 label.text = Util.formatTimeSpan(datetime);
         });
         return label;
-    },
+    }
 
     _sourceAdded(tray, source) {
         let obj = {
@@ -984,7 +967,7 @@ var NotificationSection = new Lang.Class({
                                                  this._onNotificationAdded.bind(this));
 
         this._sources.set(source, obj);
-    },
+    }
 
     _onNotificationAdded(source, notification) {
         let message = new NotificationMessage(notification);
@@ -1015,14 +998,14 @@ var NotificationSection = new Lang.Class({
 
         let index = isUrgent ? 0 : this._nUrgent;
         this.addMessageAtIndex(message, index, this.actor.mapped);
-    },
+    }
 
     _onSourceDestroy(source, obj) {
         source.disconnect(obj.destroyId);
         source.disconnect(obj.notificationAddedId);
 
         this._sources.delete(source);
-    },
+    }
 
     _onMapped() {
         if (!this.actor.mapped)
@@ -1031,17 +1014,15 @@ var NotificationSection = new Lang.Class({
         for (let message of this._messages.keys())
             if (message.notification.urgency != MessageTray.Urgency.CRITICAL)
                 message.notification.acknowledged = true;
-    },
+    }
 
     _shouldShow() {
         return !this.empty && isToday(this._date);
     }
-});
+};
 
-var Placeholder = new Lang.Class({
-    Name: 'Placeholder',
-
-    _init() {
+var Placeholder = class Placeholder {
+    constructor() {
         this.actor = new St.BoxLayout({ style_class: 'message-list-placeholder',
                                         vertical: true });
 
@@ -1059,14 +1040,14 @@ var Placeholder = new Lang.Class({
         this.actor.add_actor(this._label);
 
         this._sync();
-    },
+    }
 
     setDate(date) {
         if (sameDay(this._date, date))
             return;
         this._date = date;
         this._sync();
-    },
+    }
 
     _sync() {
         let today = isToday(this._date);
@@ -1083,12 +1064,10 @@ var Placeholder = new Lang.Class({
             this._label.text = _("No Events");
         }
     }
-});
-
-var CalendarMessageList = new Lang.Class({
-    Name: 'CalendarMessageList',
+};
 
-    _init() {
+var CalendarMessageList = class CalendarMessageList {
+    constructor() {
         this.actor = new St.Widget({ style_class: 'message-list',
                                      layout_manager: new Clutter.BinLayout(),
                                      x_expand: true, y_expand: true });
@@ -1134,7 +1113,7 @@ var CalendarMessageList = new Lang.Class({
         this._addSection(this._eventsSection);
 
         Main.sessionMode.connect('updated', this._sync.bind(this));
-    },
+    }
 
     _addSection(section) {
         let obj = {
@@ -1159,7 +1138,7 @@ var CalendarMessageList = new Lang.Class({
         this._sections.set(section, obj);
         this._sectionList.add_actor(section.actor);
         this._sync();
-    },
+    }
 
     _removeSection(section) {
         let obj = this._sections.get(section);
@@ -1172,11 +1151,11 @@ var CalendarMessageList = new Lang.Class({
         this._sections.delete(section);
         this._sectionList.remove_actor(section.actor);
         this._sync();
-    },
+    }
 
     _onKeyFocusIn(section, actor) {
         Util.ensureActorVisibleInScrollView(this._scrollView, actor);
-    },
+    }
 
     _sync() {
         let sections = [...this._sections.keys()];
@@ -1191,15 +1170,15 @@ var CalendarMessageList = new Lang.Class({
 
         let canClear = sections.some(s => s.canClear && s.actor.visible);
         this._clearButton.reactive = canClear;
-    },
+    }
 
     setEventSource(eventSource) {
         this._eventsSection.setEventSource(eventSource);
-    },
+    }
 
     setDate(date) {
         for (let section of this._sections.keys())
             section.setDate(date);
         this._placeholder.setDate(date);
     }
-});
+};
diff --git a/js/ui/checkBox.js b/js/ui/checkBox.js
index 8fa481777..2d3787b70 100644
--- a/js/ui/checkBox.js
+++ b/js/ui/checkBox.js
@@ -2,12 +2,8 @@ const Clutter = imports.gi.Clutter;
 const Pango = imports.gi.Pango;
 const St = imports.gi.St;
 
-const Lang = imports.lang;
-
-var CheckBox = new Lang.Class({
-    Name: 'CheckBox',
-
-    _init(label) {
+var CheckBox = class CheckBox {
+    constructor(label) {
         let container = new St.BoxLayout();
         this.actor = new St.Button({ style_class: 'check-box',
                                      child: container,
@@ -28,13 +24,13 @@ var CheckBox = new Lang.Class({
 
         if (label)
             this.setLabel(label);
-    },
+    }
 
     setLabel(label) {
         this._label.set_text(label);
-    },
+    }
 
     getLabelActor() {
         return this._label;
     }
-});
+};
diff --git a/js/ui/components/__init__.js b/js/ui/components/__init__.js
index 055900b72..6d6cc9d69 100644
--- a/js/ui/components/__init__.js
+++ b/js/ui/components/__init__.js
@@ -1,17 +1,13 @@
-
-const Lang = imports.lang;
 const Main = imports.ui.main;
 
-var ComponentManager = new Lang.Class({
-    Name: 'ComponentManager',
-
-    _init() {
+var ComponentManager = class {
+    constructor() {
         this._allComponents = {};
         this._enabledComponents = [];
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _sessionUpdated() {
         let newEnabledComponents = Main.sessionMode.components;
@@ -29,12 +25,12 @@ var ComponentManager = new Lang.Class({
         });
 
         this._enabledComponents = newEnabledComponents;
-    },
+    }
 
     _importComponent(name) {
         let module = imports.ui.components[name];
         return module.Component;
-    },
+    }
 
     _ensureComponent(name) {
         let component = this._allComponents[name];
@@ -48,13 +44,13 @@ var ComponentManager = new Lang.Class({
         component = new constructor();
         this._allComponents[name] = component;
         return component;
-    },
+    }
 
     _enableComponent(name) {
         let component = this._ensureComponent(name);
        if (component)
             component.enable();
-    },
+    }
 
     _disableComponent(name) {
         let component = this._allComponents[name];
@@ -62,4 +58,4 @@ var ComponentManager = new Lang.Class({
             return;
         component.disable();
     }
-});
+};
diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js
index 579c8a6b3..9903a48f5 100644
--- a/js/ui/components/automountManager.js
+++ b/js/ui/components/automountManager.js
@@ -1,6 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
@@ -19,10 +18,8 @@ const SETTING_ENABLE_AUTOMOUNT = 'automount';
 
 var AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
 
-var AutomountManager = new Lang.Class({
-    Name: 'AutomountManager',
-
-    _init() {
+var AutomountManager = class {
+    constructor() {
         this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
         this._volumeQueue = [];
         this._activeOperations = new Map();
@@ -34,7 +31,7 @@ var AutomountManager = new Lang.Class({
         this._inhibited = false;
 
         this._volumeMonitor = Gio.VolumeMonitor.get();
-    },
+    }
 
     enable() {
         this._volumeAddedId = this._volumeMonitor.connect('volume-added', this._onVolumeAdded.bind(this));
@@ -45,7 +42,7 @@ var AutomountManager = new Lang.Class({
 
         this._mountAllId = Mainloop.idle_add(this._startupMountAll.bind(this));
         GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll');
-    },
+    }
 
     disable() {
         this._volumeMonitor.disconnect(this._volumeAddedId);
@@ -58,7 +55,7 @@ var AutomountManager = new Lang.Class({
             Mainloop.source_remove(this._mountAllId);
             this._mountAllId = 0;
         }
-    },
+    }
 
     _InhibitorsChanged(object, senderName, [inhibtor]) {
         this._session.IsInhibitedRemote(GNOME_SESSION_AUTOMOUNT_INHIBIT,
@@ -67,7 +64,7 @@ var AutomountManager = new Lang.Class({
                     this._inhibited = result[0];
                 }
             });
-    },
+    }
 
     _startupMountAll() {
         let volumes = this._volumeMonitor.get_volumes();
@@ -79,7 +76,7 @@ var AutomountManager = new Lang.Class({
 
         this._mountAllId = 0;
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _onDriveConnected() {
         // if we're not in the current ConsoleKit session,
@@ -91,7 +88,7 @@ var AutomountManager = new Lang.Class({
         player.play_from_theme('device-added-media',
                                _("External drive connected"),
                                null);
-    },
+    }
 
     _onDriveDisconnected() {
         // if we're not in the current ConsoleKit session,
@@ -103,7 +100,7 @@ var AutomountManager = new Lang.Class({
         sound.play_from_theme('device-removed-media',
                               _("External drive disconnected"),
                               null);
-    },
+    }
 
     _onDriveEjectButton(monitor, drive) {
         // TODO: this code path is not tested, as the GVfs volume monitor
@@ -134,11 +131,11 @@ var AutomountManager = new Lang.Class({
                      }
                  });
         }
-    },
+    }
 
     _onVolumeAdded(monitor, volume) {
         this._checkAndMountVolume(volume);
-    },
+    }
 
     _checkAndMountVolume(volume, params) {
         params = Params.parse(params, { checkSession: true,
@@ -178,7 +175,7 @@ var AutomountManager = new Lang.Class({
         } else {
             this._mountVolume(volume, null, params.allowAutorun);
         }
-    },
+    }
 
     _mountVolume(volume, operation, allowAutorun) {
         if (allowAutorun)
@@ -189,7 +186,7 @@ var AutomountManager = new Lang.Class({
 
         volume.mount(0, mountOp, null,
                      this._onVolumeMounted.bind(this));
-    },
+    }
 
     _onVolumeMounted(volume, res) {
         this._allowAutorunExpire(volume);
@@ -214,7 +211,7 @@ var AutomountManager = new Lang.Class({
                 this._closeOperation(volume);
             }
         }
-    },
+    }
 
     _onVolumeRemoved(monitor, volume) {
         if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) {
@@ -223,7 +220,7 @@ var AutomountManager = new Lang.Class({
         }
         this._volumeQueue = 
             this._volumeQueue.filter(element => (element != volume));
-    },
+    }
 
     _reaskPassword(volume) {
         let prevOperation = this._activeOperations.get(volume);
@@ -232,7 +229,7 @@ var AutomountManager = new Lang.Class({
             new ShellMountOperation.ShellMountOperation(volume,
                                                         { existingDialog: existingDialog });
         this._mountVolume(volume, operation);
-    },
+    }
 
     _closeOperation(volume) {
         let operation = this._activeOperations.get(volume);
@@ -240,11 +237,11 @@ var AutomountManager = new Lang.Class({
             return;
         operation.close();
         this._activeOperations.delete(volume);
-    },
+    }
 
     _allowAutorun(volume) {
         volume.allowAutorun = true;
-    },
+    }
 
     _allowAutorunExpire(volume) {
         let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
@@ -255,5 +252,5 @@ var AutomountManager = new Lang.Class({
         volume._allowAutorunExpireId = id;
         GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
     }
-});
+};
 var Component = AutomountManager;
diff --git a/js/ui/components/autorunManager.js b/js/ui/components/autorunManager.js
index 68a1643f2..20499daee 100644
--- a/js/ui/components/autorunManager.js
+++ b/js/ui/components/autorunManager.js
@@ -1,6 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Gio = imports.gi.Gio;
 const St = imports.gi.St;
 
@@ -84,13 +83,11 @@ function HotplugSniffer() {
                                    '/org/gnome/Shell/HotplugSniffer');
 }
 
-var ContentTypeDiscoverer = new Lang.Class({
-    Name: 'ContentTypeDiscoverer',
-
-    _init(callback) {
+var ContentTypeDiscoverer = class {
+    constructor(callback) {
         this._callback = callback;
         this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
-    },
+    }
 
     guessContentTypes(mount) {
         let autorunEnabled = !this._settings.get_boolean(SETTING_DISABLE_AUTORUN);
@@ -103,7 +100,7 @@ var ContentTypeDiscoverer = new Lang.Class({
         } else {
             this._emitCallback(mount, []);
         }
-    },
+    }
 
     _onContentTypeGuessed(mount, res) {
         let contentTypes = [];
@@ -126,7 +123,7 @@ var ContentTypeDiscoverer = new Lang.Class({
                      this._emitCallback(mount, contentTypes);
                  });
         }
-    },
+    }
 
     _emitCallback(mount, contentTypes) {
         if (!contentTypes)
@@ -150,27 +147,25 @@ var ContentTypeDiscoverer = new Lang.Class({
 
         this._callback(mount, apps, contentTypes);
     }
-});
-
-var AutorunManager = new Lang.Class({
-    Name: 'AutorunManager',
+};
 
-    _init() {
+var AutorunManager = class {
+    constructor() {
         this._session = new GnomeSession.SessionManager();
         this._volumeMonitor = Gio.VolumeMonitor.get();
 
         this._dispatcher = new AutorunDispatcher(this);
-    },
+    }
 
     enable() {
         this._mountAddedId = this._volumeMonitor.connect('mount-added', this._onMountAdded.bind(this));
         this._mountRemovedId = this._volumeMonitor.connect('mount-removed', this._onMountRemoved.bind(this));
-    },
+    }
 
     disable() {
         this._volumeMonitor.disconnect(this._mountAddedId);
         this._volumeMonitor.disconnect(this._mountRemovedId);
-    },
+    }
 
     _onMountAdded(monitor, mount) {
         // don't do anything if our session is not the currently
@@ -182,21 +177,19 @@ var AutorunManager = new Lang.Class({
             this._dispatcher.addMount(mount, apps, contentTypes);
         });
         discoverer.guessContentTypes(mount);
-    },
+    }
 
     _onMountRemoved(monitor, mount) {
         this._dispatcher.removeMount(mount);
     }
-});
-
-var AutorunDispatcher = new Lang.Class({
-    Name: 'AutorunDispatcher',
+};
 
-    _init(manager) {
+var AutorunDispatcher = class {
+    constructor(manager) {
         this._manager = manager;
         this._sources = [];
         this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
-    },
+    }
 
     _getAutorunSettingForType(contentType) {
         let runApp = this._settings.get_strv(SETTING_START_APP);
@@ -212,7 +205,7 @@ var AutorunDispatcher = new Lang.Class({
             return AutorunSetting.FILES;
 
         return AutorunSetting.ASK;
-    },
+    }
 
     _getSourceForMount(mount) {
         let filtered = this._sources.filter(source => (source.mount == mount));
@@ -224,7 +217,7 @@ var AutorunDispatcher = new Lang.Class({
             return filtered[0];
 
         return null;
-    },
+    }
 
     _addSource(mount, apps) {
         // if we already have a source showing for this 
@@ -234,7 +227,7 @@ var AutorunDispatcher = new Lang.Class({
      
         // add a new source
         this._sources.push(new AutorunSource(this._manager, mount, apps));
-    },
+    }
 
     addMount(mount, apps, contentTypes) {
         // if autorun is disabled globally, return
@@ -272,7 +265,7 @@ var AutorunDispatcher = new Lang.Class({
         // but we failed launching the default app or the default file manager
         if (!success)
             this._addSource(mount, apps);
-    },
+    }
 
     removeMount(mount) {
         let source = this._getSourceForMount(mount);
@@ -284,45 +277,39 @@ var AutorunDispatcher = new Lang.Class({
         // destroy the notification source
         source.destroy();
     }
-});
+};
 
-var AutorunSource = new Lang.Class({
-    Name: 'AutorunSource',
-    Extends: MessageTray.Source,
+var AutorunSource = class extends MessageTray.Source {
+    constructor(manager, mount, apps) {
+        super(mount.get_name());
 
-    _init(manager, mount, apps) {
         this._manager = manager;
         this.mount = mount;
         this.apps = apps;
 
-        this.parent(mount.get_name());
-
         this._notification = new AutorunNotification(this._manager, this);
 
         // add ourselves as a source, and popup the notification
         Main.messageTray.add(this);
         this.notify(this._notification);
-    },
+    }
 
     getIcon() {
         return this.mount.get_icon();
-    },
+    }
 
     _createPolicy() {
         return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus');
     }
-});
-
-var AutorunNotification = new Lang.Class({
-    Name: 'AutorunNotification',
-    Extends: MessageTray.Notification,
+};
 
-    _init(manager, source) {
-        this.parent(source, source.title);
+var AutorunNotification = class extends MessageTray.Notification {
+    constructor(manager, source) {
+        super(source, source.title);
 
         this._manager = manager;
         this._mount = source.mount;
-    },
+    }
 
     createBanner() {
         let banner = new MessageTray.NotificationBanner(this);
@@ -335,7 +322,7 @@ var AutorunNotification = new Lang.Class({
         });
 
         return banner;
-    },
+    }
 
     _buttonForApp(app) {
         let box = new St.BoxLayout();
@@ -362,14 +349,14 @@ var AutorunNotification = new Lang.Class({
         });
 
         return button;
-    },
+    }
 
     activate() {
-        this.parent();
+        super.activate();
 
         let app = Gio.app_info_get_default_for_type('inode/directory', false);
         startAppForMount(app, this._mount);
     }
-});
+};
 
 var Component = AutorunManager;
diff --git a/js/ui/components/keyring.js b/js/ui/components/keyring.js
index 180b86556..22ea5d25b 100644
--- a/js/ui/components/keyring.js
+++ b/js/ui/components/keyring.js
@@ -1,6 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Clutter = imports.gi.Clutter;
 const St = imports.gi.St;
@@ -18,12 +17,9 @@ const Tweener = imports.ui.tweener;
 
 var WORK_SPINNER_ICON_SIZE = 16;
 
-var KeyringDialog = new Lang.Class({
-    Name: 'KeyringDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init() {
-        this.parent({ styleClass: 'prompt-dialog' });
+var KeyringDialog = class extends ModalDialog.ModalDialog {
+    constructor() {
+        super({ styleClass: 'prompt-dialog' });
 
         this.prompt = new Shell.KeyringPrompt();
         this.prompt.connect('show-password', this._onShowPassword.bind(this));
@@ -61,7 +57,7 @@ var KeyringDialog = new Lang.Class({
 
         this.prompt.bind_property('cancel-label', this._cancelButton, 'label', 
GObject.BindingFlags.SYNC_CREATE);
         this.prompt.bind_property('continue-label', this._continueButton, 'label', 
GObject.BindingFlags.SYNC_CREATE);
-    },
+    }
 
     _setWorking(working) {
         if (!this._workSpinner)
@@ -71,7 +67,7 @@ var KeyringDialog = new Lang.Class({
             this._workSpinner.play();
         else
             this._workSpinner.stop();
-    },
+    }
 
     _buildControlTable() {
         let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
@@ -162,7 +158,7 @@ var KeyringDialog = new Lang.Class({
 
         this._controlTable = table;
         this._content.messageBox.add(table, { x_fill: true, y_fill: true });
-    },
+    }
 
     _updateSensitivity(sensitive) {
         if (this._passwordEntry) {
@@ -178,7 +174,7 @@ var KeyringDialog = new Lang.Class({
         this._continueButton.can_focus = sensitive;
         this._continueButton.reactive = sensitive;
         this._setWorking(!sensitive);
-    },
+    }
 
     _ensureOpen() {
         // NOTE: ModalDialog.open() is safe to call if the dialog is
@@ -196,65 +192,61 @@ var KeyringDialog = new Lang.Class({
             ' Dismissing prompt request');
         this.prompt.cancel()
         return false;
-    },
+    }
 
     _onShowPassword(prompt) {
         this._buildControlTable();
         this._ensureOpen();
         this._updateSensitivity(true);
         this._passwordEntry.grab_key_focus();
-    },
+    }
 
     _onShowConfirm(prompt) {
         this._buildControlTable();
         this._ensureOpen();
         this._updateSensitivity(true);
         this._continueButton.grab_key_focus();
-    },
+    }
 
     _onHidePrompt(prompt) {
         this.close();
-    },
+    }
 
     _onPasswordActivate() {
         if (this.prompt.confirm_visible)
             this._confirmEntry.grab_key_focus();
         else
             this._onContinueButton();
-    },
+    }
 
     _onConfirmActivate() {
         this._onContinueButton();
-    },
+    }
 
     _onContinueButton() {
         this._updateSensitivity(false);
         this.prompt.complete();
-    },
+    }
 
     _onCancelButton() {
         this.prompt.cancel();
-    },
-});
-
-var KeyringDummyDialog = new Lang.Class({
-    Name: 'KeyringDummyDialog',
+    }
+};
 
-    _init() {
+var KeyringDummyDialog = class {
+    constructor() {
         this.prompt = new Shell.KeyringPrompt();
         this.prompt.connect('show-password', this._cancelPrompt.bind(this));
         this.prompt.connect('show-confirm', this._cancelPrompt.bind(this));
-    },
+    }
 
     _cancelPrompt() {
         this.prompt.cancel();
     }
-});
-
-var KeyringPrompter = new Lang.Class({
-    Name: 'KeyringPrompter',
+};
 
-    _init() {
+var KeyringPrompter = class {
+    constructor() {
         this._prompter = new Gcr.SystemPrompter();
         this._prompter.connect('new-prompt', () => {
             let dialog = this._enabled ? new KeyringDialog()
@@ -266,7 +258,7 @@ var KeyringPrompter = new Lang.Class({
         this._registered = false;
         this._enabled = false;
         this._currentPrompt = null;
-    },
+    }
 
     enable() {
         if (!this._registered) {
@@ -276,7 +268,7 @@ var KeyringPrompter = new Lang.Class({
             this._registered = true;
         }
         this._enabled = true;
-    },
+    }
 
     disable() {
         this._enabled = false;
@@ -285,6 +277,6 @@ var KeyringPrompter = new Lang.Class({
             this._currentPrompt.cancel();
         this._currentPrompt = null;
     }
-});
+};
 
 var Component = KeyringPrompter;
diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js
index 6f7b81f94..7a6011ce9 100644
--- a/js/ui/components/networkAgent.js
+++ b/js/ui/components/networkAgent.js
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const GObject = imports.gi.GObject;
-const Lang = imports.lang;
 const NM = imports.gi.NM;
 const Pango = imports.gi.Pango;
 const Shell = imports.gi.Shell;
@@ -21,12 +20,9 @@ const ShellEntry = imports.ui.shellEntry;
 
 const VPN_UI_GROUP = 'VPN Plugin UI';
 
-var NetworkSecretDialog = new Lang.Class({
-    Name: 'NetworkSecretDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(agent, requestId, connection, settingName, hints, contentOverride) {
-        this.parent({ styleClass: 'prompt-dialog' });
+var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
+    constructor(agent, requestId, connection, settingName, hints, contentOverride) {
+        super({ styleClass: 'prompt-dialog' });
 
         this._agent = agent;
         this._requestId = requestId;
@@ -121,7 +117,7 @@ var NetworkSecretDialog = new Lang.Class({
                          this._okButton]);
 
         this._updateOkButton();
-    },
+    }
 
     _updateOkButton() {
         let valid = true;
@@ -132,7 +128,7 @@ var NetworkSecretDialog = new Lang.Class({
 
         this._okButton.button.reactive = valid;
         this._okButton.button.can_focus = valid;
-    },
+    }
 
     _onOk() {
         let valid = true;
@@ -148,12 +144,12 @@ var NetworkSecretDialog = new Lang.Class({
             this.close(global.get_current_time());
         }
         // do nothing if not valid
-    },
+    }
 
     cancel() {
         this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
         this.close(global.get_current_time());
-    },
+    }
 
     _validateWpaPsk(secret) {
         let value = secret.value;
@@ -169,7 +165,7 @@ var NetworkSecretDialog = new Lang.Class({
         }
 
         return (value.length >= 8 && value.length <= 63);
-    },
+    }
 
     _validateStaticWep(secret) {
         let value = secret.value;
@@ -194,7 +190,7 @@ var NetworkSecretDialog = new Lang.Class({
                return false;
        }
         return true;
-    },
+    }
 
     _getWirelessSecrets(secrets, wirelessSetting) {
         let wirelessSecuritySetting = this._connection.get_setting_wireless_security();
@@ -231,7 +227,7 @@ var NetworkSecretDialog = new Lang.Class({
         default:
             log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt);
         }
-    },
+    }
 
     _get8021xSecrets(secrets) {
         let ieee8021xSetting = this._connection.get_setting_802_1x();
@@ -274,7 +270,7 @@ var NetworkSecretDialog = new Lang.Class({
         default:
             log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0));
         }
-    },
+    }
 
     _getPPPoESecrets(secrets) {
         let pppoeSetting = this._connection.get_setting_pppoe();
@@ -284,7 +280,7 @@ var NetworkSecretDialog = new Lang.Class({
                        value: pppoeSetting.service || '', password: false });
         secrets.push({ label: _("Password: "), key: 'password',
                        value: pppoeSetting.password || '', password: true });
-    },
+    }
 
     _getMobileSecrets(secrets, connectionType) {
         let setting;
@@ -294,7 +290,7 @@ var NetworkSecretDialog = new Lang.Class({
             setting = this._connection.get_setting_by_name(connectionType);
         secrets.push({ label: _("Password: "), key: 'password',
                        value: setting.value || '', password: true });
-    },
+    }
 
     _getContent() {
         let connectionSetting = this._connection.get_setting_connection();
@@ -347,12 +343,10 @@ var NetworkSecretDialog = new Lang.Class({
 
         return content;
     }
-});
-
-var VPNRequestHandler = new Lang.Class({
-    Name: 'VPNRequestHandler',
+};
 
-    _init(agent, requestId, authHelper, serviceType, connection, hints, flags) {
+var VPNRequestHandler = class {
+    constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
         this._agent = agent;
         this._requestId = requestId;
         this._connection = connection;
@@ -412,7 +406,7 @@ var VPNRequestHandler = new Lang.Class({
 
             this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
         }
-    },
+    }
 
     cancel(respond) {
         if (respond)
@@ -428,7 +422,7 @@ var VPNRequestHandler = new Lang.Class({
         }
 
         this.destroy();
-    },
+    }
 
     destroy() {
         if (this._destroyed)
@@ -442,7 +436,7 @@ var VPNRequestHandler = new Lang.Class({
         // Stdout is closed when we finish reading from it
 
         this._destroyed = true;
-    },
+    }
 
     _vpnChildFinished(pid, status, requestObj) {
         this._childWatch = 0;
@@ -463,7 +457,7 @@ var VPNRequestHandler = new Lang.Class({
             this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 
         this.destroy();
-    },
+    }
 
     _vpnChildProcessLineOldStyle(line) {
         if (this._previousLine != undefined) {
@@ -481,7 +475,7 @@ var VPNRequestHandler = new Lang.Class({
         } else {
             this._previousLine = line;
         }
-    },
+    }
 
     _readStdoutOldStyle() {
         this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (stream, result) => {
@@ -498,7 +492,7 @@ var VPNRequestHandler = new Lang.Class({
             // try to read more!
             this._readStdoutOldStyle();
         });
-    },
+    }
 
     _readStdoutNewStyle() {
         this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, (stream, result) => {
@@ -516,7 +510,7 @@ var VPNRequestHandler = new Lang.Class({
             this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size());
             this._readStdoutNewStyle();
         });
-    },
+    }
 
     _showNewStyleDialog() {
         let keyfile = new GLib.KeyFile();
@@ -580,7 +574,7 @@ var VPNRequestHandler = new Lang.Class({
             this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
             this.destroy();
         }
-    },
+    }
 
     _writeConnection() {
         let vpnSetting = this._connection.get_setting_vpn();
@@ -601,14 +595,12 @@ var VPNRequestHandler = new Lang.Class({
             this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
             this.destroy();
         }
-    },
-});
+    }
+};
 Signals.addSignalMethods(VPNRequestHandler.prototype);
 
-var NetworkAgent = new Lang.Class({
-    Name: 'NetworkAgent',
-
-    _init() {
+var NetworkAgent = class {
+    constructor() {
         this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
                                                 capabilities: NM.SecretAgentCapabilities.VPN_HINTS,
                                                 auto_register: false
@@ -639,7 +631,7 @@ var NetworkAgent = new Lang.Class({
                 logError(e, 'error initializing the NetworkManager Agent');
             }
         });
-    },
+    }
 
     enable() {
         if (!this._native)
@@ -648,7 +640,7 @@ var NetworkAgent = new Lang.Class({
         this._native.auto_register = true;
         if (this._initialized && !this._native.registered)
             this._native.register_async(null, null);
-    },
+    }
 
     disable() {
         let requestId;
@@ -671,7 +663,7 @@ var NetworkAgent = new Lang.Class({
         this._native.auto_register = false;
         if (this._initialized && this._native.registered)
             this._native.unregister_async(null, null);
-    },
+    }
 
     _showNotification(requestId, connection, settingName, hints, flags) {
         let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive');
@@ -731,14 +723,14 @@ var NetworkAgent = new Lang.Class({
 
         Main.messageTray.add(source);
         source.notify(notification);
-    },
+    }
 
     _newRequest(agent, requestId, connection, settingName, hints, flags) {
         if (!(flags & NM.SecretAgentGetSecretsFlags.USER_REQUESTED))
             this._showNotification(requestId, connection, settingName, hints, flags);
         else
             this._handleRequest(requestId, connection, settingName, hints, flags);
-    },
+    }
 
     _handleRequest(requestId, connection, settingName, hints, flags) {
         if (settingName == 'vpn') {
@@ -752,7 +744,7 @@ var NetworkAgent = new Lang.Class({
         });
         this._dialogs[requestId] = dialog;
         dialog.open(global.get_current_time());
-    },
+    }
 
     _cancelRequest(agent, requestId) {
         if (this._dialogs[requestId]) {
@@ -763,7 +755,7 @@ var NetworkAgent = new Lang.Class({
             this._vpnRequests[requestId].cancel(false);
             delete this._vpnRequests[requestId];
         }
-    },
+    }
 
     _vpnRequest(requestId, connection, hints, flags) {
         let vpnSetting = connection.get_setting_vpn();
@@ -785,7 +777,7 @@ var NetworkAgent = new Lang.Class({
             delete this._vpnRequests[requestId];
         });
         this._vpnRequests[requestId] = vpnRequest;
-    },
+    }
 
     _buildVPNServiceCache() {
         if (this._vpnCacheBuilt)
@@ -818,5 +810,5 @@ var NetworkAgent = new Lang.Class({
             }
         });
     }
-});
+};
 var Component = NetworkAgent;
diff --git a/js/ui/components/polkitAgent.js b/js/ui/components/polkitAgent.js
index 4b2a2cacb..1dee80784 100644
--- a/js/ui/components/polkitAgent.js
+++ b/js/ui/components/polkitAgent.js
@@ -1,6 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
 const AccountsService = imports.gi.AccountsService;
@@ -26,12 +25,9 @@ var DIALOG_ICON_SIZE = 48;
 
 var WORK_SPINNER_ICON_SIZE = 16;
 
-var AuthenticationDialog = new Lang.Class({
-    Name: 'AuthenticationDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(actionId, body, cookie, userNames) {
-        this.parent({ styleClass: 'prompt-dialog' });
+var AuthenticationDialog = class extends ModalDialog.ModalDialog {
+    constructor(actionId, body, cookie, userNames) {
+        super({ styleClass: 'prompt-dialog' });
 
         this.actionId = actionId;
         this.message = body;
@@ -156,14 +152,14 @@ var AuthenticationDialog = new Lang.Class({
 
         this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
         this._cookie = cookie;
-    },
+    }
 
     _setWorking(working) {
         if (working)
             this._workSpinner.play();
         else
             this._workSpinner.stop();
-    },
+    }
 
     performAuthentication() {
         this.destroySession();
@@ -174,15 +170,15 @@ var AuthenticationDialog = new Lang.Class({
         this._session.connect('show-error', this._onSessionShowError.bind(this));
         this._session.connect('show-info', this._onSessionShowInfo.bind(this));
         this._session.initiate();
-    },
+    }
 
     close(timestamp) {
-        this.parent(timestamp);
+        super.close(timestamp);
 
         if (this._sessionUpdatedId)
             Main.sessionMode.disconnect(this._sessionUpdatedId);
         this._sessionUpdatedId = 0;
-    },
+    }
 
     _ensureOpen() {
         // NOTE: ModalDialog.open() is safe to call if the dialog is
@@ -204,14 +200,14 @@ var AuthenticationDialog = new Lang.Class({
                 ' cookie ' + this._cookie);
             this._emitDone(true);
         }
-    },
+    }
 
     _emitDone(dismissed) {
         if (!this._doneEmitted) {
             this._doneEmitted = true;
             this.emit('done', dismissed);
         }
-    },
+    }
 
     _updateSensitivity(sensitive) {
         this._passwordEntry.reactive = sensitive;
@@ -220,7 +216,7 @@ var AuthenticationDialog = new Lang.Class({
         this._okButton.can_focus = sensitive;
         this._okButton.reactive = sensitive;
         this._setWorking(!sensitive);
-    },
+    }
 
     _onEntryActivate() {
         let response = this._passwordEntry.get_text();
@@ -231,11 +227,11 @@ var AuthenticationDialog = new Lang.Class({
         this._errorMessageLabel.hide();
         this._infoMessageLabel.hide();
         this._nullMessageLabel.show();
-    },
+    }
 
     _onAuthenticateButtonPressed() {
         this._onEntryActivate();
-    },
+    }
 
     _onSessionCompleted(session, gainedAuthorization) {
         if (this._completed || this._doneEmitted)
@@ -267,7 +263,7 @@ var AuthenticationDialog = new Lang.Class({
             /* Try and authenticate again */
             this.performAuthentication();
         }
-    },
+    }
 
     _onSessionRequest(session, request, echo_on) {
         // Cheap localization trick
@@ -286,7 +282,7 @@ var AuthenticationDialog = new Lang.Class({
         this._passwordEntry.grab_key_focus();
         this._updateSensitivity(true);
         this._ensureOpen();
-    },
+    }
 
     _onSessionShowError(session, text) {
         this._passwordEntry.set_text('');
@@ -295,7 +291,7 @@ var AuthenticationDialog = new Lang.Class({
         this._infoMessageLabel.hide();
         this._nullMessageLabel.hide();
         this._ensureOpen();
-    },
+    }
 
     _onSessionShowInfo(session, text) {
         this._passwordEntry.set_text('');
@@ -304,7 +300,7 @@ var AuthenticationDialog = new Lang.Class({
         this._errorMessageLabel.hide();
         this._nullMessageLabel.hide();
         this._ensureOpen();
-    },
+    }
 
     destroySession() {
         if (this._session) {
@@ -313,34 +309,32 @@ var AuthenticationDialog = new Lang.Class({
             this._completed = false;
             this._session = null;
         }
-    },
+    }
 
     _onUserChanged() {
         if (this._user.is_loaded && this._userAvatar) {
             this._userAvatar.update();
             this._userAvatar.actor.show();
         }
-    },
+    }
 
     cancel() {
         this._wasDismissed = true;
         this.close(global.get_current_time());
         this._emitDone(true);
-    },
-});
+    }
+};
 Signals.addSignalMethods(AuthenticationDialog.prototype);
 
-var AuthenticationAgent = new Lang.Class({
-    Name: 'AuthenticationAgent',
-
-    _init() {
+var AuthenticationAgent = class {
+    constructor() {
         this._currentDialog = null;
         this._handle = null;
         this._native = new Shell.PolkitAuthenticationAgent();
         this._native.connect('initiate', this._onInitiate.bind(this));
         this._native.connect('cancel', this._onCancel.bind(this));
         this._sessionUpdatedId = 0;
-    },
+    }
 
     enable() {
         try {
@@ -348,7 +342,7 @@ var AuthenticationAgent = new Lang.Class({
         } catch(e) {
             log('Failed to register AuthenticationAgent');
         }
-    },
+    }
 
     disable() {
         try {
@@ -356,7 +350,7 @@ var AuthenticationAgent = new Lang.Class({
         } catch(e) {
             log('Failed to unregister AuthenticationAgent');
         }
-    },
+    }
 
     _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) {
         // Don't pop up a dialog while locked
@@ -384,15 +378,15 @@ var AuthenticationAgent = new Lang.Class({
 
         this._currentDialog.connect('done', this._onDialogDone.bind(this));
         this._currentDialog.performAuthentication();
-    },
+    }
 
     _onCancel(nativeAgent) {
         this._completeRequest(false);
-    },
+    }
 
     _onDialogDone(dialog, dismissed) {
         this._completeRequest(dismissed);
-    },
+    }
 
     _completeRequest(dismissed) {
         this._currentDialog.close();
@@ -404,7 +398,7 @@ var AuthenticationAgent = new Lang.Class({
         this._sessionUpdatedId = 0;
 
         this._native.complete(dismissed);
-    },
-});
+    }
+};
 
 var Component = AuthenticationAgent;
diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js
index 257b24fdd..d26e8a07e 100644
--- a/js/ui/components/telepathyClient.js
+++ b/js/ui/components/telepathyClient.js
@@ -79,17 +79,15 @@ function makeMessageFromTplEvent(event) {
     };
 }
 
-var TelepathyComponent = new Lang.Class({
-    Name: 'TelepathyComponent',
-
-    _init() {
+var TelepathyComponent = class {
+    constructor() {
         this._client = null;
 
         if (!HAVE_TP)
             return; // Telepathy isn't available
 
         this._client = new TelepathyClient();
-    },
+    }
 
     enable() {
         if (!this._client)
@@ -103,7 +101,7 @@ var TelepathyComponent = new Lang.Class({
 
         if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
             this._client.account_manager.prepare_async(null, null);
-    },
+    }
 
     disable() {
         if (!this._client)
@@ -111,7 +109,7 @@ var TelepathyComponent = new Lang.Class({
 
         this._client.unregister();
     }
-});
+};
 
 var TelepathyClient = HAVE_TP ? new Lang.Class({
     Name: 'TelepathyClient',
@@ -279,17 +277,14 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
     },
 }) : null;
 
-var ChatSource = new Lang.Class({
-    Name: 'ChatSource',
-    Extends: MessageTray.Source,
+var ChatSource = class extends MessageTray.Source {
+    constructor(account, conn, channel, contact, client) {
+        super(contact.get_alias());
 
-    _init(account, conn, channel, contact, client) {
         this._account = account;
         this._contact = contact;
         this._client = client;
 
-        this.parent(contact.get_alias());
-
         this.isChat = true;
         this._pendingMessages = [];
 
@@ -313,7 +308,7 @@ var ChatSource = new Lang.Class({
         Main.messageTray.add(this);
 
         this._getLogMessages();
-    },
+    }
 
     _ensureNotification() {
         if (this._notification)
@@ -329,13 +324,13 @@ var ChatSource = new Lang.Class({
             this._notification = null;
         });
         this.pushNotification(this._notification);
-    },
+    }
 
     _createPolicy() {
         if (this._account.protocol_name == 'irc')
             return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari');
         return new MessageTray.NotificationApplicationPolicy('empathy');
-    },
+    }
 
     createBanner() {
         this._banner = new ChatNotificationBanner(this._notification);
@@ -348,7 +343,7 @@ var ChatSource = new Lang.Class({
         });
 
         return this._banner;
-    },
+    }
 
     _updateAlias() {
         let oldAlias = this.title;
@@ -360,7 +355,7 @@ var ChatSource = new Lang.Class({
         this.setTitle(newAlias);
         if (this._notification)
             this._notification.appendAliasChange(oldAlias, newAlias);
-    },
+    }
 
     getIcon() {
         let file = this._contact.get_avatar_file();
@@ -369,7 +364,7 @@ var ChatSource = new Lang.Class({
         } else {
             return new Gio.ThemedIcon({ name: 'avatar-default' });
         }
-    },
+    }
 
     getSecondaryIcon() {
         let iconName;
@@ -398,7 +393,7 @@ var ChatSource = new Lang.Class({
                 iconName = 'user-offline';
        }
        return new Gio.ThemedIcon({ name: iconName });
-    },
+    }
 
     _updateAvatarIcon() {
         this.iconUpdated();
@@ -406,7 +401,7 @@ var ChatSource = new Lang.Class({
             this._notification.update(this._notification.title,
                                       this._notification.bannerBodyText,
                                       { gicon: this.getIcon() });
-    },
+    }
 
     open() {
         Main.overview.hide();
@@ -431,7 +426,7 @@ var ChatSource = new Lang.Class({
 
             cd.present_channel_async(this._channel, global.get_current_time(), null);
         }
-    },
+    }
 
     _getLogMessages() {
         let logManager = Tpl.LogManager.dup_singleton();
@@ -440,7 +435,7 @@ var ChatSource = new Lang.Class({
         logManager.get_filtered_events_async(this._account, entity,
                                              Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
                                              null, this._displayPendingMessages.bind(this));
-    },
+    }
 
     _displayPendingMessages(logManager, result) {
         let [success, events] = logManager.get_filtered_events_finish(result);
@@ -493,7 +488,7 @@ var ChatSource = new Lang.Class({
 
         if (pendingMessages.length > 0)
             this.notify();
-    },
+    }
 
     destroy(reason) {
         if (this._client.is_handling_channel(this._channel)) {
@@ -527,25 +522,25 @@ var ChatSource = new Lang.Class({
         this._contact.disconnect(this._notifyAvatarId);
         this._contact.disconnect(this._presenceChangedId);
 
-        this.parent(reason);
-    },
+        super.destroy(reason);
+    }
 
     _channelClosed() {
         this.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
-    },
+    }
 
     /* All messages are new messages for Telepathy sources */
     get count() {
         return this._pendingMessages.length;
-    },
+    }
 
     get unseenCount() {
         return this.count;
-    },
+    }
 
     get countVisible() {
         return this.count > 0;
-    },
+    }
 
     _messageReceived(channel, message) {
         if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
@@ -565,7 +560,7 @@ var ChatSource = new Lang.Class({
         this._notifyTimeoutId = Mainloop.timeout_add(500,
             this._notifyTimeout.bind(this));
         GLib.Source.set_name_by_id(this._notifyTimeoutId, '[gnome-shell] this._notifyTimeout');
-    },
+    }
 
     _notifyTimeout() {
         if (this._pendingMessages.length != 0)
@@ -574,7 +569,7 @@ var ChatSource = new Lang.Class({
         this._notifyTimeoutId = 0;
 
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     // This is called for both messages we send from
     // our client and other clients as well.
@@ -582,11 +577,11 @@ var ChatSource = new Lang.Class({
         this._ensureNotification();
         message = makeMessageFromTpMessage(message, NotificationDirection.SENT);
         this._notification.appendMessage(message);
-    },
+    }
 
     notify() {
-        this.parent(this._notification);
-    },
+        super.notify(this._notification);
+    }
 
     respond(text) {
         let type;
@@ -601,7 +596,7 @@ var ChatSource = new Lang.Class({
         this._channel.send_message_async(msg, 0, (src, result) => {
             this._channel.send_message_finish(result); 
         });
-    },
+    }
 
     setChatState(state) {
         // We don't want to send COMPOSING every time a letter is typed into
@@ -614,14 +609,14 @@ var ChatSource = new Lang.Class({
           this._chatState = state;
           this._channel.set_chat_state_async(state, null);
         }
-    },
+    }
 
     _presenceChanged(contact, presence, status, message) {
         if (this._notification)
             this._notification.update(this._notification.title,
                                       this._notification.bannerBodyText,
                                       { secondaryGIcon: this.getSecondaryIcon() });
-    },
+    }
 
     _pendingRemoved(channel, message) {
         let idx = this._pendingMessages.indexOf(message);
@@ -634,35 +629,32 @@ var ChatSource = new Lang.Class({
         if (this._pendingMessages.length == 0 &&
             this._banner && !this._banner.expanded)
             this._banner.hide();
-    },
+    }
 
     _ackMessages() {
         // Don't clear our messages here, tp-glib will send a
         // 'pending-message-removed' for each one.
         this._channel.ack_all_pending_messages_async(null);
     }
-});
-
-var ChatNotification = new Lang.Class({
-    Name: 'ChatNotification',
-    Extends: MessageTray.Notification,
+};
 
-    _init(source) {
-        this.parent(source, source.title, null,
-                    { secondaryGIcon: source.getSecondaryIcon() });
+var ChatNotification = class extends MessageTray.Notification {
+    constructor(source) {
+        super(source, source.title, null,
+              { secondaryGIcon: source.getSecondaryIcon() });
         this.setUrgency(MessageTray.Urgency.HIGH);
         this.setResident(true);
 
         this.messages = [];
         this._timestampTimeoutId = 0;
-    },
+    }
 
     destroy(reason) {
         if (this._timestampTimeoutId)
             Mainloop.source_remove(this._timestampTimeoutId);
         this._timestampTimeoutId = 0;
-        this.parent(reason);
-    },
+        super.destroy(reason);
+    }
 
     /**
      * appendMessage:
@@ -700,7 +692,7 @@ var ChatNotification = new Lang.Class({
                        styles: styles,
                        timestamp: message.timestamp,
                        noTimestamp: noTimestamp });
-    },
+    }
 
     _filterMessages() {
         if (this.messages.length < 1)
@@ -725,7 +717,7 @@ var ChatNotification = new Lang.Class({
             for (let i = 0; i < expired.length; i++)
                 this.emit('message-removed', expired[i]);
         }
-    },
+    }
 
     /**
      * _append:
@@ -773,7 +765,7 @@ var ChatNotification = new Lang.Class({
         }
 
         this._filterMessages();
-    },
+    }
 
     appendTimestamp() {
         this._timestampTimeoutId = 0;
@@ -784,7 +776,7 @@ var ChatNotification = new Lang.Class({
         this._filterMessages();
 
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     appendAliasChange(oldAlias, newAlias) {
         oldAlias = GLib.markup_escape_text(oldAlias, -1);
@@ -800,7 +792,7 @@ var ChatNotification = new Lang.Class({
 
         this._filterMessages();
     }
-});
+};
 
 var ChatLineBox = new Lang.Class({
     Name: 'ChatLineBox',
@@ -812,12 +804,9 @@ var ChatLineBox = new Lang.Class({
     }
 });
 
-var ChatNotificationBanner = new Lang.Class({
-    Name: 'ChatNotificationBanner',
-    Extends: MessageTray.NotificationBanner,
-
-    _init(notification) {
-        this.parent(notification);
+var ChatNotificationBanner = class extends MessageTray.NotificationBanner {
+    constructor(notification) {
+        super(notification);
 
         this._responseEntry = new St.Entry({ style_class: 'chat-response',
                                              x_expand: true,
@@ -880,14 +869,14 @@ var ChatNotificationBanner = new Lang.Class({
 
         for (let i = this.notification.messages.length - 1; i >= 0; i--)
             this._addMessage(this.notification.messages[i]);
-    },
+    }
 
     _onDestroy() {
-        this.parent();
+        super._onDestroy();
         this.notification.disconnect(this._messageAddedId);
         this.notification.disconnect(this._messageRemovedId);
         this.notification.disconnect(this._timestampChangedId);
-    },
+    }
 
     scrollTo(side) {
         let adjustment = this._scrollArea.vscroll.adjustment;
@@ -895,11 +884,11 @@ var ChatNotificationBanner = new Lang.Class({
             adjustment.value = adjustment.lower;
         else if (side == St.Side.BOTTOM)
             adjustment.value = adjustment.upper;
-    },
+    }
 
     hide() {
         this.emit('done-displaying');
-    },
+    }
 
     _addMessage(message) {
         let highlighter = new MessageList.URLHighlighter(message.body, true, true);
@@ -921,7 +910,7 @@ var ChatNotificationBanner = new Lang.Class({
         this._messageActors.set(message, lineBox);
 
         this._updateTimestamp(message);
-    },
+    }
 
     _updateTimestamp(message) {
         let actor = this._messageActors.get(message);
@@ -942,7 +931,7 @@ var ChatNotificationBanner = new Lang.Class({
 
             actor.add_actor(timeLabel);
         }
-    },
+    }
 
     _onEntryActivated() {
         let text = this._responseEntry.get_text();
@@ -955,7 +944,7 @@ var ChatNotificationBanner = new Lang.Class({
         // see Source._messageSent
         this._responseEntry.set_text('');
         this.notification.source.respond(text);
-    },
+    }
 
     _composingStopTimeout() {
         this._composingTimeoutId = 0;
@@ -963,7 +952,7 @@ var ChatNotificationBanner = new Lang.Class({
         this.notification.source.setChatState(Tp.ChannelChatState.PAUSED);
 
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _onEntryChanged() {
         let text = this._responseEntry.get_text();
@@ -990,6 +979,6 @@ var ChatNotificationBanner = new Lang.Class({
             this.notification.source.setChatState(Tp.ChannelChatState.ACTIVE);
         }
     }
-});
+};
 
 var Component = TelepathyComponent;
diff --git a/js/ui/ctrlAltTab.js b/js/ui/ctrlAltTab.js
index 8ab1db9ba..62e1f3d93 100644
--- a/js/ui/ctrlAltTab.js
+++ b/js/ui/ctrlAltTab.js
@@ -2,7 +2,6 @@
 
 const Clutter = imports.gi.Clutter;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -21,15 +20,13 @@ var SortGroup = {
     BOTTOM: 2
 };
 
-var CtrlAltTabManager = new Lang.Class({
-    Name: 'CtrlAltTabManager',
-
-    _init() {
+var CtrlAltTabManager = class CtrlAltTabManager {
+    constructor() {
         this._items = [];
         this.addGroup(global.window_group, _("Windows"),
                       'focus-windows-symbolic', { sortGroup: SortGroup.TOP,
                                                   focusCallback: this._focusWindows.bind(this) });
-    },
+    }
 
     addGroup(root, name, icon, params) {
         let item = Params.parse(params, { sortGroup: SortGroup.MIDDLE,
@@ -44,7 +41,7 @@ var CtrlAltTabManager = new Lang.Class({
         root.connect('destroy', () => { this.removeGroup(root); });
         if (root instanceof St.Widget)
             global.focus_manager.add_group(root);
-    },
+    }
 
     removeGroup(root) {
         if (root instanceof St.Widget)
@@ -55,14 +52,14 @@ var CtrlAltTabManager = new Lang.Class({
                 return;
             }
         }
-    },
+    }
 
     focusGroup(item, timestamp) {
         if (item.focusCallback)
             item.focusCallback(timestamp);
         else
             item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
-    },
+    }
 
     // Sort the items into a consistent order; panel first, tray last,
     // and everything else in between, sorted by X coordinate, so that
@@ -77,7 +74,7 @@ var CtrlAltTabManager = new Lang.Class({
         [bx, y] = b.proxy.get_transformed_position();
 
         return ax - bx;
-    },
+    }
 
     popup(backward, binding, mask) {
         // Start with the set of focus groups that are currently mapped
@@ -130,22 +127,20 @@ var CtrlAltTabManager = new Lang.Class({
                                     this._popup = null;
                                 });
         }
-    },
+    }
 
     _focusWindows(timestamp) {
         global.display.focus_default_window(timestamp);
     }
-});
-
-var CtrlAltTabPopup = new Lang.Class({
-    Name: 'CtrlAltTabPopup',
-    Extends: SwitcherPopup.SwitcherPopup,
+};
 
-    _init(items) {
-        this.parent(items);
+var CtrlAltTabPopup =
+class CtrlAltTabPopup extends SwitcherPopup.SwitcherPopup {
+    constructor(items) {
+        super(items);
 
         this._switcherList = new CtrlAltTabSwitcher(this._items);
-    },
+    }
 
     _keyPressHandler(keysym, action) {
         if (action == Meta.KeyBindingAction.SWITCH_PANELS)
@@ -160,24 +155,22 @@ var CtrlAltTabPopup = new Lang.Class({
             return Clutter.EVENT_PROPAGATE;
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _finish(time) {
-        this.parent(time);
+        super._finish(time);
         Main.ctrlAltTabManager.focusGroup(this._items[this._selectedIndex], time);
-    },
-});
-
-var CtrlAltTabSwitcher = new Lang.Class({
-    Name: 'CtrlAltTabSwitcher',
-    Extends: SwitcherPopup.SwitcherList,
+    }
+};
 
-    _init(items) {
-        this.parent(true);
+var CtrlAltTabSwitcher =
+class CtrlAltTabSwitcher extends SwitcherPopup.SwitcherList {
+    constructor(items) {
+        super(true);
 
         for (let i = 0; i < items.length; i++)
             this._addIcon(items[i]);
-    },
+    }
 
     _addIcon(item) {
         let box = new St.BoxLayout({ style_class: 'alt-tab-app',
@@ -195,4 +188,4 @@ var CtrlAltTabSwitcher = new Lang.Class({
 
         this.addItem(box, text);
     }
-});
+};
diff --git a/js/ui/dash.js b/js/ui/dash.js
index ce970a610..be529213e 100644
--- a/js/ui/dash.js
+++ b/js/ui/dash.js
@@ -347,10 +347,8 @@ var DashActor = new Lang.Class({
 
 const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
 
-var Dash = new Lang.Class({
-    Name: 'Dash',
-
-    _init() {
+var Dash = class Dash {
+    constructor() {
         this._maxHeight = -1;
         this.iconSize = 64;
         this._shownInitially = false;
@@ -407,7 +405,7 @@ var Dash = new Lang.Class({
         // Translators: this is the name of the dock/favorites area on
         // the left of the overview
         Main.ctrlAltTabManager.addGroup(this.actor, _("Dash"), 'user-bookmarks-symbolic');
-    },
+    }
 
     _onDragBegin() {
         this._dragCancelled = false;
@@ -421,26 +419,26 @@ var Dash = new Lang.Class({
             this._box.insert_child_at_index(this._emptyDropTarget, 0);
             this._emptyDropTarget.show(true);
         }
-    },
+    }
 
     _onDragCancelled() {
         this._dragCancelled = true;
         this._endDrag();
-    },
+    }
 
     _onDragEnd() {
         if (this._dragCancelled)
             return;
 
         this._endDrag();
-    },
+    }
 
     _endDrag() {
         this._clearDragPlaceholder();
         this._clearEmptyDropTarget();
         this._showAppsIcon.setDragApp(null);
         DND.removeDragMonitor(this._dragMonitor);
-    },
+    }
 
     _onDragMotion(dragEvent) {
         let app = getAppFromSource(dragEvent.source);
@@ -459,18 +457,18 @@ var Dash = new Lang.Class({
             this._showAppsIcon.setDragApp(null);
 
         return DND.DragMotionResult.CONTINUE;
-    },
+    }
 
     _appIdListToHash(apps) {
         let ids = {};
         for (let i = 0; i < apps.length; i++)
             ids[apps[i].get_id()] = apps[i];
         return ids;
-    },
+    }
 
     _queueRedisplay() {
         Main.queueDeferredWork(this._workId);
-    },
+    }
 
     _hookUpLabel(item, appIcon) {
         item.child.connect('notify::hover', () => {
@@ -490,7 +488,7 @@ var Dash = new Lang.Class({
                 this._syncLabel(item, appIcon);
             });
         }
-    },
+    }
 
     _createAppItem(app) {
         let appIcon = new AppDisplay.AppIcon(app,
@@ -524,7 +522,7 @@ var Dash = new Lang.Class({
         this._hookUpLabel(item, appIcon);
 
         return item;
-    },
+    }
 
     _itemMenuStateChanged(item, opened) {
         // When the menu closes, it calls sync_hover, which means
@@ -537,7 +535,7 @@ var Dash = new Lang.Class({
 
             item.hideLabel();
         }
-    },
+    }
 
     _syncLabel(item, appIcon) {
         let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover();
@@ -573,7 +571,7 @@ var Dash = new Lang.Class({
                 GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing');
             }
         }
-    },
+    }
 
     _adjustIconSize() {
         // For the icon size, we only consider children which are "proper"
@@ -663,7 +661,7 @@ var Dash = new Lang.Class({
                                transition: 'easeOutQuad',
                              });
         }
-    },
+    }
 
     _redisplay() {
         let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
@@ -792,7 +790,7 @@ var Dash = new Lang.Class({
         // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744
         // Without it, StBoxLayout may use a stale size cache
         this._box.queue_relayout();
-    },
+    }
 
     _clearDragPlaceholder() {
         if (this._dragPlaceholder) {
@@ -804,14 +802,14 @@ var Dash = new Lang.Class({
             this._dragPlaceholder = null;
         }
         this._dragPlaceholderPos = -1;
-    },
+    }
 
     _clearEmptyDropTarget() {
         if (this._emptyDropTarget) {
             this._emptyDropTarget.animateOutAndDestroy();
             this._emptyDropTarget = null;
         }
-    },
+    }
 
     handleDragOver(source, actor, x, y, time) {
         let app = getAppFromSource(source);
@@ -888,7 +886,7 @@ var Dash = new Lang.Class({
             return DND.DragMotionResult.MOVE_DROP;
 
         return DND.DragMotionResult.COPY_DROP;
-    },
+    }
 
     // Draggable target interface
     acceptDrop(source, actor, x, y, time) {
@@ -938,6 +936,5 @@ var Dash = new Lang.Class({
 
         return true;
     }
-});
-
+};
 Signals.addSignalMethods(Dash.prototype);
diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js
index 83967c9f4..a95c09ec2 100644
--- a/js/ui/dateMenu.js
+++ b/js/ui/dateMenu.js
@@ -31,10 +31,8 @@ function _isToday(date) {
            now.getDate() == date.getDate();
 }
 
-var TodayButton = new Lang.Class({
-    Name: 'TodayButton',
-
-    _init(calendar) {
+var TodayButton = class TodayButton {
+    constructor(calendar) {
         // Having the ability to go to the current date if the user is already
         // on the current date can be confusing. So don't make the button reactive
         // until the selected date changes.
@@ -63,7 +61,7 @@ var TodayButton = new Lang.Class({
             // current date.
             this.actor.reactive = !_isToday(date)
         });
-    },
+    }
 
     setDate(date) {
         this._dayLabel.set_text(date.toLocaleFormat('%A'));
@@ -83,12 +81,10 @@ var TodayButton = new Lang.Class({
         dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
         this.actor.accessible_name = date.toLocaleFormat(dateFormat);
     }
-});
-
-var WorldClocksSection = new Lang.Class({
-    Name: 'WorldClocksSection',
+};
 
-    _init() {
+var WorldClocksSection = class WorldClocksSection {
+    constructor() {
         this._clock = new GnomeDesktop.WallClock();
         this._clockNotifyId = 0;
 
@@ -118,11 +114,11 @@ var WorldClocksSection = new Lang.Class({
         this._clockAppMon.watchSetting('world-clocks',
                                        this._clocksChanged.bind(this));
         this._sync();
-    },
+    }
 
     _sync() {
         this.actor.visible = this._clockAppMon.available;
-    },
+    }
 
     _clocksChanged(settings) {
         this._grid.destroy_all_children();
@@ -187,7 +183,7 @@ var WorldClocksSection = new Lang.Class({
                 this._clock.disconnect(this._clockNotifyId);
             this._clockNotifyId = 0;
         }
-    },
+    }
 
     _updateLabels() {
         for (let i = 0; i < this._locations.length; i++) {
@@ -197,12 +193,10 @@ var WorldClocksSection = new Lang.Class({
             l.actor.text = Util.formatTime(now, { timeOnly: true });
         }
     }
-});
+};
 
-var WeatherSection = new Lang.Class({
-    Name: 'WeatherSection',
-
-    _init() {
+var WeatherSection = class WeatherSection {
+    constructor() {
         this._weatherClient = new Weather.WeatherClient();
 
         this.actor = new St.Button({ style_class: 'weather-button',
@@ -236,7 +230,7 @@ var WeatherSection = new Lang.Class({
 
         this._weatherClient.connect('changed', this._sync.bind(this));
         this._sync();
-    },
+    }
 
     _getSummary(info, capitalize=false) {
         let options = capitalize ? GWeather.FormatOptions.SENTENCE_CAPITALIZATION
@@ -250,7 +244,7 @@ var WeatherSection = new Lang.Class({
 
         let [, sky] = info.get_value_sky();
         return GWeather.Sky.to_string_full(sky, options);
-    },
+    }
 
     _sameSummary(info1, info2) {
         let [ok1, phenom1, qualifier1] = info1.get_value_conditions();
@@ -261,7 +255,7 @@ var WeatherSection = new Lang.Class({
         let [, sky1] = info1.get_value_sky();
         let [, sky2] = info2.get_value_sky();
         return sky1 == sky2;
-    },
+    }
 
     _getSummaryText() {
         let info = this._weatherClient.info;
@@ -309,7 +303,7 @@ var WeatherSection = new Lang.Class({
             return this._getSummary(info, capitalize);
         });
         return String.prototype.format.apply(fmt, summaries);
-    },
+    }
 
     _getLabelText() {
         if (!this._weatherClient.hasLocation)
@@ -328,7 +322,7 @@ var WeatherSection = new Lang.Class({
             return _("Go online for weather information");
 
         return _("Weather information is currently unavailable");
-    },
+    }
 
     _sync() {
         this.actor.visible = this._weatherClient.available;
@@ -338,12 +332,10 @@ var WeatherSection = new Lang.Class({
 
         this._conditionsLabel.text = this._getLabelText();
     }
-});
+};
 
-var MessagesIndicator = new Lang.Class({
-    Name: 'MessagesIndicator',
-
-    _init() {
+var MessagesIndicator = class MessagesIndicator {
+    constructor() {
         this.actor = new St.Icon({ icon_name: 'message-indicator-symbolic',
                                    icon_size: 16,
                                    visible: false, y_expand: true,
@@ -357,18 +349,18 @@ var MessagesIndicator = new Lang.Class({
 
         let sources = Main.messageTray.getSources();
         sources.forEach(source => { this._onSourceAdded(null, source); });
-    },
+    }
 
     _onSourceAdded(tray, source) {
         source.connect('count-updated', this._updateCount.bind(this));
         this._sources.push(source);
         this._updateCount();
-    },
+    }
 
     _onSourceRemoved(tray, source) {
         this._sources.splice(this._sources.indexOf(source), 1);
         this._updateCount();
-    },
+    }
 
     _updateCount() {
         let count = 0;
@@ -377,7 +369,7 @@ var MessagesIndicator = new Lang.Class({
 
         this.actor.visible = (count > 0);
     }
-});
+};
 
 var IndicatorPad = new Lang.Class({
     Name: 'IndicatorPad',
@@ -592,5 +584,5 @@ var DateMenuButton = new Lang.Class({
         // but the corresponding app (clocks, weather); however we can consider
         // that display-specific settings, so re-use "allowSettings" here ...
         this._displaysSection.visible = Main.sessionMode.allowSettings;
-    }
+    },
 });
diff --git a/js/ui/dnd.js b/js/ui/dnd.js
index 665881363..4aca7c341 100644
--- a/js/ui/dnd.js
+++ b/js/ui/dnd.js
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
 const St = imports.gi.St;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
@@ -74,10 +73,8 @@ function removeDragMonitor(monitor) {
         }
 }
 
-var _Draggable = new Lang.Class({
-    Name: 'Draggable',
-
-    _init(actor, params) {
+var _Draggable = class _Draggable {
+    constructor(actor, params) {
         params = Params.parse(params, { manualMode: false,
                                         restoreOnSuccess: false,
                                         dragActorMaxSize: undefined,
@@ -112,7 +109,7 @@ var _Draggable = new Lang.Class({
         this._dragCancellable = true;
 
         this._eventsGrabbed = false;
-    },
+    }
 
     _onButtonPress(actor, event) {
         if (event.get_button() != 1)
@@ -129,7 +126,7 @@ var _Draggable = new Lang.Class({
         this._dragStartY = stageY;
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onTouchEvent(actor, event) {
         if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
@@ -149,7 +146,7 @@ var _Draggable = new Lang.Class({
         this._dragStartY = stageY;
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _grabDevice(actor) {
         let manager = Clutter.DeviceManager.get_default();
@@ -161,7 +158,7 @@ var _Draggable = new Lang.Class({
             pointer.grab (actor);
 
         this._grabbedDevice = pointer;
-    },
+    }
 
     _ungrabDevice() {
         if (this._touchSequence)
@@ -171,13 +168,13 @@ var _Draggable = new Lang.Class({
 
         this._touchSequence = null;
         this._grabbedDevice = null;
-    },
+    }
 
     _grabActor() {
         this._grabDevice(this.actor);
         this._onEventId = this.actor.connect('event',
                                              this._onEvent.bind(this));
-    },
+    }
 
     _ungrabActor() {
         if (!this._onEventId)
@@ -186,7 +183,7 @@ var _Draggable = new Lang.Class({
         this._ungrabDevice();
         this.actor.disconnect(this._onEventId);
         this._onEventId = null;
-    },
+    }
 
     _grabEvents() {
         if (!this._eventsGrabbed) {
@@ -194,7 +191,7 @@ var _Draggable = new Lang.Class({
             if (this._eventsGrabbed)
                 this._grabDevice(_getEventHandlerActor());
         }
-    },
+    }
 
     _ungrabEvents() {
         if (this._eventsGrabbed) {
@@ -202,7 +199,7 @@ var _Draggable = new Lang.Class({
             Main.popModal(_getEventHandlerActor());
             this._eventsGrabbed = false;
         }
-    },
+    }
 
     _onEvent(actor, event) {
         // We intercept BUTTON_RELEASE event to know that the button was released in case we
@@ -246,7 +243,7 @@ var _Draggable = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     /**
      * fakeRelease:
@@ -259,7 +256,7 @@ var _Draggable = new Lang.Class({
     fakeRelease() {
         this._buttonDown = false;
         this._ungrabActor();
-    },
+    }
 
     /**
      * startDrag:
@@ -395,7 +392,7 @@ var _Draggable = new Lang.Class({
                                    onUpdateScope: this });
             }
         }
-    },
+    }
 
     _maybeStartDrag(event) {
         let [stageX, stageY] = event.get_coords();
@@ -409,12 +406,12 @@ var _Draggable = new Lang.Class({
         }
 
         return true;
-    },
+    }
 
     _pickTargetActor() {
         return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
                                                             this._dragX, this._dragY);
-    },
+    }
 
     _updateDragHover() {
         this._updateHoverId = 0;
@@ -471,7 +468,7 @@ var _Draggable = new Lang.Class({
         }
         global.display.set_cursor(Meta.Cursor.DND_IN_DRAG);
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _queueUpdateDragHover() {
         if (this._updateHoverId)
@@ -480,7 +477,7 @@ var _Draggable = new Lang.Class({
         this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
                                             this._updateDragHover.bind(this));
         GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover');
-    },
+    }
 
     _updateDragPosition(event) {
         let [stageX, stageY] = event.get_coords();
@@ -491,7 +488,7 @@ var _Draggable = new Lang.Class({
 
         this._queueUpdateDragHover();
         return true;
-    },
+    }
 
     _dragActorDropped(event) {
         let [dropX, dropY] = event.get_coords();
@@ -554,7 +551,7 @@ var _Draggable = new Lang.Class({
         this._cancelDrag(event.get_time());
 
         return true;
-    },
+    }
 
     _getRestoreLocation() {
         let x, y, scale;
@@ -586,7 +583,7 @@ var _Draggable = new Lang.Class({
         }
 
         return [x, y, scale];
-    },
+    }
 
     _cancelDrag(eventTime) {
         this.emit('drag-cancelled', eventTime);
@@ -613,7 +610,7 @@ var _Draggable = new Lang.Class({
                                scale_y: snapBackScale,
                                time: SNAP_BACK_ANIMATION_TIME,
                              });
-    },
+    }
 
     _restoreDragActor(eventTime) {
         this._dragState = DragState.INIT;
@@ -626,7 +623,7 @@ var _Draggable = new Lang.Class({
 
         this._animateDragEnd(eventTime,
                              { time: REVERT_ANIMATION_TIME });
-    },
+    }
 
     _animateDragEnd(eventTime, params) {
         this._animationInProgress = true;
@@ -639,7 +636,7 @@ var _Draggable = new Lang.Class({
 
         // start the animation
         Tweener.addTween(this._dragActor, params)
-    },
+    }
 
     _finishAnimation() {
         if (!this._animationInProgress)
@@ -650,7 +647,7 @@ var _Draggable = new Lang.Class({
             this._dragComplete();
 
         global.display.set_cursor(Meta.Cursor.DEFAULT);
-    },
+    }
 
     _onAnimationComplete(dragActor, eventTime) {
         if (this._dragOrigParent) {
@@ -664,7 +661,7 @@ var _Draggable = new Lang.Class({
 
         this.emit('drag-end', eventTime, false);
         this._finishAnimation();
-    },
+    }
 
     _dragComplete() {
         if (!this._actorDestroyed && this._dragActor)
@@ -686,8 +683,7 @@ var _Draggable = new Lang.Class({
         this._dragState = DragState.INIT;
         currentDraggable = null;
     }
-});
-
+};
 Signals.addSignalMethods(_Draggable.prototype);
 
 /**
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index 4804333d4..7c3a02256 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -16,7 +16,6 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 
 const AccountsService = imports.gi.AccountsService;
@@ -235,13 +234,10 @@ function init() {
     _endSessionDialog = new EndSessionDialog();
 }
 
-var EndSessionDialog = new Lang.Class({
-    Name: 'EndSessionDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init() {
-        this.parent({ styleClass: 'end-session-dialog',
-                      destroyOnClose: false });
+var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
+    constructor() {
+        super({ styleClass: 'end-session-dialog',
+                destroyOnClose: false });
 
         this._loginManager = LoginManager.getLoginManager();
         this._userManager = AccountsService.UserManager.get_default();
@@ -356,12 +352,12 @@ var EndSessionDialog = new Lang.Class({
 
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
-    },
+    }
 
     _onDestroy() {
         this._user.disconnect(this._userLoadedId);
         this._user.disconnect(this._userChangedId);
-    },
+    }
 
     _sync() {
         let open = (this.state == ModalDialog.State.OPENING || this.state == ModalDialog.State.OPENED);
@@ -434,7 +430,7 @@ var EndSessionDialog = new Lang.Class({
         this._scrollView.visible = hasApplications || hasSessions;
         this._applicationHeader.visible = hasApplications;
         this._sessionHeader.visible = hasSessions;
-    },
+    }
 
     _updateButtons() {
         let dialogContent = DialogContent[this._type];
@@ -456,20 +452,20 @@ var EndSessionDialog = new Lang.Class({
         }
 
         this.setButtons(buttons);
-    },
+    }
 
     close(skipSignal) {
-        this.parent();
+        super.close();
 
         if (!skipSignal)
             this._dbusImpl.emit_signal('Closed', null);
-    },
+    }
 
     cancel() {
         this._stopTimer();
         this._dbusImpl.emit_signal('Canceled', null);
         this.close();
-    },
+    }
 
     _confirm(signal) {
         let callback = () => {
@@ -504,11 +500,11 @@ var EndSessionDialog = new Lang.Class({
         } else {
             this._triggerOfflineUpdateCancel(callback);
         }
-    },
+    }
 
     _onOpened() {
         this._sync();
-    },
+    }
 
     _triggerOfflineUpdateReboot(callback) {
         this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
@@ -517,7 +513,7 @@ var EndSessionDialog = new Lang.Class({
 
             callback();
         });
-    },
+    }
 
     _triggerOfflineUpdateShutdown(callback) {
         this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
@@ -526,7 +522,7 @@ var EndSessionDialog = new Lang.Class({
 
             callback();
         });
-    },
+    }
 
     _triggerOfflineUpdateCancel(callback) {
         this._pkOfflineProxy.CancelRemote((result, error) => {
@@ -535,7 +531,7 @@ var EndSessionDialog = new Lang.Class({
 
             callback();
         });
-    },
+    }
 
     _startTimer() {
         let startTime = GLib.get_monotonic_time();
@@ -559,7 +555,7 @@ var EndSessionDialog = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
         GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm');
-    },
+    }
 
     _stopTimer() {
         if (this._timerId > 0) {
@@ -568,7 +564,7 @@ var EndSessionDialog = new Lang.Class({
         }
 
         this._secondsLeft = 0;
-    },
+    }
 
     _constructListItemForApp(inhibitor, app) {
         let actor = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item',
@@ -593,7 +589,7 @@ var EndSessionDialog = new Lang.Class({
         }
 
         return actor;
-    },
+    }
 
     _onInhibitorLoaded(inhibitor) {
         if (this._applications.indexOf(inhibitor) < 0) {
@@ -612,7 +608,7 @@ var EndSessionDialog = new Lang.Class({
         }
 
         this._sync();
-    },
+    }
 
     _constructListItemForSession(session) {
         let avatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE });
@@ -642,7 +638,7 @@ var EndSessionDialog = new Lang.Class({
         actor.label_actor = nameLabel;
 
         return actor;
-    },
+    }
 
     _loadSessions() {
         this._loginManager.listSessions(result => {
@@ -684,7 +680,7 @@ var EndSessionDialog = new Lang.Class({
 
             this._sync();
         });
-    },
+    }
 
     OpenAsync(parameters, invocation) {
         let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
@@ -754,9 +750,9 @@ var EndSessionDialog = new Lang.Class({
             invocation.return_value(null);
             this.disconnect(signalId);
         });
-    },
+    }
 
     Close(parameters, invocation) {
         this.close();
     }
-});
+};
diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
index 9b6f7a3a4..828f6f789 100644
--- a/js/ui/extensionDownloader.js
+++ b/js/ui/extensionDownloader.js
@@ -1,7 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
-
 const Clutter = imports.gi.Clutter;
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
@@ -183,12 +181,10 @@ function checkForUpdates() {
     });
 }
 
-var InstallExtensionDialog = new Lang.Class({
-    Name: 'InstallExtensionDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(uuid, info, invocation) {
-        this.parent({ styleClass: 'extension-dialog' });
+var InstallExtensionDialog =
+class InstallExtensionDialog extends ModalDialog.ModalDialog {
+    constructor(uuid, info, invocation) {
+        super({ styleClass: 'extension-dialog' });
 
         this._uuid = uuid;
         this._info = info;
@@ -216,12 +212,12 @@ var InstallExtensionDialog = new Lang.Class({
         let label = new St.Label({ style_class: 'message-dialog-title headline',
                                    text: message });
         box.add(label);
-    },
+    }
 
     _onCancelButtonPressed(button, event) {
         this.close();
         this._invocation.return_value(GLib.Variant.new('(s)', ['cancelled']));
-    },
+    }
 
     _onInstallButtonPressed(button, event) {
         let params = { shell_version: Config.PACKAGE_VERSION };
@@ -264,7 +260,7 @@ var InstallExtensionDialog = new Lang.Class({
 
         this.close();
     }
-});
+};
 
 function init() {
     _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
diff --git a/js/ui/focusCaretTracker.js b/js/ui/focusCaretTracker.js
index 6695cbadf..473ae3e6e 100644
--- a/js/ui/focusCaretTracker.js
+++ b/js/ui/focusCaretTracker.js
@@ -22,29 +22,26 @@
  */
 
 const Atspi = imports.gi.Atspi;
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const CARETMOVED        = 'object:text-caret-moved';
 const STATECHANGED      = 'object:state-changed';
 
-var FocusCaretTracker = new Lang.Class({
-    Name: 'FocusCaretTracker',
-
-    _init() {
+var FocusCaretTracker = class FocusCaretTracker {
+    constructor() {
         this._atspiListener = Atspi.EventListener.new(this._onChanged.bind(this));
 
         this._atspiInited = false;
         this._focusListenerRegistered = false;
         this._caretListenerRegistered = false;
-    },
+    }
 
     _onChanged(event) {
         if (event.type.indexOf(STATECHANGED) == 0)
             this.emit('focus-changed', event);
         else if (event.type == CARETMOVED)
             this.emit('caret-moved', event);
-    },
+    }
 
     _initAtspi() {
         if (!this._atspiInited && Atspi.init() == 0) {
@@ -53,7 +50,7 @@ var FocusCaretTracker = new Lang.Class({
         }
 
        return this._atspiInited;
-    },
+    }
 
     registerFocusListener() {
         if (!this._initAtspi() || this._focusListenerRegistered)
@@ -62,7 +59,7 @@ var FocusCaretTracker = new Lang.Class({
         this._atspiListener.register(STATECHANGED + ':focused');
         this._atspiListener.register(STATECHANGED + ':selected');
         this._focusListenerRegistered = true;
-    },
+    }
 
     registerCaretListener() {
         if (!this._initAtspi() || this._caretListenerRegistered)
@@ -70,7 +67,7 @@ var FocusCaretTracker = new Lang.Class({
 
         this._atspiListener.register(CARETMOVED);
         this._caretListenerRegistered = true;
-    },
+    }
 
     deregisterFocusListener() {
         if (!this._focusListenerRegistered)
@@ -79,7 +76,7 @@ var FocusCaretTracker = new Lang.Class({
         this._atspiListener.deregister(STATECHANGED + ':focused');
         this._atspiListener.deregister(STATECHANGED + ':selected');
         this._focusListenerRegistered = false;
-    },
+    }
 
     deregisterCaretListener() {
         if (!this._caretListenerRegistered)
@@ -88,5 +85,5 @@ var FocusCaretTracker = new Lang.Class({
         this._atspiListener.deregister(CARETMOVED);
         this._caretListenerRegistered = false;
     }
-});
+};
 Signals.addSignalMethods(FocusCaretTracker.prototype);
diff --git a/js/ui/grabHelper.js b/js/ui/grabHelper.js
index 38e116fd9..9f6f188bd 100644
--- a/js/ui/grabHelper.js
+++ b/js/ui/grabHelper.js
@@ -2,7 +2,6 @@
 
 const Clutter = imports.gi.Clutter;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -46,10 +45,8 @@ function _popGrabHelper(grabHelper) {
 // your code just needs to deal with it; you shouldn't adjust behavior directly
 // after you call ungrab(), but instead pass an 'onUngrab' callback when you
 // call grab().
-var GrabHelper = new Lang.Class({
-    Name: 'GrabHelper',
-
-    _init(owner, params) {
+var GrabHelper = class GrabHelper {
+    constructor(owner, params) {
         this._owner = owner;
         this._modalParams = params;
 
@@ -59,7 +56,7 @@ var GrabHelper = new Lang.Class({
         this._ignoreUntilRelease = false;
 
         this._modalCount = 0;
-    },
+    }
 
     // addActor:
     // @actor: an actor
@@ -71,7 +68,7 @@ var GrabHelper = new Lang.Class({
             this.removeActor(actor);
         });
         this._actors.push(actor);
-    },
+    }
 
     // removeActor:
     // @actor: an actor
@@ -86,7 +83,7 @@ var GrabHelper = new Lang.Class({
             actor.disconnect(actor.__grabHelperDestroyId);
             delete actor.__grabHelperDestroyId;
         }
-    },
+    }
 
     _isWithinGrabbedActor(actor) {
         let currentActor = this.currentGrab.actor;
@@ -98,19 +95,19 @@ var GrabHelper = new Lang.Class({
             actor = actor.get_parent();
         }
         return false;
-    },
+    }
 
     get currentGrab() {
         return this._grabStack[this._grabStack.length - 1] || {};
-    },
+    }
 
     get grabbed() {
         return this._grabStack.length > 0;
-    },
+    }
 
     get grabStack() {
         return this._grabStack;
-    },
+    }
 
     _findStackIndex(actor) {
         if (!actor)
@@ -121,7 +118,7 @@ var GrabHelper = new Lang.Class({
                 return i;
         }
         return -1;
-    },
+    }
 
     _actorInGrabStack(actor) {
         while (actor) {
@@ -131,11 +128,11 @@ var GrabHelper = new Lang.Class({
             actor = actor.get_parent();
         }
         return -1;
-    },
+    }
 
     isActorGrabbed(actor) {
         return this._findStackIndex(actor) >= 0;
-    },
+    }
 
     // grab:
     // @params: A bunch of parameters, see below
@@ -195,7 +192,7 @@ var GrabHelper = new Lang.Class({
         }
 
         return true;
-    },
+    }
 
     _takeModalGrab() {
         let firstGrab = (this._modalCount == 0);
@@ -208,7 +205,7 @@ var GrabHelper = new Lang.Class({
 
         this._modalCount++;
         return true;
-    },
+    }
 
     _releaseModalGrab() {
         this._modalCount--;
@@ -221,7 +218,7 @@ var GrabHelper = new Lang.Class({
 
         Main.popModal(this._owner);
         global.sync_pointer();
-    },
+    }
 
     // ignoreRelease:
     //
@@ -231,7 +228,7 @@ var GrabHelper = new Lang.Class({
     // the next release event.
     ignoreRelease() {
         this._ignoreUntilRelease = true;
-    },
+    }
 
     // ungrab:
     // @params: The parameters for the grab; see below.
@@ -274,7 +271,7 @@ var GrabHelper = new Lang.Class({
             if (poppedGrab.savedFocus)
                 poppedGrab.savedFocus.grab_key_focus();
         }
-    },
+    }
 
     onCapturedEvent(event) {
         let type = event.type();
@@ -322,5 +319,5 @@ var GrabHelper = new Lang.Class({
         }
 
         return Clutter.EVENT_STOP;
-    },
-});
+    }
+};
diff --git a/js/ui/ibusCandidatePopup.js b/js/ui/ibusCandidatePopup.js
index 085aaaa25..124426887 100644
--- a/js/ui/ibusCandidatePopup.js
+++ b/js/ui/ibusCandidatePopup.js
@@ -2,7 +2,6 @@
 
 const Clutter = imports.gi.Clutter;
 const IBus = imports.gi.IBus;
-const Lang = imports.lang;
 const Signals = imports.signals;
 const St = imports.gi.St;
 
@@ -14,10 +13,8 @@ var MAX_CANDIDATES_PER_PAGE = 16;
 var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
                              '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
 
-var CandidateArea = new Lang.Class({
-    Name: 'CandidateArea',
-
-    _init() {
+var CandidateArea = class CandidateArea {
+    constructor() {
         this.actor = new St.BoxLayout({ vertical: true,
                                         reactive: true,
                                         visible: false });
@@ -74,7 +71,7 @@ var CandidateArea = new Lang.Class({
 
         this._orientation = -1;
         this._cursorPosition = 0;
-    },
+    }
 
     setOrientation(orientation) {
         if (this._orientation == orientation)
@@ -95,7 +92,7 @@ var CandidateArea = new Lang.Class({
             this._previousButton.child.icon_name = 'go-up-symbolic';
             this._nextButton.child.icon_name = 'go-down-symbolic';
         }
-    },
+    }
 
     setCandidates(indexes, candidates, cursorPosition, cursorVisible) {
         for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) {
@@ -114,7 +111,7 @@ var CandidateArea = new Lang.Class({
         this._cursorPosition = cursorPosition;
         if (cursorVisible)
             this._candidateBoxes[cursorPosition].add_style_pseudo_class('selected');
-    },
+    }
 
     updateButtons(wrapsAround, page, nPages) {
         if (nPages < 2) {
@@ -124,14 +121,12 @@ var CandidateArea = new Lang.Class({
         this._buttonBox.show();
         this._previousButton.reactive = wrapsAround || page > 0;
         this._nextButton.reactive = wrapsAround || page < nPages - 1;
-    },
-});
+    }
+};
 Signals.addSignalMethods(CandidateArea.prototype);
 
-var CandidatePopup = new Lang.Class({
-    Name: 'CandidatePopup',
-
-    _init() {
+var CandidatePopup = class CandidatePopup {
+    constructor() {
         this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP);
         this._boxPointer.visible = false;
         this._boxPointer.style_class = 'candidate-popup-boxpointer';
@@ -171,7 +166,7 @@ var CandidatePopup = new Lang.Class({
         });
 
         this._panelService = null;
-    },
+    }
 
     setPanelService(panelService) {
         this._panelService = panelService;
@@ -275,13 +270,13 @@ var CandidatePopup = new Lang.Class({
             this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
             Main.keyboard.resetSuggestions();
         });
-    },
+    }
 
     _setDummyCursorGeometry(x, y, w, h) {
         Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
         if (this._boxPointer.actor.visible)
             this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
-    },
+    }
 
     _updateVisibility() {
         let isVisible = (!Main.keyboard.visible &&
@@ -296,7 +291,7 @@ var CandidatePopup = new Lang.Class({
         } else {
             this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
         }
-    },
+    }
 
     _setTextAttributes(clutterText, ibusAttrList) {
         let attr;
@@ -304,4 +299,4 @@ var CandidatePopup = new Lang.Class({
             if (attr.get_attr_type() == IBus.AttrType.BACKGROUND)
                 clutterText.set_selection(attr.get_start_index(), attr.get_end_index());
     }
-});
+};
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index fac42671d..518379cbe 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -6,6 +6,7 @@ const Gdk = imports.gi.Gdk;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Lang = imports.lang;
+const GObject = imports.gi.GObject;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
@@ -155,33 +156,28 @@ var KeyContainer = new Lang.Class({
     }
 });
 
-var Suggestions = new Lang.Class({
-    Name: 'Suggestions',
-
-    _init() {
+var Suggestions = class {
+    constructor() {
         this.actor = new St.BoxLayout({ style_class: 'word-suggestions',
                                         vertical: false });
         this.actor.show();
-    },
+    }
 
     add(word, callback) {
         let button = new St.Button({ label: word });
         button.connect('clicked', callback);
         this.actor.add(button);
-    },
+    }
 
     clear() {
         this.actor.remove_all_children();
-    },
-});
+    }
+};
 Signals.addSignalMethods(Suggestions.prototype);
 
-var LanguageSelectionPopup = new Lang.Class({
-    Name: 'LanguageSelectionPopup',
-    Extends: PopupMenu.PopupMenu,
-
-    _init(actor) {
-        this.parent(actor, 0.5, St.Side.BOTTOM);
+var LanguageSelectionPopup = class extends PopupMenu.PopupMenu {
+    constructor(actor) {
+        super(actor, 0.5, St.Side.BOTTOM);
 
         let inputSourceManager = InputSourceManager.getInputSourceManager();
         let inputSources = inputSourceManager.inputSources;
@@ -202,7 +198,7 @@ var LanguageSelectionPopup = new Lang.Class({
             if (!actor.is_mapped())
                 this.close(true);
         });
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         if (event.get_source() == this.actor ||
@@ -213,35 +209,33 @@ var LanguageSelectionPopup = new Lang.Class({
             this.close(true);
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     open(animate) {
-        this.parent(animate);
+        super.open(animate);
         this._capturedEventId = global.stage.connect('captured-event',
                                                      this._onCapturedEvent.bind(this));
-    },
+    }
 
     close(animate) {
-        this.parent(animate);
+        super.close(animate);
         if (this._capturedEventId != 0) {
             global.stage.disconnect(this._capturedEventId);
             this._capturedEventId = 0;
         }
-    },
+    }
 
     destroy() {
         if (this._capturedEventId != 0)
             global.stage.disconnect(this._capturedEventId);
         if (this._unmapId != 0)
             this.sourceActor.disconnect(this._unmapId);
-        this.parent();
-    },
-});
-
-var Key = new Lang.Class({
-    Name: 'Key',
+        super.destroy();
+    }
+};
 
-    _init(key, extendedKeys) {
+var Key = class Key {
+    constructor(key) {
         this.key = key || "";
         this.keyButton = this._makeKey(this.key);
 
@@ -260,14 +254,14 @@ var Key = new Lang.Class({
         this._capturedEventId = 0;
         this._unmapId = 0;
         this._longPress = false;
-    },
+    }
 
     _onDestroy() {
         if (this._boxPointer) {
             this._boxPointer.destroy();
             this._boxPointer = null;
         }
-    },
+    }
 
     _ensureExtendedKeysPopup() {
         if (this._extended_keys.length == 0)
@@ -285,12 +279,12 @@ var Key = new Lang.Class({
         this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
         this._getExtendedKeys();
         this.keyButton._extended_keys = this._extended_keyboard;
-    },
+    }
 
     _getKeyval(key) {
         let unicode = String.charCodeAt(key, 0);
         return Gdk.unicode_to_keyval(unicode);
-    },
+    }
 
     _press(key) {
         if (key != this.key || this._extended_keys.length == 0) {
@@ -317,7 +311,7 @@ var Key = new Lang.Class({
                                                         return GLib.SOURCE_REMOVE;
                                                     });
         }
-    },
+    }
 
     _release(key) {
         if (this._pressTimeoutId != 0) {
@@ -331,7 +325,7 @@ var Key = new Lang.Class({
         this.emit('released', this._getKeyval(key), key);
         this._hideSubkeys();
         this._longPress = false;
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         let type = event.type();
@@ -348,7 +342,7 @@ var Key = new Lang.Class({
             this._hideSubkeys();
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _showSubkeys() {
         this._boxPointer.open(BoxPointer.PopupAnimation.FULL);
@@ -358,7 +352,7 @@ var Key = new Lang.Class({
             if (!this.keyButton.is_mapped())
                 this._hideSubkeys();
         });
-    },
+    }
 
     _hideSubkeys() {
         if (this._boxPointer)
@@ -372,7 +366,7 @@ var Key = new Lang.Class({
             this._unmapId = 0;
         }
         this._capturedPress = false;
-    },
+    }
 
     _makeKey(key) {
         let label = GLib.markup_escape_text(key, -1);
@@ -418,7 +412,7 @@ var Key = new Lang.Class({
         });
 
         return button;
-    },
+    }
 
     _getExtendedKeys() {
         this._extended_keyboard = new St.BoxLayout({ style_class: 'key-container',
@@ -434,35 +428,33 @@ var Key = new Lang.Class({
             key.height = this.keyButton.height;
         }
         this._boxPointer.bin.add_actor(this._extended_keyboard);
-    },
+    }
 
     get subkeys() {
         return this._boxPointer;
-    },
+    }
 
     setWidth(width) {
         this.keyButton.keyWidth = width;
-    },
+    }
 
     setLatched(latched) {
         if (latched)
             this.keyButton.add_style_pseudo_class('latched');
         else
             this.keyButton.remove_style_pseudo_class('latched');
-    },
-});
+    }
+};
 Signals.addSignalMethods(Key.prototype);
 
-var KeyboardModel = new Lang.Class({
-    Name: 'KeyboardModel',
-
-    _init(groupName) {
+var KeyboardModel = class {
+    constructor(groupName) {
         try {
             this._model = this._loadModel(groupName);
         } catch (e) {
             this._model = this._loadModel('us');
         }
-    },
+    }
 
     _loadModel(groupName) {
         let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName));
@@ -471,21 +463,19 @@ var KeyboardModel = new Lang.Class({
             contents = imports.byteArray.toString(contents);
 
         return JSON.parse(contents);
-    },
+    }
 
     getLevels() {
         return this._model.levels;
-    },
+    }
 
     getKeysForLevel(levelName) {
         return this._model.levels.find(level => level == levelName);
     }
-});
-
-var FocusTracker = new Lang.Class({
-    Name: 'FocusTracker',
+};
 
-    _init() {
+var FocusTracker = class {
+    constructor() {
         this._currentWindow = null;
         this._rect = null;
 
@@ -520,15 +510,15 @@ var FocusTracker = new Lang.Class({
         this._ibusManager.connect('focus-out', () => {
             this.emit('focus-changed', false);
         });
-    },
+    }
 
     get currentWindow() {
         return this._currentWindow;
-    },
+    }
 
     _setCurrentWindow(window) {
         this._currentWindow = window;
-    },
+    }
 
     _setCurrentRect(rect) {
         if (this._currentWindow) {
@@ -546,7 +536,7 @@ var FocusTracker = new Lang.Class({
 
         this._rect = rect;
         this.emit('position-changed');
-    },
+    }
 
     getCurrentRect() {
         let rect = { x: this._rect.x, y: this._rect.y,
@@ -560,13 +550,11 @@ var FocusTracker = new Lang.Class({
 
         return rect;
     }
-});
+};
 Signals.addSignalMethods(FocusTracker.prototype);
 
-var Keyboard = new Lang.Class({
-    Name: 'Keyboard',
-
-    _init() {
+var Keyboard = class Keyboard {
+    constructor() {
         this.actor = null;
         this._focusInExtendedKeys = false;
 
@@ -624,16 +612,16 @@ var Keyboard = new Lang.Class({
         this._keyboardRestingId = 0;
 
         Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
-    },
+    }
 
     get visible() {
         return this._keyboardVisible;
-    },
+    }
 
     _onFocusPositionChanged(focusTracker) {
         let rect = focusTracker.getCurrentRect();
         this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);
-    },
+    }
 
     _lastDeviceIsTouchscreen() {
         if (!this._lastDeviceId)
@@ -646,7 +634,7 @@ var Keyboard = new Lang.Class({
             return false;
 
         return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE;
-    },
+    }
 
     _syncEnabled() {
         let wasEnabled = this._enabled;
@@ -662,7 +650,7 @@ var Keyboard = new Lang.Class({
 
         if (!this._enabled && wasEnabled)
             Main.layoutManager.hideKeyboard(true);
-    },
+    }
 
     _destroyKeyboard() {
         if (this._keyboardNotifyId)
@@ -681,7 +669,7 @@ var Keyboard = new Lang.Class({
             this._languagePopup.destroy();
             this._languagePopup = null;
         }
-    },
+    }
 
     _setupKeyboard() {
         this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
@@ -715,7 +703,7 @@ var Keyboard = new Lang.Class({
         this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
 
         this._relayout();
-    },
+    }
 
     _onKeyFocusChanged() {
         let focus = global.stage.key_focus;
@@ -739,7 +727,7 @@ var Keyboard = new Lang.Class({
           });
           GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
         }
-    },
+    }
 
     _createLayersForGroup(groupName) {
         let keyboardModel = new KeyboardModel(groupName);
@@ -764,12 +752,12 @@ var Keyboard = new Lang.Class({
             layout.hide();
         }
         return layers;
-    },
+    }
 
     _ensureKeysForGroup(group) {
         if (!this._groups[group])
             this._groups[group] = this._createLayersForGroup(group);
-    },
+    }
 
     _addRowKeys(keys, layout) {
         for (let i = 0; i < keys.length; ++i) {
@@ -802,7 +790,7 @@ var Keyboard = new Lang.Class({
 
             layout.appendKey(button.actor, button.keyButton.keyWidth);
         }
-    },
+    }
 
     _popupLanguageMenu(keyActor) {
         if (this._languagePopup)
@@ -811,7 +799,7 @@ var Keyboard = new Lang.Class({
         this._languagePopup = new LanguageSelectionPopup(keyActor);
         Main.layoutManager.addChrome(this._languagePopup.actor);
         this._languagePopup.open(true);
-    },
+    }
 
     _loadDefaultKeys(keys, layout, numLevels, numKeys) {
         let extraButton;
@@ -876,14 +864,14 @@ var Keyboard = new Lang.Class({
 
             layout.appendKey(extraButton.actor, extraButton.keyButton.keyWidth);
         }
-    },
+    }
 
     _setCurrentLevelLatched(layout, latched) {
         for (let i = 0; layout.shiftKeys[i]; i++) {
             let key = layout.shiftKeys[i];
             key.setLatched(latched);
         }
-    },
+    }
 
     _getDefaultKeysForRow(row, numRows, level) {
         let pre, post;
@@ -901,7 +889,7 @@ var Keyboard = new Lang.Class({
         } else {
             return [null, null];
         }
-    },
+    }
 
     _mergeRowKeys(layout, pre, row, post, numLevels) {
         if (pre != null)
@@ -911,7 +899,7 @@ var Keyboard = new Lang.Class({
 
         if (post != null)
             this._loadDefaultKeys(post, layout, numLevels, row.length);
-    },
+    }
 
     _loadRows(model, level, numLevels, layout) {
         let rows = model.rows;
@@ -920,7 +908,7 @@ var Keyboard = new Lang.Class({
             let [pre, post] = this._getDefaultKeysForRow(i, rows.length, level);
             this._mergeRowKeys (layout, pre, rows[i], post, numLevels);
         }
-    },
+    }
 
     _getGridSlots() {
         let numOfHorizSlots = 0, numOfVertSlots;
@@ -935,7 +923,7 @@ var Keyboard = new Lang.Class({
         }
 
         return [numOfHorizSlots, numOfVertSlots];
-    },
+    }
 
     _relayout() {
         let monitor = Main.layoutManager.keyboardMonitor;
@@ -946,17 +934,17 @@ var Keyboard = new Lang.Class({
         let maxHeight = monitor.height / 3;
         this.actor.width = monitor.width;
         this.actor.height = maxHeight;
-    },
+    }
 
     _onGroupChanged() {
         this._ensureKeysForGroup(this._keyboardController.getCurrentGroup());
         this._setActiveLayer(0);
-    },
+    }
 
     _onKeyboardGroupsChanged(keyboard) {
         this._groups = [];
         this._onGroupChanged();
-    },
+    }
 
     _onKeyboardStateChanged(controller, state) {
         let enabled;
@@ -973,7 +961,7 @@ var Keyboard = new Lang.Class({
             this.show(Main.layoutManager.focusIndex);
         else
             this.hide();
-    },
+    }
 
     _setActiveLayer(activeLevel) {
         let activeGroupName = this._keyboardController.getCurrentGroup();
@@ -986,20 +974,20 @@ var Keyboard = new Lang.Class({
 
         this._current_page = layers[activeLevel];
         this._current_page.show();
-    },
+    }
 
     shouldTakeEvent(event) {
         let actor = event.get_source();
         return Main.layoutManager.keyboardBox.contains(actor) ||
                !!actor._extended_keys || !!actor.extended_key;
-    },
+    }
 
     _clearKeyboardRestTimer() {
         if (!this._keyboardRestingId)
             return;
         GLib.source_remove(this._keyboardRestingId);
         this._keyboardRestingId = 0;
-    },
+    }
 
     show(monitor) {
         if (!this._enabled)
@@ -1025,7 +1013,7 @@ var Keyboard = new Lang.Class({
                                                        return GLib.SOURCE_REMOVE;
                                                    });
         GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
-    },
+    }
 
     _show(monitor) {
         if (!this._keyboardRequested)
@@ -1039,7 +1027,7 @@ var Keyboard = new Lang.Class({
             this._setAnimationWindow(this._delayedAnimFocusWindow);
             this._delayedAnimFocusWindow = null;
         }
-    },
+    }
 
     hide() {
         if (!this._enabled)
@@ -1060,7 +1048,7 @@ var Keyboard = new Lang.Class({
                                                        return GLib.SOURCE_REMOVE;
                                                    });
         GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
-    },
+    }
 
     _hide() {
         if (this._keyboardRequested)
@@ -1068,7 +1056,7 @@ var Keyboard = new Lang.Class({
 
         Main.layoutManager.hideKeyboard();
         this.setCursorLocation(null);
-    },
+    }
 
     _hideSubkeys() {
         if (this._subkeysBoxPointer) {
@@ -1080,26 +1068,26 @@ var Keyboard = new Lang.Class({
             this._capturedEventId = 0;
         }
         this._capturedPress = false;
-    },
+    }
 
     resetSuggestions() {
         if (this._suggestions)
             this._suggestions.clear();
-    },
+    }
 
     addSuggestion(text, callback) {
         if (!this._suggestions)
             return;
         this._suggestions.add(text, callback);
         this._suggestions.actor.show();
-    },
+    }
 
     _clearShowIdle() {
         if (!this._showIdleId)
             return;
         GLib.source_remove(this._showIdleId);
         this._showIdleId = 0;
-    },
+    }
 
     _windowSlideAnimationComplete(window, delta) {
         // Synchronize window and actor positions again.
@@ -1107,7 +1095,7 @@ var Keyboard = new Lang.Class({
         let frameRect = window.get_frame_rect();
         frameRect.y += delta;
         window.move_frame(true, frameRect.x, frameRect.y);
-    },
+    }
 
     _animateWindow(window, show) {
         let windowActor = window.get_compositor_private();
@@ -1130,7 +1118,7 @@ var Keyboard = new Lang.Class({
                                onComplete: this._windowSlideAnimationComplete,
                                onCompleteParams: [window, deltaY] });
         }
-    },
+    }
 
     _setAnimationWindow(window) {
         if (this._animFocusedWindow == window)
@@ -1142,7 +1130,7 @@ var Keyboard = new Lang.Class({
             this._animateWindow(window, true);
 
         this._animFocusedWindow = window;
-    },
+    }
 
     setCursorLocation(window, x, y , w, h) {
         let monitor = Main.layoutManager.keyboardMonitor;
@@ -1165,14 +1153,11 @@ var Keyboard = new Lang.Class({
         }
 
         this._oskFocusWindow = window;
-    },
-});
-
-var KeyboardController = new Lang.Class({
-    Name: 'KeyboardController',
+    }
+};
 
-    _init() {
-        this.parent();
+var KeyboardController = class {
+    constructor() {
         let deviceManager = Clutter.DeviceManager.get_default();
         this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
 
@@ -1190,24 +1175,24 @@ var KeyboardController = new Lang.Class({
         Main.inputMethod.connect('input-panel-state', (o, state) => {
             this.emit('panel-state', state);
         });
-    },
+    }
 
     _onSourcesModified() {
         this.emit('groups-changed');
-    },
+    }
 
     _onSourceChanged(inputSourceManager, oldSource) {
         let source = inputSourceManager.currentSource;
         this._currentSource = source;
         this.emit('active-group', source.id);
-    },
+    }
 
     _onContentPurposeHintsChanged(method) {
         let hints = method.content_hints;
         let purpose = method.content_purpose;
 
         // XXX: hook numeric/emoji/etc special keyboards
-    },
+    }
 
     getGroups() {
         let inputSources = this._inputSourceManager.inputSources;
@@ -1219,11 +1204,11 @@ var KeyboardController = new Lang.Class({
         }
 
         return groups;
-    },
+    }
 
     getCurrentGroup() {
         return this._currentSource.xkbId;
-    },
+    }
 
     commitString(string, fromKey) {
         if (string == null)
@@ -1234,16 +1219,16 @@ var KeyboardController = new Lang.Class({
 
         Main.inputMethod.commit(string);
         return true;
-    },
+    }
 
     keyvalPress(keyval) {
         this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
                                           keyval, Clutter.KeyState.PRESSED);
-    },
+    }
 
     keyvalRelease(keyval) {
         this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
                                           keyval, Clutter.KeyState.RELEASED);
-    },
-});
+    }
+};
 Signals.addSignalMethods(KeyboardController.prototype);
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 1e223934c..22b2807a9 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -153,21 +153,19 @@ var MonitorConstraint = new Lang.Class({
     }
 });
 
-var Monitor = new Lang.Class({
-    Name: 'Monitor',
-
-    _init(index, geometry) {
+var Monitor = class Monitor {
+    constructor(index, geometry) {
         this.index = index;
         this.x = geometry.x;
         this.y = geometry.y;
         this.width = geometry.width;
         this.height = geometry.height;
-    },
+    }
 
     get inFullscreen() {
         return global.display.get_monitor_in_fullscreen(this.index);
     }
-})
+};
 
 const defaultParams = {
     trackFullscreen: false,
@@ -1083,10 +1081,8 @@ var LayoutManager = new Lang.Class({
 //
 // This class manages a "hot corner" that can toggle switching to
 // overview.
-var HotCorner = new Lang.Class({
-    Name: 'HotCorner',
-
-    _init(layoutManager, monitor, x, y) {
+var HotCorner = class HotCorner {
+    constructor(layoutManager, monitor, x, y) {
         // We use this flag to mark the case where the user has entered the
         // hot corner and has not left both the hot corner and a surrounding
         // guard area (the "environs"). This avoids triggering the hot corner
@@ -1114,7 +1110,7 @@ var HotCorner = new Lang.Class({
         layoutManager.uiGroup.add_actor(this._ripple1);
         layoutManager.uiGroup.add_actor(this._ripple2);
         layoutManager.uiGroup.add_actor(this._ripple3);
-    },
+    }
 
     setBarrierSize(size) {
         if (this._verticalBarrier) {
@@ -1149,7 +1145,7 @@ var HotCorner = new Lang.Class({
             this._pressureBarrier.addBarrier(this._verticalBarrier);
             this._pressureBarrier.addBarrier(this._horizontalBarrier);
         }
-    },
+    }
 
     _setupFallbackCornerIfNeeded(layoutManager) {
         if (!global.display.supports_extended_barriers()) {
@@ -1184,7 +1180,7 @@ var HotCorner = new Lang.Class({
             this._corner.connect('leave-event',
                                  this._onCornerLeft.bind(this));
         }
-    },
+    }
 
     destroy() {
         this.setBarrierSize(0);
@@ -1193,7 +1189,7 @@ var HotCorner = new Lang.Class({
 
         if (this.actor)
             this.actor.destroy();
-    },
+    }
 
     _animRipple(ripple, delay, time, startScale, startOpacity, finalScale) {
         // We draw a ripple by using a source image and animating it scaling
@@ -1223,7 +1219,7 @@ var HotCorner = new Lang.Class({
                                    transition: 'linear',
                                    onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
                                    onComplete() { ripple.visible = false; } });
-    },
+    }
 
     _rippleAnimation() {
         // Show three concentric ripples expanding outwards; the exact
@@ -1234,7 +1230,7 @@ var HotCorner = new Lang.Class({
         this._animRipple(this._ripple1, 0.0,   0.83,  0.25,  1.0,     1.5);
         this._animRipple(this._ripple2, 0.05,  1.0,   0.0,   0.7,     1.25);
         this._animRipple(this._ripple3, 0.35,  1.0,   0.0,   0.3,     1);
-    },
+    }
 
     _toggleOverview() {
         if (this._monitor.inFullscreen && !Main.overview.visible)
@@ -1244,7 +1240,7 @@ var HotCorner = new Lang.Class({
             this._rippleAnimation();
             Main.overview.toggle();
         }
-    },
+    }
 
     handleDragOver(source, actor, x, y, time) {
         if (source != Main.xdndHandler)
@@ -1253,7 +1249,7 @@ var HotCorner = new Lang.Class({
         this._toggleOverview();
 
         return DND.DragMotionResult.CONTINUE;
-    },
+    }
 
     _onCornerEntered() {
         if (!this._entered) {
@@ -1261,26 +1257,24 @@ var HotCorner = new Lang.Class({
             this._toggleOverview();
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onCornerLeft(actor, event) {
         if (event.get_related() != this.actor)
             this._entered = false;
         // Consume event, otherwise this will confuse onEnvironsLeft
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onEnvironsLeft(actor, event) {
         if (event.get_related() != this._corner)
             this._entered = false;
         return Clutter.EVENT_PROPAGATE;
     }
-});
-
-var PressureBarrier = new Lang.Class({
-    Name: 'PressureBarrier',
+};
 
-    _init(threshold, timeout, actionMode) {
+var PressureBarrier = class PressureBarrier {
+    constructor(threshold, timeout, actionMode) {
         this._threshold = threshold;
         this._timeout = timeout;
         this._actionMode = actionMode;
@@ -1289,57 +1283,57 @@ var PressureBarrier = new Lang.Class({
 
         this._isTriggered = false;
         this._reset();
-    },
+    }
 
     addBarrier(barrier) {
         barrier._pressureHitId = barrier.connect('hit', this._onBarrierHit.bind(this));
         barrier._pressureLeftId = barrier.connect('left', this._onBarrierLeft.bind(this));
 
         this._barriers.push(barrier);
-    },
+    }
 
     _disconnectBarrier(barrier) {
         barrier.disconnect(barrier._pressureHitId);
         barrier.disconnect(barrier._pressureLeftId);
-    },
+    }
 
     removeBarrier(barrier) {
         this._disconnectBarrier(barrier);
         this._barriers.splice(this._barriers.indexOf(barrier), 1);
-    },
+    }
 
     destroy() {
         this._barriers.forEach(this._disconnectBarrier.bind(this));
         this._barriers = [];
-    },
+    }
 
     setEventFilter(filter) {
         this._eventFilter = filter;
-    },
+    }
 
     _reset() {
         this._barrierEvents = [];
         this._currentPressure = 0;
         this._lastTime = 0;
-    },
+    }
 
     _isHorizontal(barrier) {
         return barrier.y1 == barrier.y2;
-    },
+    }
 
     _getDistanceAcrossBarrier(barrier, event) {
         if (this._isHorizontal(barrier))
             return Math.abs(event.dy);
         else
             return Math.abs(event.dx);
-    },
+    }
 
     _getDistanceAlongBarrier(barrier, event) {
         if (this._isHorizontal(barrier))
             return Math.abs(event.dx);
         else
             return Math.abs(event.dy);
-    },
+    }
 
     _trimBarrierEvents() {
         // Events are guaranteed to be sorted in time order from
@@ -1363,7 +1357,7 @@ var PressureBarrier = new Lang.Class({
         }
 
         this._barrierEvents = this._barrierEvents.slice(firstNewEvent);
-    },
+    }
 
     _onBarrierLeft(barrier, event) {
         barrier._isHit = false;
@@ -1371,13 +1365,13 @@ var PressureBarrier = new Lang.Class({
             this._reset();
             this._isTriggered = false;
         }
-    },
+    }
 
     _trigger() {
         this._isTriggered = true;
         this.emit('trigger');
         this._reset();
-    },
+    }
 
     _onBarrierHit(barrier, event) {
         barrier._isHit = true;
@@ -1419,5 +1413,5 @@ var PressureBarrier = new Lang.Class({
         if (this._currentPressure >= this._threshold)
             this._trigger();
     }
-});
+};
 Signals.addSignalMethods(PressureBarrier.prototype);
diff --git a/js/ui/lightbox.js b/js/ui/lightbox.js
index 76562492a..120aafd6f 100644
--- a/js/ui/lightbox.js
+++ b/js/ui/lightbox.js
@@ -91,10 +91,8 @@ var RadialShaderQuad = new Lang.Class({
  * @container and will track any changes in its size. You can override
  * this by passing an explicit width and height in @params.
  */
-var Lightbox = new Lang.Class({
-    Name: 'Lightbox',
-
-    _init(container, params) {
+var Lightbox = class Lightbox {
+    constructor(container, params) {
         params = Params.parse(params, { inhibitEvents: false,
                                         width: null,
                                         height: null,
@@ -137,7 +135,7 @@ var Lightbox = new Lang.Class({
         this._actorRemovedSignalId = container.connect('actor-removed', this._actorRemoved.bind(this));
 
         this._highlighted = null;
-    },
+    }
 
     _actorAdded(container, newChild) {
         let children = this._container.get_children();
@@ -159,7 +157,7 @@ var Lightbox = new Lang.Class({
             if (prevChild != -1) // paranoia
                 this._children.splice(prevChild + 1, 0, newChild);
         }
-    },
+    }
 
     show(fadeInTime) {
         fadeInTime = fadeInTime || 0;
@@ -189,7 +187,7 @@ var Lightbox = new Lang.Class({
         }
 
         this.actor.show();
-    },
+    }
 
     hide(fadeOutTime) {
         fadeOutTime = fadeOutTime || 0;
@@ -217,7 +215,7 @@ var Lightbox = new Lang.Class({
                                }
                              });
         }
-    },
+    }
 
     _actorRemoved(container, child) {
         let index = this._children.indexOf(child);
@@ -226,7 +224,7 @@ var Lightbox = new Lang.Class({
 
         if (child == this._highlighted)
             this._highlighted = null;
-    },
+    }
 
     /**
      * highlight:
@@ -257,7 +255,7 @@ var Lightbox = new Lang.Class({
         }
 
         this._highlighted = window;
-    },
+    }
 
     /**
      * destroy:
@@ -266,7 +264,7 @@ var Lightbox = new Lang.Class({
      */
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     /**
      * _onDestroy:
@@ -280,5 +278,5 @@ var Lightbox = new Lang.Class({
 
         this.highlight(null);
     }
-});
+};
 Signals.addSignalMethods(Lightbox.prototype);
diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js
index 186b53ce3..26e21c4ee 100644
--- a/js/ui/lookingGlass.js
+++ b/js/ui/lookingGlass.js
@@ -62,14 +62,12 @@ function _getAutoCompleteGlobalKeywords() {
     return keywords.concat(windowProperties).concat(headerProperties);
 }
 
-var AutoComplete = new Lang.Class({
-    Name: 'AutoComplete',
-
-    _init(entry) {
+var AutoComplete = class AutoComplete {
+    constructor(entry) {
         this._entry = entry;
         this._entry.connect('key-press-event', this._entryKeyPressEvent.bind(this));
         this._lastTabTime = global.get_current_time();
-    },
+    }
 
     _processCompletionRequest(event) {
         if (event.completions.length == 0) {
@@ -91,7 +89,7 @@ var AutoComplete = new Lang.Class({
         } else if (event.completions.length > 1 && event.tabType === 'double') {
             this.emit('suggest', { completions: event.completions});
         }
-    },
+    }
 
     _entryKeyPressEvent(actor, event) {
         let cursorPos = this._entry.clutter_text.get_cursor_position();
@@ -114,7 +112,7 @@ var AutoComplete = new Lang.Class({
             this._lastTabTime = currTime;
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     // Insert characters of text not already included in head at cursor position.  i.e., if text="abc" and 
head="a",
     // the string "bc" will be appended to this._entry
@@ -124,21 +122,19 @@ var AutoComplete = new Lang.Class({
 
         this._entry.clutter_text.insert_text(additionalCompletionText, cursorPos);
     }
-});
+};
 Signals.addSignalMethods(AutoComplete.prototype);
 
 
-var Notebook = new Lang.Class({
-    Name: 'Notebook',
-
-    _init() {
+var Notebook = class Notebook {
+    constructor() {
         this.actor = new St.BoxLayout({ vertical: true });
 
         this.tabControls = new St.BoxLayout({ style_class: 'labels' });
 
         this._selectedIndex = -1;
         this._tabs = [];
-    },
+    }
 
     appendPage(name, child) {
         let labelBox = new St.BoxLayout({ style_class: 'notebook-tab',
@@ -171,7 +167,7 @@ var Notebook = new Lang.Class({
 
         if (this._selectedIndex == -1)
             this.selectIndex(0);
-    },
+    }
 
     _unselect() {
         if (this._selectedIndex < 0)
@@ -180,7 +176,7 @@ var Notebook = new Lang.Class({
         tabData.labelBox.remove_style_pseudo_class('selected');
         tabData.scrollView.hide();
         this._selectedIndex = -1;
-    },
+    }
 
     selectIndex(index) {
         if (index == this._selectedIndex)
@@ -202,7 +198,7 @@ var Notebook = new Lang.Class({
         tabData.scrollView.show();
         this._selectedIndex = index;
         this.emit('selection', tabData.child);
-    },
+    }
 
     selectChild(child) {
         if (child == null)
@@ -216,26 +212,26 @@ var Notebook = new Lang.Class({
                 }
             }
         }
-    },
+    }
 
     scrollToBottom(index) {
         let tabData = this._tabs[index];
         tabData._scrollToBottom = true;
 
-    },
+    }
 
     _onAdjustValueChanged(tabData) {
         let vAdjust = tabData.scrollView.vscroll.adjustment;
         if (vAdjust.value < (vAdjust.upper - vAdjust.lower - 0.5))
             tabData._scrolltoBottom = false;
-    },
+    }
 
     _onAdjustScopeChanged(tabData) {
         if (!tabData._scrollToBottom)
             return;
         let vAdjust = tabData.scrollView.vscroll.adjustment;
         vAdjust.value = vAdjust.upper - vAdjust.page_size;
-    },
+    }
 
     nextTab() {
         let nextIndex = this._selectedIndex;
@@ -244,7 +240,7 @@ var Notebook = new Lang.Class({
         }
 
         this.selectIndex(nextIndex);
-    },
+    }
 
     prevTab() {
         let prevIndex = this._selectedIndex;
@@ -254,7 +250,7 @@ var Notebook = new Lang.Class({
 
         this.selectIndex(prevIndex);
     }
-});
+};
 Signals.addSignalMethods(Notebook.prototype);
 
 function objectToString(o) {
@@ -266,10 +262,8 @@ function objectToString(o) {
     }
 }
 
-var ObjLink = new Lang.Class({
-    Name: 'ObjLink',
-
-    _init(lookingGlass, o, title) {
+var ObjLink = class ObjLink {
+    constructor(lookingGlass, o, title) {
         let text;
         if (title)
             text = title;
@@ -286,17 +280,15 @@ var ObjLink = new Lang.Class({
         this.actor.connect('clicked', this._onClicked.bind(this));
 
         this._lookingGlass = lookingGlass;
-    },
+    }
 
     _onClicked(link) {
         this._lookingGlass.inspectObject(this._obj, this.actor);
     }
-});
-
-var Result = new Lang.Class({
-    Name: 'Result',
+};
 
-    _init(lookingGlass, command, o, index) {
+var Result = class Result {
+    constructor(lookingGlass, command, o, index) {
         this.index = index;
         this.o = o;
 
@@ -314,12 +306,10 @@ var Result = new Lang.Class({
         let objLink = new ObjLink(this._lookingGlass, o);
         box.add(objLink.actor);
     }
-});
-
-var WindowList = new Lang.Class({
-    Name: 'WindowList',
+};
 
-    _init(lookingGlass) {
+var WindowList = class WindowList {
+    constructor(lookingGlass) {
         this.actor = new St.BoxLayout({ name: 'Windows', vertical: true, style: 'spacing: 8px' });
         let tracker = Shell.WindowTracker.get_default();
         this._updateId = Main.initializeDeferredWork(this.actor, this._updateWindowList.bind(this));
@@ -327,7 +317,7 @@ var WindowList = new Lang.Class({
         tracker.connect('tracked-windows-changed', this._updateWindowList.bind(this));
 
         this._lookingGlass = lookingGlass;
-    },
+    }
 
     _updateWindowList() {
         this.actor.destroy_all_children();
@@ -361,13 +351,11 @@ var WindowList = new Lang.Class({
             }
         }
     }
-});
+};
 Signals.addSignalMethods(WindowList.prototype);
 
-var ObjInspector = new Lang.Class({
-    Name: 'ObjInspector',
-
-    _init(lookingGlass) {
+var ObjInspector = class ObjInspector {
+    constructor(lookingGlass) {
         this._obj = null;
         this._previousObj = null;
 
@@ -382,7 +370,7 @@ var ObjInspector = new Lang.Class({
         this.actor.add_actor(this._container);
 
         this._lookingGlass = lookingGlass;
-    },
+    }
 
     selectObject(obj, skipPrevious) {
         if (!skipPrevious)
@@ -436,7 +424,7 @@ var ObjInspector = new Lang.Class({
                 this._container.add_actor(hbox);
             }
         }
-    },
+    }
 
     open(sourceActor) {
         if (this._open)
@@ -452,7 +440,7 @@ var ObjInspector = new Lang.Class({
         } else {
             this.actor.set_scale(1, 1);
         }
-    },
+    }
 
     close() {
         if (!this._open)
@@ -461,18 +449,18 @@ var ObjInspector = new Lang.Class({
         this.actor.hide();
         this._previousObj = null;
         this._obj = null;
-    },
+    }
 
     _onInsert() {
         let obj = this._obj;
         this.close();
         this._lookingGlass.insertObject(obj);
-    },
+    }
 
     _onBack() {
         this.selectObject(this._previousObj, true);
     }
-});
+};
 
 var RedBorderEffect = new Lang.Class({
     Name: 'RedBorderEffect',
@@ -637,10 +625,8 @@ var Inspector = new Lang.Class({
     }
 });
 
-var Extensions = new Lang.Class({
-    Name: 'Extensions',
-
-    _init(lookingGlass) {
+var Extensions = class Extensions {
+    constructor(lookingGlass) {
         this._lookingGlass = lookingGlass;
         this.actor = new St.BoxLayout({ vertical: true,
                                         name: 'lookingGlassExtensions' });
@@ -657,7 +643,7 @@ var Extensions = new Lang.Class({
 
         ExtensionSystem.connect('extension-loaded',
                                 this._loadExtension.bind(this));
-    },
+    }
 
     _loadExtension(o, uuid) {
         let extension = ExtensionUtils.extensions[uuid];
@@ -672,20 +658,20 @@ var Extensions = new Lang.Class({
 
         this._numExtensions ++;
         this._extensionsList.add(extensionDisplay);
-    },
+    }
 
     _onViewSource(actor) {
         let extension = actor._extension;
         let uri = extension.dir.get_uri();
         Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context(0, -1));
         this._lookingGlass.close();
-    },
+    }
 
     _onWebPage(actor) {
         let extension = actor._extension;
         Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context(0, -1));
         this._lookingGlass.close();
-    },
+    }
 
     _onViewErrors(actor) {
         let extension = actor._extension;
@@ -713,7 +699,7 @@ var Extensions = new Lang.Class({
         }
 
         actor._isShowing = shouldShow;
-    },
+    }
 
     _stateToString(extensionState) {
         switch (extensionState) {
@@ -730,7 +716,7 @@ var Extensions = new Lang.Class({
                 return _("Downloading");
         }
         return 'Unknown'; // Not translated, shouldn't appear
-    },
+    }
 
     _createExtensionDisplay(extension) {
         let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
@@ -778,12 +764,10 @@ var Extensions = new Lang.Class({
 
         return box;
     }
-});
+};
 
-var LookingGlass = new Lang.Class({
-    Name: 'LookingGlass',
-
-    _init() {
+var LookingGlass = class LookingGlass {
+    constructor() {
         this._borderPaintTarget = null;
         this._redBorderEffect = new RedBorderEffect();
 
@@ -917,7 +901,7 @@ var LookingGlass = new Lang.Class({
         });
 
         this._resize();
-    },
+    }
 
     _updateFont() {
         let fontName = this._interfaceSettings.get_string('monospace-font-name');
@@ -927,7 +911,7 @@ var LookingGlass = new Lang.Class({
         this.actor.style =
             'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + 
';'
             + 'font-family: "' + fontDesc.get_family() + '";';
-    },
+    }
 
     setBorderPaintTarget(obj) {
         if (this._borderPaintTarget != null)
@@ -935,7 +919,7 @@ var LookingGlass = new Lang.Class({
         this._borderPaintTarget = obj;
         if (this._borderPaintTarget != null)
             this._borderPaintTarget.add_effect(this._redBorderEffect);
-    },
+    }
 
     _pushResult(command, obj) {
         let index = this._results.length + this._offset;
@@ -955,7 +939,7 @@ var LookingGlass = new Lang.Class({
 
         // Scroll to bottom
         this._notebook.scrollToBottom(0);
-    },
+    }
 
     _showCompletions(completions) {
         if (!this._completionActor) {
@@ -984,7 +968,7 @@ var LookingGlass = new Lang.Class({
                                                       opacity: 255
                                                     });
         }
-    },
+    }
 
     _hideCompletions() {
         if (this._completionActor) {
@@ -998,7 +982,7 @@ var LookingGlass = new Lang.Class({
                                                       }
                                                     });
         }
-    },
+    }
 
     _evaluate(command) {
         this._history.addItem(command);
@@ -1017,30 +1001,30 @@ var LookingGlass = new Lang.Class({
 
         this._pushResult(command, resultObj);
         this._entry.text = '';
-    },
+    }
 
     inspect(x, y) {
         return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
-    },
+    }
 
     getIt() {
         return this._it;
-    },
+    }
 
     getResult(idx) {
         return this._results[idx - this._offset].o;
-    },
+    }
 
     toggle() {
         if (this._open)
             this.close();
         else
             this.open();
-    },
+    }
 
     _queueResize() {
         Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); });
-    },
+    }
 
     _resize() {
         let primary = Main.layoutManager.primaryMonitor;
@@ -1056,16 +1040,16 @@ var LookingGlass = new Lang.Class({
         this._objInspector.actor.set_size(Math.floor(myWidth * 0.8), Math.floor(myHeight * 0.8));
         this._objInspector.actor.set_position(this.actor.x + Math.floor(myWidth * 0.1),
                                               this._targetY + Math.floor(myHeight * 0.1));
-    },
+    }
 
     insertObject(obj) {
         this._pushResult('<insert>', obj);
-    },
+    }
 
     inspectObject(obj, sourceActor) {
         this._objInspector.open(sourceActor);
         this._objInspector.selectObject(obj);
-    },
+    }
 
     // Handle key events which are relevant for all tabs of the LookingGlass
     _globalKeyPressEvent(actor, event) {
@@ -1088,7 +1072,7 @@ var LookingGlass = new Lang.Class({
             }
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     open() {
         if (this._open)
@@ -1110,7 +1094,7 @@ var LookingGlass = new Lang.Class({
                                        transition: 'easeOutQuad',
                                        y: this._targetY
                                      });
-    },
+    }
 
     close() {
         if (!this._open)
@@ -1133,5 +1117,5 @@ var LookingGlass = new Lang.Class({
                                        }
                                      });
     }
-});
+};
 Signals.addSignalMethods(LookingGlass.prototype);
diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
index 11f00088d..6931c7d4f 100644
--- a/js/ui/magnifier.js
+++ b/js/ui/magnifier.js
@@ -7,7 +7,6 @@ const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Meta = imports.gi.Meta;
 const Signals = imports.signals;
@@ -53,10 +52,8 @@ const CROSS_HAIRS_CLIP_KEY      = 'cross-hairs-clip';
 
 let magDBusService = null;
 
-var Magnifier = new Lang.Class({
-    Name: 'Magnifier',
-
-    _init() {
+var Magnifier = class Magnifier {
+    constructor() {
         // Magnifier is a manager of ZoomRegions.
         this._zoomRegions = [];
 
@@ -84,7 +81,7 @@ var Magnifier = new Lang.Class({
         // Export to dbus.
         magDBusService = new MagnifierDBus.ShellMagnifier();
         this.setActive(showAtLaunch);
-    },
+    }
 
     /**
      * showSystemCursor:
@@ -92,7 +89,7 @@ var Magnifier = new Lang.Class({
      */
     showSystemCursor() {
         this._cursorTracker.set_pointer_visible(true);
-    },
+    }
 
     /**
      * hideSystemCursor:
@@ -100,7 +97,7 @@ var Magnifier = new Lang.Class({
      */
     hideSystemCursor() {
         this._cursorTracker.set_pointer_visible(false);
-    },
+    }
 
     /**
      * setActive:
@@ -131,7 +128,7 @@ var Magnifier = new Lang.Class({
 
         // Notify interested parties of this change
         this.emit('active-changed', activate);
-    },
+    }
 
     /**
      * isActive:
@@ -144,7 +141,7 @@ var Magnifier = new Lang.Class({
             return false;
         else
             return this._zoomRegions[0].isActive();
-    },
+    }
 
     /**
      * startTrackingMouse:
@@ -155,7 +152,7 @@ var Magnifier = new Lang.Class({
             let interval = 1000 / Clutter.get_default_frame_rate();
             this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, 
this.scrollToMousePos.bind(this));
         }
-    },
+    }
 
     /**
      * stopTrackingMouse:
@@ -166,7 +163,7 @@ var Magnifier = new Lang.Class({
             this._pointerWatch.remove();
 
         this._pointerWatch = null;
-    },
+    }
 
     /**
      * isTrackingMouse:
@@ -174,7 +171,7 @@ var Magnifier = new Lang.Class({
      */
     isTrackingMouse() {
         return !!this._mouseTrackingId;
-    },
+    }
 
     /**
      * scrollToMousePos:
@@ -200,7 +197,7 @@ var Magnifier = new Lang.Class({
                 this.showSystemCursor();
         }
         return true;
-    },
+    }
 
     /**
      * createZoomRegion:
@@ -229,7 +226,7 @@ var Magnifier = new Lang.Class({
 
         zoomRegion.addCrosshairs(this._crossHairs);
         return zoomRegion;
-    },
+    }
 
     /**
      * addZoomRegion:
@@ -243,7 +240,7 @@ var Magnifier = new Lang.Class({
             if (!this.isTrackingMouse())
                 this.startTrackingMouse();
         }
-    },
+    }
 
     /**
      * getZoomRegions:
@@ -252,7 +249,7 @@ var Magnifier = new Lang.Class({
      */
     getZoomRegions() {
         return this._zoomRegions;
-    },
+    }
 
     /**
      * clearAllZoomRegions:
@@ -265,7 +262,7 @@ var Magnifier = new Lang.Class({
         this._zoomRegions.length = 0;
         this.stopTrackingMouse();
         this.showSystemCursor();
-    },
+    }
 
     /**
      * addCrosshairs:
@@ -291,7 +288,7 @@ var Magnifier = new Lang.Class({
         this._zoomRegions.forEach ((zoomRegion, index, array) => {
             zoomRegion.addCrosshairs(theCrossHairs);
         });
-    },
+    }
 
     /**
      * setCrosshairsVisible:
@@ -308,7 +305,7 @@ var Magnifier = new Lang.Class({
             if (this._crossHairs)
                 this._crossHairs.hide();
         }
-    },
+    }
 
     /**
      * setCrosshairsColor:
@@ -320,7 +317,7 @@ var Magnifier = new Lang.Class({
             let [res, clutterColor] = Clutter.Color.from_string(color);
             this._crossHairs.setColor(clutterColor);
         }
-    },
+    }
 
     /**
      * getCrosshairsColor:
@@ -334,7 +331,7 @@ var Magnifier = new Lang.Class({
         }
         else
             return '#00000000';
-    },
+    }
 
     /**
      * setCrosshairsThickness:
@@ -345,7 +342,7 @@ var Magnifier = new Lang.Class({
     setCrosshairsThickness(thickness) {
         if (this._crossHairs)
             this._crossHairs.setThickness(thickness);
-    },
+    }
 
     /**
      * getCrosshairsThickness:
@@ -358,7 +355,7 @@ var Magnifier = new Lang.Class({
             return this._crossHairs.getThickness();
         else
             return 0;
-    },
+    }
 
     /**
      * setCrosshairsOpacity:
@@ -367,7 +364,7 @@ var Magnifier = new Lang.Class({
     setCrosshairsOpacity(opacity) {
         if (this._crossHairs)
             this._crossHairs.setOpacity(opacity * 255);
-    },
+    }
 
     /**
      * getCrosshairsOpacity:
@@ -378,7 +375,7 @@ var Magnifier = new Lang.Class({
             return this._crossHairs.getOpacity() / 255.0;
         else
             return 0.0;
-    },
+    }
 
     /**
      * setCrosshairsLength:
@@ -389,7 +386,7 @@ var Magnifier = new Lang.Class({
     setCrosshairsLength(length) {
         if (this._crossHairs)
             this._crossHairs.setLength(length);
-    },
+    }
 
     /**
      * getCrosshairsLength:
@@ -402,7 +399,7 @@ var Magnifier = new Lang.Class({
             return this._crossHairs.getLength();
         else
             return 0;
-    },
+    }
 
     /**
      * setCrosshairsClip:
@@ -420,7 +417,7 @@ var Magnifier = new Lang.Class({
             if (this._crossHairs)
                 this._crossHairs.setClip([0, 0]);
         }
-    },
+    }
 
     /**
      * getCrosshairsClip:
@@ -434,7 +431,7 @@ var Magnifier = new Lang.Class({
         }
         else
             return false;
-     },
+     }
 
     //// Private methods ////
 
@@ -442,7 +439,7 @@ var Magnifier = new Lang.Class({
         Shell.util_cursor_tracker_to_clutter(this._cursorTracker, this._mouseSprite);
         let [xHot, yHot] = this._cursorTracker.get_hot();
         this._mouseSprite.set_anchor_point(xHot, yHot);
-    },
+    }
 
     _settingsInit(zoomRegion) {
         this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
@@ -560,7 +557,7 @@ var Magnifier = new Lang.Class({
         this.setCrosshairsVisible(showCrosshairs);
 
         return this._appSettings.get_boolean(SHOW_KEY);
-   },
+   }
 
     _updateScreenPosition() {
         // Applies only to the first zoom region.
@@ -570,7 +567,7 @@ var Magnifier = new Lang.Class({
             if (position != GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN)
                 this._updateLensMode();
         }
-    },
+    }
 
     _updateMagFactor() {
         // Applies only to the first zoom region.
@@ -579,14 +576,14 @@ var Magnifier = new Lang.Class({
             let magFactor = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
             this._zoomRegions[0].setMagFactor(magFactor, magFactor);
         }
-    },
+    }
 
     _updateLensMode() {
         // Applies only to the first zoom region.
         if (this._zoomRegions.length) {
             this._zoomRegions[0].setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
         }
-    },
+    }
 
     _updateClampMode() {
         // Applies only to the first zoom region.
@@ -595,7 +592,7 @@ var Magnifier = new Lang.Class({
                 !this._settings.get_boolean(CLAMP_MODE_KEY)
             );
         }
-    },
+    }
 
     _updateMouseTrackingMode() {
         // Applies only to the first zoom region.
@@ -604,7 +601,7 @@ var Magnifier = new Lang.Class({
                 this._settings.get_enum(MOUSE_TRACKING_KEY)
             );
         }
-    },
+    }
 
     _updateFocusTrackingMode() {
         // Applies only to the first zoom region.
@@ -613,7 +610,7 @@ var Magnifier = new Lang.Class({
                 this._settings.get_enum(FOCUS_TRACKING_KEY)
             );
         }
-    },
+    }
 
     _updateCaretTrackingMode() {
         // Applies only to the first zoom region.
@@ -622,7 +619,7 @@ var Magnifier = new Lang.Class({
                 this._settings.get_enum(CARET_TRACKING_KEY)
             );
         }
-    },
+    }
 
     _updateInvertLightness() {
         // Applies only to the first zoom region.
@@ -631,7 +628,7 @@ var Magnifier = new Lang.Class({
                 this._settings.get_boolean(INVERT_LIGHTNESS_KEY)
             );
         }
-    },
+    }
 
     _updateColorSaturation() {
         // Applies only to the first zoom region.
@@ -640,7 +637,7 @@ var Magnifier = new Lang.Class({
                 this._settings.get_double(COLOR_SATURATION_KEY)
             );
         }
-    },
+    }
 
     _updateBrightness() {
         // Applies only to the first zoom region.
@@ -651,7 +648,7 @@ var Magnifier = new Lang.Class({
             brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY);
             this._zoomRegions[0].setBrightness(brightness);
         }
-    },
+    }
 
     _updateContrast() {
         // Applies only to the first zoom region.
@@ -663,13 +660,11 @@ var Magnifier = new Lang.Class({
             this._zoomRegions[0].setContrast(contrast);
         }
     }
-});
+};
 Signals.addSignalMethods(Magnifier.prototype);
 
-var ZoomRegion = new Lang.Class({
-    Name: 'ZoomRegion',
-
-    _init(magnifier, mouseSourceActor) {
+var ZoomRegion = class ZoomRegion {
+    constructor(magnifier, mouseSourceActor) {
         this._magnifier = magnifier;
         this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
 
@@ -715,7 +710,7 @@ var ZoomRegion = new Lang.Class({
                                     this._updateCaret.bind(this));
         this._focusCaretTracker.connect('focus-changed',
                                     this._updateFocus.bind(this));
-    },
+    }
 
     _updateFocus(caller, event) {
         let component = event.source.get_component_iface();
@@ -732,7 +727,7 @@ var ZoomRegion = new Lang.Class({
         [this._xFocus, this._yFocus] = [extents.x + (extents.width / 2),
                                         extents.y + (extents.height / 2)];
         this._centerFromFocusPosition();
-    },
+    }
 
     _updateCaret(caller, event) {
         let text = event.source.get_text_iface();
@@ -748,7 +743,7 @@ var ZoomRegion = new Lang.Class({
 
         [this._xCaret, this._yCaret] = [extents.x, extents.y];
         this._centerFromCaretPosition();
-    },
+    }
 
     /**
      * setActive:
@@ -771,7 +766,7 @@ var ZoomRegion = new Lang.Class({
 
         this._syncCaretTracking();
         this._syncFocusTracking();
-    },
+    }
 
     /**
      * isActive:
@@ -779,7 +774,7 @@ var ZoomRegion = new Lang.Class({
      */
     isActive() {
         return this._magView != null;
-    },
+    }
 
     /**
      * setMagFactor:
@@ -793,7 +788,7 @@ var ZoomRegion = new Lang.Class({
         this._changeROI({ xMagFactor: xMagFactor,
                           yMagFactor: yMagFactor,
                           redoCursorTracking: this._followingCursor });
-    },
+    }
 
     /**
      * getMagFactor:
@@ -804,7 +799,7 @@ var ZoomRegion = new Lang.Class({
      */
     getMagFactor() {
         return [this._xMagFactor, this._yMagFactor];
-    },
+    }
 
     /**
      * setMouseTrackingMode
@@ -814,7 +809,7 @@ var ZoomRegion = new Lang.Class({
         if (mode >= GDesktopEnums.MagnifierMouseTrackingMode.NONE &&
             mode <= GDesktopEnums.MagnifierMouseTrackingMode.PUSH)
             this._mouseTrackingMode = mode;
-    },
+    }
 
     /**
      * getMouseTrackingMode
@@ -822,7 +817,7 @@ var ZoomRegion = new Lang.Class({
      */
     getMouseTrackingMode() {
         return this._mouseTrackingMode;
-    },
+    }
 
     /**
      * setFocusTrackingMode
@@ -831,7 +826,7 @@ var ZoomRegion = new Lang.Class({
     setFocusTrackingMode(mode) {
         this._focusTrackingMode = mode;
         this._syncFocusTracking();
-    },
+    }
 
     /**
      * setCaretTrackingMode
@@ -840,7 +835,7 @@ var ZoomRegion = new Lang.Class({
     setCaretTrackingMode(mode) {
         this._caretTrackingMode = mode;
         this._syncCaretTracking();
-    },
+    }
 
     _syncFocusTracking() {
         let enabled = this._focusTrackingMode != GDesktopEnums.MagnifierFocusTrackingMode.NONE &&
@@ -850,7 +845,7 @@ var ZoomRegion = new Lang.Class({
             this._focusCaretTracker.registerFocusListener();
         else
             this._focusCaretTracker.deregisterFocusListener();
-    },
+    }
 
     _syncCaretTracking() {
         let enabled = this._caretTrackingMode != GDesktopEnums.MagnifierCaretTrackingMode.NONE &&
@@ -860,7 +855,7 @@ var ZoomRegion = new Lang.Class({
             this._focusCaretTracker.registerCaretListener();
         else
             this._focusCaretTracker.deregisterCaretListener();
-    },
+    }
 
     /**
      * setViewPort
@@ -872,7 +867,7 @@ var ZoomRegion = new Lang.Class({
     setViewPort(viewPort) {
         this._setViewPort(viewPort);
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.NONE;
-    },
+    }
 
     /**
      * setROI
@@ -890,7 +885,7 @@ var ZoomRegion = new Lang.Class({
                           yMagFactor: this._viewPortHeight / roi.height,
                           xCenter: roi.x + roi.width  / 2,
                           yCenter: roi.y + roi.height / 2 });
-    },
+    }
 
     /**
      * getROI:
@@ -907,7 +902,7 @@ var ZoomRegion = new Lang.Class({
         return [this._xCenter - roiWidth / 2,
                 this._yCenter - roiHeight / 2,
                 roiWidth, roiHeight];
-    },
+    }
 
     /**
      * setLensMode:
@@ -919,7 +914,7 @@ var ZoomRegion = new Lang.Class({
         this._lensMode = lensMode;
         if (!this._lensMode)
             this.setScreenPosition (this._screenPosition);
-    },
+    }
 
     /**
      * isLensMode:
@@ -928,7 +923,7 @@ var ZoomRegion = new Lang.Class({
      */
     isLensMode() {
         return this._lensMode;
-    },
+    }
 
     /**
      * setClampScrollingAtEdges:
@@ -940,7 +935,7 @@ var ZoomRegion = new Lang.Class({
         this._clampScrollingAtEdges = clamp;
         if (clamp)
             this._changeROI();
-    },
+    }
 
     /**
      * setTopHalf:
@@ -954,7 +949,7 @@ var ZoomRegion = new Lang.Class({
         viewPort.height = global.screen_height/2;
         this._setViewPort(viewPort);
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF;
-    },
+    }
 
     /**
      * setBottomHalf:
@@ -968,7 +963,7 @@ var ZoomRegion = new Lang.Class({
         viewPort.height = global.screen_height/2;
         this._setViewPort(viewPort);
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF;
-    },
+    }
 
     /**
      * setLeftHalf:
@@ -982,7 +977,7 @@ var ZoomRegion = new Lang.Class({
         viewPort.height = global.screen_height;
         this._setViewPort(viewPort);
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF;
-    },
+    }
 
     /**
      * setRightHalf:
@@ -996,7 +991,7 @@ var ZoomRegion = new Lang.Class({
         viewPort.height = global.screen_height;
         this._setViewPort(viewPort);
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF;
-    },
+    }
 
     /**
      * setFullScreenMode:
@@ -1012,7 +1007,7 @@ var ZoomRegion = new Lang.Class({
         this.setViewPort(viewPort);
 
         this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
-    },
+    }
 
     /**
      * setScreenPosition:
@@ -1040,7 +1035,7 @@ var ZoomRegion = new Lang.Class({
                 this.setRightHalf();
                 break;
         }
-    },
+    }
 
     /**
      * getScreenPosition:
@@ -1050,7 +1045,7 @@ var ZoomRegion = new Lang.Class({
      */
     getScreenPosition() {
         return this._screenPosition;
-    },
+    }
 
     /**
      * scrollToMousePos:
@@ -1066,14 +1061,14 @@ var ZoomRegion = new Lang.Class({
 
         // Determine whether the system mouse pointer is over this zoom region.
         return this._isMouseOverRegion();
-    },
+    }
 
     _clearScrollContentsTimer() {
         if (this._scrollContentsTimerId != 0) {
             Mainloop.source_remove(this._scrollContentsTimerId);
             this._scrollContentsTimerId = 0;
         }
-    },
+    }
 
     _scrollContentsToDelayed(x, y) {
         if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) {
@@ -1086,7 +1081,7 @@ var ZoomRegion = new Lang.Class({
             this._scrollContentsToDelayed(x, y);
             return GLib.SOURCE_REMOVE;
         });
-    },
+    }
 
     /**
      * scrollContentsTo:
@@ -1101,7 +1096,7 @@ var ZoomRegion = new Lang.Class({
         this._followingCursor = false;
         this._changeROI({ xCenter: x,
                           yCenter: y });
-    },
+    }
 
     /**
      * addCrosshairs:
@@ -1116,7 +1111,7 @@ var ZoomRegion = new Lang.Class({
         if (crossHairs && this.isActive()) {
             this._crossHairsActor = crossHairs.addToZoomRegion(this, this._mouseActor);
         }
-    },
+    }
 
     /**
      * setInvertLightness:
@@ -1127,7 +1122,7 @@ var ZoomRegion = new Lang.Class({
         this._invertLightness = flag;
         if (this._magShaderEffects)
             this._magShaderEffects.setInvertLightness(this._invertLightness);
-    },
+    }
 
     /**
      * getInvertLightness:
@@ -1136,7 +1131,7 @@ var ZoomRegion = new Lang.Class({
      */
     getInvertLightness() {
         return this._invertLightness;
-    },
+    }
 
     /**
      * setColorSaturation:
@@ -1149,7 +1144,7 @@ var ZoomRegion = new Lang.Class({
         this._colorSaturation = saturation;
         if (this._magShaderEffects)
             this._magShaderEffects.setColorSaturation(this._colorSaturation);
-    },
+    }
 
     /**
      * getColorSaturation:
@@ -1157,7 +1152,7 @@ var ZoomRegion = new Lang.Class({
      */
     getColorSaturation() {
         return this._colorSaturation;
-    },
+    }
 
     /**
      * setBrightness:
@@ -1173,7 +1168,7 @@ var ZoomRegion = new Lang.Class({
         this._brightness.b = brightness.b;
         if (this._magShaderEffects)
             this._magShaderEffects.setBrightness(this._brightness);
-    },
+    }
 
     /**
      * setContrast:
@@ -1189,7 +1184,7 @@ var ZoomRegion = new Lang.Class({
         this._contrast.b = contrast.b;
         if (this._magShaderEffects)
             this._magShaderEffects.setContrast(this._contrast);
-    },
+    }
 
     /**
      * getContrast:
@@ -1203,7 +1198,7 @@ var ZoomRegion = new Lang.Class({
         contrast.g = this._contrast.g;
         contrast.b = this._contrast.b;
         return contrast;
-    },
+    }
 
     //// Private methods ////
 
@@ -1249,7 +1244,7 @@ var ZoomRegion = new Lang.Class({
         this._magShaderEffects.setInvertLightness(this._invertLightness);
         this._magShaderEffects.setBrightness(this._brightness);
         this._magShaderEffects.setContrast(this._contrast);
-    },
+    }
 
     _destroyActors() {
         if (this._mouseActor == this._mouseSourceActor)
@@ -1265,7 +1260,7 @@ var ZoomRegion = new Lang.Class({
         this._uiGroupClone = null;
         this._mouseActor = null;
         this._crossHairsActor = null;
-    },
+    }
 
     _setViewPort(viewPort, fromROIUpdate) {
         // Sets the position of the zoom region on the screen
@@ -1290,7 +1285,7 @@ var ZoomRegion = new Lang.Class({
 
         if (this.isActive() && this._isMouseOverRegion())
             this._magnifier.hideSystemCursor();
-    },
+    }
 
     _changeROI(params) {
         // Updates the area we are viewing; the magnification factors
@@ -1341,7 +1336,7 @@ var ZoomRegion = new Lang.Class({
 
         this._updateCloneGeometry();
         this._updateMousePosition();
-    },
+    }
 
     _isMouseOverRegion() {
         // Return whether the system mouse sprite is over this ZoomRegion.  If the
@@ -1357,7 +1352,7 @@ var ZoomRegion = new Lang.Class({
             );
         }
         return mouseIsOver;
-    },
+    }
 
     _isFullScreen() {
         // Does the magnified view occupy the whole screen? Note that this
@@ -1370,7 +1365,7 @@ var ZoomRegion = new Lang.Class({
             this._viewPortHeight != global.screen_height)
             return false;
         return true;
-    },
+    }
 
     _centerFromMousePosition() {
         // Determines where the center should be given the current cursor
@@ -1390,7 +1385,7 @@ var ZoomRegion = new Lang.Class({
         }
 
         return null; // Should never be hit
-    },
+    }
 
     _centerFromCaretPosition() {
         let xCaret = this._xCaret;
@@ -1404,7 +1399,7 @@ var ZoomRegion = new Lang.Class({
             [xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret);
 
         this._scrollContentsToDelayed(xCaret, yCaret);
-    },
+    }
 
     _centerFromFocusPosition() {
         let xFocus = this._xFocus;
@@ -1418,7 +1413,7 @@ var ZoomRegion = new Lang.Class({
             [xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus);
 
         this._scrollContentsToDelayed(xFocus, yFocus);
-    },
+    }
 
     _centerFromPointPush(xPoint, yPoint) {
         let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
@@ -1439,7 +1434,7 @@ var ZoomRegion = new Lang.Class({
             yPos += (yPoint - yRoiBottom);
 
         return [xPos, yPos];
-    },
+    }
 
     _centerFromPointProportional(xPoint, yPoint) {
         let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
@@ -1456,18 +1451,18 @@ var ZoomRegion = new Lang.Class({
         let yPos = yPoint - yProportion * (heightRoi /2 - yPadding);
 
         return [xPos, yPos];
-    },
+    }
 
     _centerFromPointCentered(xPoint, yPoint) {
         return [xPoint, yPoint];
-    },
+    }
 
     _screenToViewPort(screenX, screenY) {
         // Converts coordinates relative to the (unmagnified) screen to coordinates
         // relative to the origin of this._magView
         return [this._viewPortWidth / 2 + (screenX - this._xCenter) * this._xMagFactor,
                 this._viewPortHeight / 2 + (screenY - this._yCenter) * this._yMagFactor];
-    },
+    }
 
     _updateMagViewGeometry() {
         if (!this.isActive())
@@ -1480,7 +1475,7 @@ var ZoomRegion = new Lang.Class({
 
         this._magView.set_size(this._viewPortWidth, this._viewPortHeight);
         this._magView.set_position(this._viewPortX, this._viewPortY);
-    },
+    }
 
     _updateCloneGeometry() {
         if (!this.isActive())
@@ -1493,7 +1488,7 @@ var ZoomRegion = new Lang.Class({
         this._uiGroupClone.set_position(Math.round(x), Math.round(y));
 
         this._updateMousePosition();
-    },
+    }
 
     _updateMousePosition() {
         if (!this.isActive())
@@ -1512,7 +1507,7 @@ var ZoomRegion = new Lang.Class({
             this._crossHairsActor.set_position(xMagMouse - groupWidth / 2,
                                                yMagMouse - groupHeight / 2);
         }
-    },
+    }
 
     _monitorsChanged() {
         if (!this.isActive())
@@ -1528,12 +1523,10 @@ var ZoomRegion = new Lang.Class({
         else
             this.setScreenPosition(this._screenPosition);
     }
-});
+};
 
-var Crosshairs = new Lang.Class({
-    Name: 'Crosshairs',
-
-    _init() {
+var Crosshairs = class Crosshairs {
+    constructor() {
 
         // Set the group containing the crosshairs to three times the desktop
         // size in case the crosshairs need to appear to be infinite in
@@ -1560,12 +1553,12 @@ var Crosshairs = new Lang.Class({
 
         Main.layoutManager.connect('monitors-changed',
                                    this._monitorsChanged.bind(this));
-    },
+    }
 
     _monitorsChanged() {
         this._actor.set_size(global.screen_width * 3, global.screen_height * 3);
         this.reCenter();
-    },
+    }
 
    /**
     * addToZoomRegion
@@ -1599,7 +1592,7 @@ var Crosshairs = new Lang.Class({
             }
         }
         return crosshairsActor;
-    },
+    }
 
     /**
      * removeFromParent:
@@ -1612,7 +1605,7 @@ var Crosshairs = new Lang.Class({
             childActor.get_parent().remove_actor(childActor);
         else
             childActor.destroy();
-    },
+    }
 
     /**
      * setColor:
@@ -1624,7 +1617,7 @@ var Crosshairs = new Lang.Class({
         this._horizRightHair.background_color = clutterColor;
         this._vertTopHair.background_color = clutterColor;
         this._vertBottomHair.background_color = clutterColor;
-    },
+    }
 
     /**
      * getColor:
@@ -1633,7 +1626,7 @@ var Crosshairs = new Lang.Class({
      */
     getColor() {
         return this._horizLeftHair.get_color();
-    },
+    }
 
     /**
      * setThickness:
@@ -1646,7 +1639,7 @@ var Crosshairs = new Lang.Class({
         this._vertTopHair.set_width(thickness);
         this._vertBottomHair.set_width(thickness);
         this.reCenter();
-    },
+    }
 
     /**
      * getThickness:
@@ -1655,7 +1648,7 @@ var Crosshairs = new Lang.Class({
      */
     getThickness() {
         return this._horizLeftHair.get_height();
-    },
+    }
 
     /**
      * setOpacity:
@@ -1674,7 +1667,7 @@ var Crosshairs = new Lang.Class({
         this._horizRightHair.set_opacity(opacity);
         this._vertTopHair.set_opacity(opacity);
         this._vertBottomHair.set_opacity(opacity);
-    },
+    }
 
     /**
      * setLength:
@@ -1687,7 +1680,7 @@ var Crosshairs = new Lang.Class({
         this._vertTopHair.set_height(length);
         this._vertBottomHair.set_height(length);
         this.reCenter();
-    },
+    }
 
     /**
      * getLength:
@@ -1696,7 +1689,7 @@ var Crosshairs = new Lang.Class({
      */
     getLength() {
         return this._horizLeftHair.get_width();
-    },
+    }
 
     /**
      * setClip:
@@ -1717,7 +1710,7 @@ var Crosshairs = new Lang.Class({
             this._clipSize = [0, 0];
             this.reCenter();
         }
-     },
+     }
 
     /**
      * show:
@@ -1728,7 +1721,7 @@ var Crosshairs = new Lang.Class({
         // Clones don't share visibility.
         for (let i = 0; i < this._clones.length; i++)
             this._clones[i].show();
-    },
+    }
 
     /**
      * hide:
@@ -1739,7 +1732,7 @@ var Crosshairs = new Lang.Class({
         // Clones don't share visibility.
         for (let i = 0; i < this._clones.length; i++)
             this._clones[i].hide();
-    },
+    }
 
     /**
      * reCenter:
@@ -1773,12 +1766,10 @@ var Crosshairs = new Lang.Class({
         this._vertTopHair.set_position((groupWidth - thickness) / 2, top);
         this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom);
     }
-});
+};
 
-var MagShaderEffects = new Lang.Class({
-    Name: 'MagShaderEffects',
-
-    _init(uiGroupClone) {
+var MagShaderEffects = class MagShaderEffects {
+    constructor(uiGroupClone) {
         this._inverse = new Shell.InvertLightnessEffect();
         this._brightnessContrast = new Clutter.BrightnessContrastEffect();
         this._colorDesaturation = new Clutter.DesaturateEffect();
@@ -1789,7 +1780,7 @@ var MagShaderEffects = new Lang.Class({
         this._magView.add_effect(this._inverse);
         this._magView.add_effect(this._brightnessContrast);
         this._magView.add_effect(this._colorDesaturation);
-    },
+    }
 
     /**
      * destroyEffects:
@@ -1803,7 +1794,7 @@ var MagShaderEffects = new Lang.Class({
         this._brightnessContrast = null;
         this._inverse = null;
         this._magView = null;
-    },
+    }
 
     /**
      * setInvertLightness:
@@ -1812,11 +1803,11 @@ var MagShaderEffects = new Lang.Class({
      */
     setInvertLightness(invertFlag) {
         this._inverse.set_enabled(invertFlag);
-    },
+    }
 
     setColorSaturation(factor) {
         this._colorDesaturation.set_factor(1.0 - factor);
-    },
+    }
 
     /**
      * setBrightness:
@@ -1840,7 +1831,7 @@ var MagShaderEffects = new Lang.Class({
             (bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE ||
              cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE)
         );
-    },
+    }
 
     /**
      * Set the contrast of the magnified view.
@@ -1865,5 +1856,5 @@ var MagShaderEffects = new Lang.Class({
              cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
              bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
         );
-    },
-});
+    }
+};
diff --git a/js/ui/magnifierDBus.js b/js/ui/magnifierDBus.js
index 210c5e337..e26724544 100644
--- a/js/ui/magnifierDBus.js
+++ b/js/ui/magnifierDBus.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Main = imports.ui.main;
 
 const { loadInterfaceXML } = imports.misc.fileUtils;
@@ -22,15 +21,13 @@ const ZoomRegionIface = loadInterfaceXML('org.gnome.Magnifier.ZoomRegion');
 // '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
 let _zoomRegionInstanceCount = 0;
 
-var ShellMagnifier = new Lang.Class({
-    Name: 'ShellMagnifier',
-
-    _init() {
+var ShellMagnifier = class ShellMagnifier {
+    constructor() {
         this._zoomers = {};
 
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this);
         this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
-    },
+    }
 
     /**
      * setActive:
@@ -38,7 +35,7 @@ var ShellMagnifier = new Lang.Class({
      */
     setActive(activate) {
         Main.magnifier.setActive(activate);
-    },
+    }
 
     /**
      * isActive:
@@ -46,7 +43,7 @@ var ShellMagnifier = new Lang.Class({
      */
     isActive() {
         return Main.magnifier.isActive();
-    },
+    }
 
     /**
      * showCursor:
@@ -54,7 +51,7 @@ var ShellMagnifier = new Lang.Class({
      */
     showCursor() {
         Main.magnifier.showSystemCursor();
-    },
+    }
 
     /**
      * hideCursor:
@@ -62,7 +59,7 @@ var ShellMagnifier = new Lang.Class({
      */
     hideCursor() {
         Main.magnifier.hideSystemCursor();
-    },
+    }
 
     /**
      * createZoomRegion:
@@ -97,7 +94,7 @@ var ShellMagnifier = new Lang.Class({
         proxyAndZoomRegion.zoomRegion = realZoomRegion;
         this._zoomers[objectPath] = proxyAndZoomRegion;
         return objectPath;
-    },
+    }
 
     /**
      * addZoomRegion:
@@ -112,7 +109,7 @@ var ShellMagnifier = new Lang.Class({
         }
         else
             return false;
-    },
+    }
 
     /**
      * getZoomRegions:
@@ -150,7 +147,7 @@ var ShellMagnifier = new Lang.Class({
             }
         });
         return objectPaths;
-    },
+    }
 
     /**
      * clearAllZoomRegions:
@@ -166,7 +163,7 @@ var ShellMagnifier = new Lang.Class({
             delete this._zoomers[objectPath];
         }
         this._zoomers = {};
-    },
+    }
 
     /**
      * fullScreenCapable:
@@ -175,7 +172,7 @@ var ShellMagnifier = new Lang.Class({
      */
     fullScreenCapable() {
         return true;
-    },
+    }
 
     /**
      * setCrosswireSize:
@@ -184,7 +181,7 @@ var ShellMagnifier = new Lang.Class({
      */
      setCrosswireSize(size) {
         Main.magnifier.setCrosshairsThickness(size);
-     },
+     }
 
     /**
      * getCrosswireSize:
@@ -193,7 +190,7 @@ var ShellMagnifier = new Lang.Class({
      */
      getCrosswireSize() {
         return Main.magnifier.getCrosshairsThickness();
-     },
+     }
 
     /**
      * setCrosswireLength:
@@ -202,7 +199,7 @@ var ShellMagnifier = new Lang.Class({
      */
      setCrosswireLength(length) {
         Main.magnifier.setCrosshairsLength(length);
-     },
+     }
 
     /**
      * setCrosswireSize:
@@ -211,7 +208,7 @@ var ShellMagnifier = new Lang.Class({
      */
      getCrosswireLength() {
         return Main.magnifier.getCrosshairsLength();
-     },
+     }
 
     /**
      * setCrosswireClip:
@@ -220,7 +217,7 @@ var ShellMagnifier = new Lang.Class({
      */
      setCrosswireClip(clip) {
         Main.magnifier.setCrosshairsClip(clip);
-     },
+     }
 
     /**
      * getCrosswireClip:
@@ -229,7 +226,7 @@ var ShellMagnifier = new Lang.Class({
      */
      getCrosswireClip() {
         return Main.magnifier.getCrosshairsClip();
-     },
+     }
 
     /**
      * setCrosswireColor:
@@ -238,7 +235,7 @@ var ShellMagnifier = new Lang.Class({
      */
      setCrosswireColor(color) {
         Main.magnifier.setCrosshairsColor('#%08x'.format(color));
-     },
+     }
 
     /**
      * getCrosswireClip:
@@ -250,7 +247,7 @@ var ShellMagnifier = new Lang.Class({
         // Drop the leading '#'.
         return parseInt(colorString.slice(1), 16);
      }
-});
+};
 
 /**
  * ShellMagnifierZoomRegion:
@@ -258,15 +255,13 @@ var ShellMagnifier = new Lang.Class({
  * @zoomerObjectPath:   String that is the path to a DBus ZoomRegion.
  * @zoomRegion:         The actual zoom region associated with the object path.
  */
-var ShellMagnifierZoomRegion = new Lang.Class({
-    Name: 'ShellMagnifierZoomRegion',
-
-    _init(zoomerObjectPath, zoomRegion) {
+var ShellMagnifierZoomRegion = class ShellMagnifierZoomRegion {
+    constructor(zoomerObjectPath, zoomRegion) {
         this._zoomRegion = zoomRegion;
 
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this);
         this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
-    },
+    }
 
     /**
      * setMagFactor:
@@ -278,7 +273,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
      */
     setMagFactor(xMagFactor, yMagFactor) {
         this._zoomRegion.setMagFactor(xMagFactor, yMagFactor);
-    },
+    }
 
     /**
      * getMagFactor:
@@ -289,7 +284,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
      */
     getMagFactor() {
         return this._zoomRegion.getMagFactor();
-    },
+    }
 
     /**
      * setRoi:
@@ -301,7 +296,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
     setRoi(roi) {
         let roiObject = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] };
         this._zoomRegion.setROI(roiObject);
-    },
+    }
 
     /**
      * getRoi:
@@ -316,7 +311,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
         roi[2] += roi[0];
         roi[3] += roi[1];
         return roi;
-    },
+    }
 
     /**
      * Set the "region of interest" by centering the given screen coordinate
@@ -329,7 +324,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
     shiftContentsTo(x, y) {
         this._zoomRegion.scrollContentsTo(x, y);
         return true;
-    },
+    }
 
     /**
      * moveResize
@@ -340,9 +335,9 @@ var ShellMagnifierZoomRegion = new Lang.Class({
     moveResize(viewPort) {
         let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: 
viewPort[3] - viewPort[1] };
         this._zoomRegion.setViewPort(viewRect);
-    },
+    }
 
     destroy() {
         this._dbusImpl.unexport();
     }
-});
+};
diff --git a/js/ui/main.js b/js/ui/main.js
index f87b1ad02..fccfcb9ef 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -5,7 +5,6 @@ const Gdk = imports.gi.Gdk;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
@@ -700,15 +699,12 @@ function queueDeferredWork(workId) {
     }
 }
 
-var RestartMessage = new Lang.Class({
-    Name: 'RestartMessage',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(message) {
-        this.parent({ shellReactive: true,
-                      styleClass: 'restart-message headline',
-                      shouldFadeIn: false,
-                      destroyOnClose: true });
+var RestartMessage = class extends ModalDialog.ModalDialog {
+    constructor(message) {
+        super({ shellReactive: true,
+                styleClass: 'restart-message headline',
+                shouldFadeIn: false,
+                destroyOnClose: true });
 
         let label = new St.Label({ text: message });
 
@@ -718,7 +714,7 @@ var RestartMessage = new Lang.Class({
                                         y_align: St.Align.MIDDLE });
         this.buttonLayout.hide();
     }
-});
+};
 
 function showRestartMessage(message) {
     let restartMessage = new RestartMessage(message);
diff --git a/js/ui/messageList.js b/js/ui/messageList.js
index 32b8e18b8..f8ef745d4 100644
--- a/js/ui/messageList.js
+++ b/js/ui/messageList.js
@@ -40,10 +40,8 @@ function _fixMarkup(text, allowMarkup) {
     return GLib.markup_escape_text(text, -1);
 }
 
-var URLHighlighter = new Lang.Class({
-    Name: 'URLHighlighter',
-
-    _init(text, lineWrap, allowMarkup) {
+var URLHighlighter = class URLHighlighter {
+    constructor(text, lineWrap, allowMarkup) {
         if (!text)
             text = '';
         this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
@@ -114,7 +112,7 @@ var URLHighlighter = new Lang.Class({
             }
             return Clutter.EVENT_PROPAGATE;
         });
-    },
+    }
 
     setMarkup(text, allowMarkup) {
         text = text ? _fixMarkup(text, allowMarkup) : '';
@@ -124,7 +122,7 @@ var URLHighlighter = new Lang.Class({
         /* clutter_text.text contain text without markup */
         this._urls = Util.findUrls(this.actor.clutter_text.text);
         this._highlightUrls();
-    },
+    }
 
     _highlightUrls() {
         // text here contain markup
@@ -139,7 +137,7 @@ var URLHighlighter = new Lang.Class({
         }
         markup += this._text.substr(pos);
         this.actor.clutter_text.set_markup(markup);
-    },
+    }
 
     _findUrlAtPos(event) {
         let success;
@@ -160,7 +158,7 @@ var URLHighlighter = new Lang.Class({
         }
         return -1;
     }
-});
+};
 
 var ScaleLayout = new Lang.Class({
     Name: 'ScaleLayout',
@@ -298,10 +296,8 @@ var LabelExpanderLayout = new Lang.Class({
     }
 });
 
-var Message = new Lang.Class({
-    Name: 'Message',
-
-    _init(title, body) {
+var Message = class Message {
+    constructor(title, body) {
         this.expanded = false;
 
         this._useBodyMarkup = false;
@@ -368,25 +364,25 @@ var Message = new Lang.Class({
         this.actor.connect('clicked', this._onClicked.bind(this));
         this.actor.connect('destroy', this._onDestroy.bind(this));
         this._sync();
-    },
+    }
 
     close() {
         this.emit('close');
-    },
+    }
 
     setIcon(actor) {
         this._iconBin.child = actor;
         this._iconBin.visible = (actor != null);
-    },
+    }
 
     setSecondaryActor(actor) {
         this._secondaryBin.child = actor;
-    },
+    }
 
     setTitle(text) {
         let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : '';
         this.titleLabel.clutter_text.set_markup(title);
-    },
+    }
 
     setBody(text) {
         this._bodyText = text;
@@ -394,7 +390,7 @@ var Message = new Lang.Class({
                                  this._useBodyMarkup);
         if (this._expandedLabel)
             this._expandedLabel.setMarkup(text, this._useBodyMarkup);
-    },
+    }
 
     setUseBodyMarkup(enable) {
         if (this._useBodyMarkup === enable)
@@ -402,7 +398,7 @@ var Message = new Lang.Class({
         this._useBodyMarkup = enable;
         if (this.bodyLabel)
             this.setBody(this._bodyText);
-    },
+    }
 
     setActionArea(actor) {
         if (actor == null) {
@@ -416,7 +412,7 @@ var Message = new Lang.Class({
 
         this._actionBin.add_actor(actor);
         this._actionBin.visible = this.expanded;
-    },
+    }
 
     addMediaControl(iconName, callback) {
         let icon = new St.Icon({ icon_name: iconName, icon_size: 16 });
@@ -425,7 +421,7 @@ var Message = new Lang.Class({
         button.connect('clicked', callback);
         this._mediaControls.add_actor(button);
         return button;
-    },
+    }
 
     setExpandedBody(actor) {
         if (actor == null) {
@@ -438,11 +434,11 @@ var Message = new Lang.Class({
             throw new Error('Message already has an expanded body actor');
 
         this._bodyStack.insert_child_at_index(actor, 1);
-    },
+    }
 
     setExpandedLines(nLines) {
         this._bodyStack.layout_manager.expandLines = nLines;
-    },
+    }
 
     expand(animate) {
         this.expanded = true;
@@ -471,7 +467,7 @@ var Message = new Lang.Class({
         }
 
         this.emit('expanded');
-    },
+    }
 
     unexpand(animate) {
         if (animate) {
@@ -495,23 +491,23 @@ var Message = new Lang.Class({
         }
 
         this.emit('unexpanded');
-    },
+    }
 
     canClose() {
         return false;
-    },
+    }
 
     _sync() {
         let visible = this.actor.hover && this.canClose();
         this._closeButton.opacity = visible ? 255 : 0;
         this._closeButton.reactive = visible;
-    },
+    }
 
     _onClicked() {
-    },
+    }
 
     _onDestroy() {
-    },
+    }
 
     _onKeyPressed(a, event) {
         let keysym = event.get_key_symbol();
@@ -523,13 +519,11 @@ var Message = new Lang.Class({
         }
         return Clutter.EVENT_PROPAGATE;
     }
-});
+};
 Signals.addSignalMethods(Message.prototype);
 
-var MessageListSection = new Lang.Class({
-    Name: 'MessageListSection',
-
-    _init() {
+var MessageListSection = class MessageListSection {
+    constructor() {
         this.actor = new St.BoxLayout({ style_class: 'message-list-section',
                                         clip_to_allocation: true,
                                         x_expand: true, vertical: true });
@@ -552,26 +546,26 @@ var MessageListSection = new Lang.Class({
         this.empty = true;
         this.canClear = false;
         this._sync();
-    },
+    }
 
     _onKeyFocusIn(actor) {
         this.emit('key-focus-in', actor);
-    },
+    }
 
     get allowed() {
         return true;
-    },
+    }
 
     setDate(date) {
         if (Calendar.sameDay(date, this._date))
             return;
         this._date = date;
         this._sync();
-    },
+    }
 
     addMessage(message, animate) {
         this.addMessageAtIndex(message, -1, animate);
-    },
+    }
 
     addMessageAtIndex(message, index, animate) {
         let obj = {
@@ -604,7 +598,7 @@ var MessageListSection = new Lang.Class({
                                               scale_y: 1,
                                               time: MESSAGE_ANIMATION_TIME,
                                               transition: 'easeOutQuad' });
-    },
+    }
 
     moveMessage(message, index, animate) {
         let obj = this._messages.get(message);
@@ -626,7 +620,7 @@ var MessageListSection = new Lang.Class({
                                           time: MESSAGE_ANIMATION_TIME,
                                           transition: 'easeOutQuad',
                                           onComplete: onComplete });
-    },
+    }
 
     removeMessage(message, animate) {
         let obj = this._messages.get(message);
@@ -649,7 +643,7 @@ var MessageListSection = new Lang.Class({
             obj.container.destroy();
             global.sync_pointer();
         }
-    },
+    }
 
     clear() {
         let messages = [...this._messages.keys()].filter(msg => msg.canClose());
@@ -677,18 +671,18 @@ var MessageListSection = new Lang.Class({
                                    }});
             }
         }
-    },
+    }
 
     _canClear() {
         for (let message of this._messages.keys())
             if (message.canClose())
                 return true;
         return false;
-    },
+    }
 
     _shouldShow() {
         return !this.empty;
-    },
+    }
 
     _sync() {
         let empty = this._list.get_n_children() == 0;
@@ -707,5 +701,5 @@ var MessageListSection = new Lang.Class({
 
         this.actor.visible = this.allowed && this._shouldShow();
     }
-});
+};
 Signals.addSignalMethods(MessageListSection.prototype);
diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
index 3c98b4f95..ebc7ae2fc 100644
--- a/js/ui/messageTray.js
+++ b/js/ui/messageTray.js
@@ -72,15 +72,13 @@ var Urgency = {
     CRITICAL: 3
 };
 
-var FocusGrabber = new Lang.Class({
-    Name: 'FocusGrabber',
-
-    _init(actor) {
+var FocusGrabber = class FocusGrabber {
+    constructor(actor) {
         this._actor = actor;
         this._prevKeyFocusActor = null;
         this._focusActorChangedId = 0;
         this._focused = false;
-    },
+    }
 
     grabFocus() {
         if (this._focused)
@@ -94,7 +92,7 @@ var FocusGrabber = new Lang.Class({
             this._actor.grab_key_focus();
 
         this._focused = true;
-    },
+    }
 
     _focusUngrabbed() {
         if (!this._focused)
@@ -107,13 +105,13 @@ var FocusGrabber = new Lang.Class({
 
         this._focused = false;
         return true;
-    },
+    }
 
     _focusActorChanged() {
         let focusedActor = global.stage.get_key_focus();
         if (!focusedActor || !this._actor.contains(focusedActor))
             this._focusUngrabbed();
-    },
+    }
 
     ungrabFocus() {
         if (!this._focusUngrabbed())
@@ -128,17 +126,15 @@ var FocusGrabber = new Lang.Class({
                 global.stage.set_key_focus(null);
         }
     }
-});
+};
 
 // NotificationPolicy:
 // An object that holds all bits of configurable policy related to a notification
 // source, such as whether to play sound or honour the critical bit.
 //
 // A notification without a policy object will inherit the default one.
-var NotificationPolicy = new Lang.Class({
-    Name: 'NotificationPolicy',
-
-    _init(params) {
+var NotificationPolicy = class NotificationPolicy {
+    constructor(params) {
         params = Params.parse(params, { enable: true,
                                         enableSound: true,
                                         showBanners: true,
@@ -150,77 +146,72 @@ var NotificationPolicy = new Lang.Class({
             let desc = Object.getOwnPropertyDescriptor(params, key);
             Object.defineProperty(this, `_${key}`, desc);
         });
-    },
+    }
 
     // Do nothing for the default policy. These methods are only useful for the
     // GSettings policy.
-    store() { },
-    destroy() { },
+    store() { }
+    destroy() { }
 
     get enable() {
         return this._enable;
-    },
+    }
 
     get enableSound() {
         return this._enableSound;
-    },
+    }
 
     get showBanners() {
         return this._showBanners;
-    },
+    }
 
     get forceExpanded() {
         return this._forceExpanded;
-    },
+    }
 
     get showInLockScreen() {
         return this._showInLockScreen;
-    },
+    }
 
     get detailsInLockScreen() {
         return this._detailsInLockScreen;
     }
-});
+};
 Signals.addSignalMethods(NotificationPolicy.prototype);
 
-var NotificationGenericPolicy = new Lang.Class({
-    Name: 'NotificationGenericPolicy',
-    Extends: NotificationPolicy,
-
-    _init() {
-        this.parent();
-
+var NotificationGenericPolicy =
+class NotificationGenericPolicy extends NotificationPolicy {
+    constructor() {
+        super();
         this.id = 'generic';
 
         this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
         this._masterSettings.connect('changed', this._changed.bind(this));
-    },
+    }
 
-    store() { },
+    store() { }
 
     destroy() {
         this._masterSettings.run_dispose();
-    },
+    }
 
     _changed(settings, key) {
         this.emit('policy-changed', key);
-    },
+    }
 
     get showBanners() {
         return this._masterSettings.get_boolean('show-banners');
-    },
+    }
 
     get showInLockScreen() {
         return this._masterSettings.get_boolean('show-in-lock-screen');
     }
-});
+};
 
-var NotificationApplicationPolicy = new Lang.Class({
-    Name: 'NotificationApplicationPolicy',
-    Extends: NotificationPolicy,
-
-    _init(id) {
-        this.parent();
+var NotificationApplicationPolicy =
+class NotificationApplicationPolicy extends NotificationPolicy {
+    constructor(id) {
+        super();
 
         this.id = id;
         this._canonicalId = this._canonicalizeId(id);
@@ -231,7 +222,7 @@ var NotificationApplicationPolicy = new Lang.Class({
 
         this._masterSettings.connect('changed', this._changed.bind(this));
         this._settings.connect('changed', this._changed.bind(this));
-    },
+    }
 
     store() {
         this._settings.set_string('application-id', this.id + '.desktop');
@@ -241,51 +232,51 @@ var NotificationApplicationPolicy = new Lang.Class({
             apps.push(this._canonicalId);
             this._masterSettings.set_strv('application-children', apps);
         }
-    },
+    }
 
     destroy() {
         this._masterSettings.run_dispose();
         this._settings.run_dispose();
-    },
+    }
 
     _changed(settings, key) {
         this.emit('policy-changed', key);
         if (key == 'enable')
             this.emit('enable-changed');
-    },
+    }
 
     _canonicalizeId(id) {
         // Keys are restricted to lowercase alphanumeric characters and dash,
         // and two dashes cannot be in succession
         return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
-    },
+    }
 
     get enable() {
         return this._settings.get_boolean('enable');
-    },
+    }
 
     get enableSound() {
         return this._settings.get_boolean('enable-sound-alerts');
-    },
+    }
 
     get showBanners() {
         return this._masterSettings.get_boolean('show-banners') &&
             this._settings.get_boolean('show-banners');
-    },
+    }
 
     get forceExpanded() {
         return this._settings.get_boolean('force-expanded');
-    },
+    }
 
     get showInLockScreen() {
         return this._masterSettings.get_boolean('show-in-lock-screen') &&
             this._settings.get_boolean('show-in-lock-screen');
-    },
+    }
 
     get detailsInLockScreen() {
         return this._settings.get_boolean('details-in-lock-screen');
     }
-});
+};
 
 // Notification:
 // @source: the notification's Source
@@ -342,10 +333,8 @@ var NotificationApplicationPolicy = new Lang.Class({
 // @source allows playing sounds).
 //
 // [1] https://developer.gnome.org/notification-spec/#markup 
-var Notification = new Lang.Class({
-    Name: 'Notification',
-
-    _init(source, title, banner, params) {
+var Notification = class Notification {
+    constructor(source, title, banner, params) {
         this.source = source;
         this.title = title;
         this.urgency = Urgency.NORMAL;
@@ -367,7 +356,7 @@ var Notification = new Lang.Class({
         // for new and updated notifications
         if (arguments.length != 1)
             this.update(title, banner, params);
-    },
+    }
 
     // update:
     // @title: the new title
@@ -412,41 +401,41 @@ var Notification = new Lang.Class({
         }
 
         this.emit('updated', params.clear);
-    },
+    }
 
     // addAction:
     // @label: the label for the action's button
     // @callback: the callback for the action
     addAction(label, callback) {
         this.actions.push({ label: label, callback: callback });
-    },
+    }
 
     get acknowledged() {
         return this._acknowledged;
-    },
+    }
 
     set acknowledged(v) {
         if (this._acknowledged == v)
             return;
         this._acknowledged = v;
         this.emit('acknowledged-changed');
-    },
+    }
 
     setUrgency(urgency) {
         this.urgency = urgency;
-    },
+    }
 
     setResident(resident) {
         this.resident = resident;
-    },
+    }
 
     setTransient(isTransient) {
         this.isTransient = isTransient;
-    },
+    }
 
     setForFeedback(forFeedback) {
         this.forFeedback = forFeedback;
-    },
+    }
 
     playSound() {
         if (this._soundPlayed)
@@ -462,7 +451,7 @@ var Notification = new Lang.Class({
             player.play_from_theme(this._soundName, this.title, null);
         else if (this._soundFile)
             player.play_from_file(this._soundFile, this.title, null);
-    },
+    }
 
     // Allow customizing the banner UI:
     // the default implementation defers the creation to
@@ -471,28 +460,26 @@ var Notification = new Lang.Class({
     // Notification or Source
     createBanner() {
         return this.source.createBanner(this);
-    },
+    }
 
     activate() {
         this.emit('activated');
         if (!this.resident)
             this.destroy();
-    },
+    }
 
     destroy(reason) {
         if (!reason)
             reason = NotificationDestroyedReason.DISMISSED;
         this.emit('destroy', reason);
     }
-});
+};
 Signals.addSignalMethods(Notification.prototype);
 
-var NotificationBanner = new Lang.Class({
-    Name: 'NotificationBanner',
-    Extends: Calendar.NotificationMessage,
-
-    _init(notification) {
-        this.parent(notification);
+var NotificationBanner =
+class NotificationBanner extends Calendar.NotificationMessage {
+    constructor(notification) {
+        super(notification);
 
         this.actor.can_focus = false;
         this.actor.add_style_class_name('notification-banner');
@@ -509,15 +496,15 @@ var NotificationBanner = new Lang.Class({
             // attention switching to the window.
             this.emit('done-displaying');
         });
-    },
+    }
 
     _onDestroy() {
-        this.parent();
+        super._onDestroy();
         this.notification.disconnect(this._activatedId);
-    },
+    }
 
     _onUpdated(n, clear) {
-        this.parent(n, clear);
+        super._onUpdated(n, clear);
 
         if (clear) {
             this.setSecondaryActor(null);
@@ -527,13 +514,13 @@ var NotificationBanner = new Lang.Class({
 
         this._addActions();
         this._addSecondaryIcon();
-    },
+    }
 
     _addActions() {
         this.notification.actions.forEach(action => {
             this.addAction(action.label, action.callback);
         });
-    },
+    }
 
     _addSecondaryIcon() {
         if (this.notification.secondaryGIcon) {
@@ -541,7 +528,7 @@ var NotificationBanner = new Lang.Class({
                                      x_align: Clutter.ActorAlign.END });
             this.setSecondaryActor(icon);
         }
-    },
+    }
 
     addButton(button, callback) {
         if (!this._buttonBox) {
@@ -569,7 +556,7 @@ var NotificationBanner = new Lang.Class({
         });
 
         return button;
-    },
+    }
 
     addAction(label, callback) {
         let button = new St.Button({ style_class: 'notification-button',
@@ -579,7 +566,7 @@ var NotificationBanner = new Lang.Class({
 
         return this.addButton(button, callback);
     }
-});
+};
 
 var SourceActor = new Lang.Class({
     Name: 'SourceActor',
@@ -697,12 +684,10 @@ var SourceActorWithLabel = new Lang.Class({
     }
 });
 
-var Source = new Lang.Class({
-    Name: 'MessageTraySource',
+var Source = class Source {
+    constructor(title, iconName) {
+        this.SOURCE_ICON_SIZE = 48;
 
-    SOURCE_ICON_SIZE: 48,
-
-    _init(title, iconName) {
         this.title = title;
         this.iconName = iconName;
 
@@ -711,42 +696,42 @@ var Source = new Lang.Class({
         this.notifications = [];
 
         this._policy = null;
-    },
+    }
 
     get policy() {
         if (!this._policy)
             this._policy = this._createPolicy();
         return this._policy;
-    },
+    }
 
     get count() {
         return this.notifications.length;
-    },
+    }
 
     get unseenCount() {
         return this.notifications.filter(n => !n.acknowledged).length;
-    },
+    }
 
     get countVisible() {
         return this.count > 1;
-    },
+    }
 
     countUpdated() {
         this.emit('count-updated');
-    },
+    }
 
     _createPolicy() {
         return new NotificationPolicy();
-    },
+    }
 
     setTitle(newTitle) {
         this.title = newTitle;
         this.emit('title-changed');
-    },
+    }
 
     createBanner(notification) {
         return new NotificationBanner(notification);
-    },
+    }
 
     // Called to create a new icon actor.
     // Provides a sane default implementation, override if you need
@@ -754,11 +739,11 @@ var Source = new Lang.Class({
     createIcon(size) {
         return new St.Icon({ gicon: this.getIcon(),
                              icon_size: size });
-    },
+    }
 
     getIcon() {
         return new Gio.ThemedIcon({ name: this.iconName });
-    },
+    }
 
     _onNotificationDestroy(notification) {
         let index = this.notifications.indexOf(notification);
@@ -770,7 +755,7 @@ var Source = new Lang.Class({
             this.destroy();
 
         this.countUpdated();
-    },
+    }
 
     pushNotification(notification) {
         if (this.notifications.indexOf(notification) >= 0)
@@ -785,7 +770,7 @@ var Source = new Lang.Class({
         this.emit('notification-added', notification);
 
         this.countUpdated();
-    },
+    }
 
     notify(notification) {
         notification.acknowledged = false;
@@ -796,7 +781,7 @@ var Source = new Lang.Class({
         } else {
             notification.playSound();
         }
-    },
+    }
 
     destroy(reason) {
         this.policy.destroy();
@@ -808,15 +793,15 @@ var Source = new Lang.Class({
             notifications[i].destroy(reason);
 
         this.emit('destroy', reason);
-    },
+    }
 
     iconUpdated() {
         this.emit('icon-updated');
-    },
+    }
 
     // To be overridden by subclasses
     open() {
-    },
+    }
 
     destroyNonResidentNotifications() {
         for (let i = this.notifications.length - 1; i >= 0; i--)
@@ -825,13 +810,11 @@ var Source = new Lang.Class({
 
         this.countUpdated();
     }
-});
+};
 Signals.addSignalMethods(Source.prototype);
 
-var MessageTray = new Lang.Class({
-    Name: 'MessageTray',
-
-    _init() {
+var MessageTray = class MessageTray {
+    constructor() {
         this._presence = new GnomeSession.Presence((proxy, error) => {
             this._onStatusChanged(proxy.status);
         });
@@ -938,27 +921,27 @@ var MessageTray = new Lang.Class({
         this._sources = new Map();
 
         this._sessionUpdated();
-    },
+    }
 
     _sessionUpdated() {
         this._updateState();
-    },
+    }
 
     _onDragBegin() {
         Shell.util_set_hidden_from_pick(this.actor, true);
-    },
+    }
 
     _onDragEnd() {
         Shell.util_set_hidden_from_pick(this.actor, false);
-    },
+    }
 
     get bannerAlignment() {
         return this._bannerBin.get_x_align();
-    },
+    }
 
     set bannerAlignment(align) {
         this._bannerBin.set_x_align(align);
-    },
+    }
 
     _onNotificationKeyRelease(actor, event) {
         if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
@@ -967,27 +950,27 @@ var MessageTray = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _expireNotification() {
         this._notificationExpired = true;
         this._updateState();
-    },
+    }
 
     get queueCount() {
         return this._notificationQueue.length;
-    },
+    }
 
     set bannerBlocked(v) {
         if (this._bannerBlocked == v)
             return;
         this._bannerBlocked = v;
         this._updateState();
-    },
+    }
 
     contains(source) {
         return this._sources.has(source);
-    },
+    }
 
     add(source) {
         if (this.contains(source)) {
@@ -1003,7 +986,7 @@ var MessageTray = new Lang.Class({
         });
         source.policy.connect('policy-changed', this._updateState.bind(this));
         this._onSourceEnableChanged(source.policy, source);
-    },
+    }
 
     _addSource(source) {
         let obj = {
@@ -1018,7 +1001,7 @@ var MessageTray = new Lang.Class({
         obj.destroyId = source.connect('destroy', this._onSourceDestroy.bind(this));
 
         this.emit('source-added', source);
-    },
+    }
 
     _removeSource(source) {
         let obj = this._sources.get(source);
@@ -1028,11 +1011,11 @@ var MessageTray = new Lang.Class({
         source.disconnect(obj.destroyId);
 
         this.emit('source-removed', source);
-    },
+    }
 
     getSources() {
         return [...this._sources.keys()];
-    },
+    }
 
     _onSourceEnableChanged(policy, source) {
         let wasEnabled = this.contains(source);
@@ -1044,11 +1027,11 @@ var MessageTray = new Lang.Class({
             else
                 this._removeSource(source);
         }
-    },
+    }
 
     _onSourceDestroy(source) {
         this._removeSource(source);
-    },
+    }
 
     _onNotificationDestroy(notification) {
         if (this._notification == notification && (this._notificationState == State.SHOWN || 
this._notificationState == State.SHOWING)) {
@@ -1063,7 +1046,7 @@ var MessageTray = new Lang.Class({
             this._notificationQueue.splice(index, 1);
             this.emit('queue-changed');
         }
-    },
+    }
 
     _onNotify(source, notification) {
         if (this._notification == notification) {
@@ -1089,7 +1072,7 @@ var MessageTray = new Lang.Class({
             }
         }
         this._updateState();
-    },
+    }
 
     _resetNotificationLeftTimeout() {
         this._useLongerNotificationLeftTimeout = false;
@@ -1099,7 +1082,7 @@ var MessageTray = new Lang.Class({
             this._notificationLeftMouseX = -1;
             this._notificationLeftMouseY = -1;
         }
-    },
+    }
 
     _onNotificationHoverChanged() {
         if (this._bannerBin.hover == this._notificationHovered)
@@ -1143,7 +1126,7 @@ var MessageTray = new Lang.Class({
             this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, 
this._onNotificationLeftTimeout.bind(this));
             GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] 
this._onNotificationLeftTimeout');
         }
-    },
+    }
 
     _onStatusChanged(status) {
         if (status == GnomeSession.PresenceStatus.BUSY) {
@@ -1158,7 +1141,7 @@ var MessageTray = new Lang.Class({
         }
 
         this._updateState();
-    },
+    }
 
     _onNotificationLeftTimeout() {
         let [x, y, mods] = global.get_pointer();
@@ -1180,13 +1163,13 @@ var MessageTray = new Lang.Class({
             this._updateState();
         }
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _escapeTray() {
         this._pointerInNotification = false;
         this._updateNotificationTimeout(0);
         this._updateState();
-    },
+    }
 
     // All of the logic for what happens when occurs here; the various
     // event handlers merely update variables such as
@@ -1249,7 +1232,7 @@ var MessageTray = new Lang.Class({
         // Clean transient variables that are used to communicate actions
         // to updateState()
         this._notificationExpired = false;
-    },
+    }
 
     _tween(actor, statevar, value, params) {
         let onComplete = params.onComplete;
@@ -1266,24 +1249,24 @@ var MessageTray = new Lang.Class({
 
         let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING;
         this[statevar] = valuing;
-    },
+    }
 
     _tweenComplete(statevar, value, onComplete, onCompleteScope, onCompleteParams) {
         this[statevar] = value;
         if (onComplete)
             onComplete.apply(onCompleteScope, onCompleteParams);
         this._updateState();
-    },
+    }
 
     _clampOpacity() {
         this._bannerBin.opacity = Math.max(0, Math.min(this._bannerBin._opacity, 255));
-    },
+    }
 
     _onIdleMonitorBecameActive() {
         this._userActiveWhileNotificationShown = true;
         this._updateNotificationTimeout(2000);
         this._updateState();
-    },
+    }
 
     _showNotification() {
         this._notification = this._notificationQueue.shift();
@@ -1328,7 +1311,7 @@ var MessageTray = new Lang.Class({
         this._lastSeenMouseY = y;
 
         this._resetNotificationLeftTimeout();
-    },
+    }
 
     _updateShowingNotification() {
         this._notification.acknowledged = true;
@@ -1362,12 +1345,12 @@ var MessageTray = new Lang.Class({
                           };
 
         this._tween(this._bannerBin, '_notificationState', State.SHOWN, tweenParams);
-   },
+    }
 
     _showNotificationCompleted() {
         if (this._notification.urgency != Urgency.CRITICAL)
             this._updateNotificationTimeout(NOTIFICATION_TIMEOUT * 1000);
-    },
+    }
 
     _updateNotificationTimeout(timeout) {
         if (this._notificationTimeoutId) {
@@ -1380,7 +1363,7 @@ var MessageTray = new Lang.Class({
                                      this._notificationTimeout.bind(this));
             GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] 
this._notificationTimeout');
         }
-    },
+    }
 
     _notificationTimeout() {
         let [x, y, mods] = global.get_pointer();
@@ -1404,7 +1387,7 @@ var MessageTray = new Lang.Class({
         this._lastSeenMouseX = x;
         this._lastSeenMouseY = y;
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _hideNotification(animate) {
         this._notificationFocusGrabber.ungrabFocus();
@@ -1438,7 +1421,7 @@ var MessageTray = new Lang.Class({
             this._notificationState = State.HIDDEN;
             this._hideNotificationCompleted();
         }
-    },
+    }
 
     _hideNotificationCompleted() {
         let notification = this._notification;
@@ -1453,14 +1436,14 @@ var MessageTray = new Lang.Class({
         this._banner.actor.destroy();
         this._banner = null;
         this.actor.hide();
-    },
+    }
 
     _expandActiveNotification() {
         if (!this._banner)
             return;
 
         this._expandBanner(false);
-    },
+    }
 
     _expandBanner(autoExpanding) {
         // Don't animate changes in notifications that are auto-expanding.
@@ -1469,23 +1452,20 @@ var MessageTray = new Lang.Class({
         // Don't focus notifications that are auto-expanding.
         if (!autoExpanding)
             this._ensureBannerFocused();
-    },
+    }
 
     _ensureBannerFocused() {
         this._notificationFocusGrabber.grabFocus();
     }
-});
+};
 Signals.addSignalMethods(MessageTray.prototype);
 
-var SystemNotificationSource = new Lang.Class({
-    Name: 'SystemNotificationSource',
-    Extends: Source,
-
-    _init() {
-        this.parent(_("System Information"), 'dialog-information-symbolic');
-    },
+var SystemNotificationSource = class SystemNotificationSource extends Source {
+    constructor() {
+        super(_("System Information"), 'dialog-information-symbolic');
+    }
 
     open() {
         this.destroy();
     }
-});
+};
diff --git a/js/ui/modalDialog.js b/js/ui/modalDialog.js
index aff894fd5..d6ebcb5f3 100644
--- a/js/ui/modalDialog.js
+++ b/js/ui/modalDialog.js
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
 const Gdk = imports.gi.Gdk;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Pango = imports.gi.Pango;
 const St = imports.gi.St;
@@ -31,10 +30,8 @@ var State = {
     FADED_OUT: 4
 };
 
-var ModalDialog = new Lang.Class({
-    Name: 'ModalDialog',
-
-    _init(params) {
+var ModalDialog = class {
+    constructor(params) {
         params = Params.parse(params, { shellReactive: false,
                                         styleClass: null,
                                         actionMode: Shell.ActionMode.SYSTEM_MODAL,
@@ -87,30 +84,30 @@ var ModalDialog = new Lang.Class({
         this._initialKeyFocus = null;
         this._initialKeyFocusDestroyId = 0;
         this._savedKeyFocus = null;
-    },
+    }
 
     destroy() {
         this._group.destroy();
-    },
+    }
 
     clearButtons() {
         this.dialogLayout.clearButtons();
-    },
+    }
 
     setButtons(buttons) {
         this.clearButtons();
 
         for (let buttonInfo of buttons)
             this.addButton(buttonInfo);
-    },
+    }
 
     addButton(buttonInfo) {
         return this.dialogLayout.addButton(buttonInfo);
-    },
+    }
 
     _onGroupDestroy() {
         this.emit('destroy');
-    },
+    }
 
     _fadeOpen(onPrimary) {
         if (onPrimary)
@@ -134,7 +131,7 @@ var ModalDialog = new Lang.Class({
                                this.emit('opened');
                            }
                          });
-    },
+    }
 
     setInitialKeyFocus(actor) {
         if (this._initialKeyFocusDestroyId)
@@ -146,7 +143,7 @@ var ModalDialog = new Lang.Class({
             this._initialKeyFocus = null;
             this._initialKeyFocusDestroyId = 0;
         });
-    },
+    }
 
     open(timestamp, onPrimary) {
         if (this.state == State.OPENED || this.state == State.OPENING)
@@ -157,7 +154,7 @@ var ModalDialog = new Lang.Class({
 
         this._fadeOpen(onPrimary);
         return true;
-    },
+    }
 
     _closeComplete() {
         this.state = State.CLOSED;
@@ -166,7 +163,7 @@ var ModalDialog = new Lang.Class({
 
         if (this._destroyOnClose)
             this.destroy();
-    },
+    }
 
     close(timestamp) {
         if (this.state == State.CLOSED || this.state == State.CLOSING)
@@ -185,7 +182,7 @@ var ModalDialog = new Lang.Class({
                              })
         else
             this._closeComplete();
-    },
+    }
 
     // Drop modal status without closing the dialog; this makes the
     // dialog insensitive as well, so it needs to be followed shortly
@@ -205,7 +202,7 @@ var ModalDialog = new Lang.Class({
 
         if (!this._shellReactive)
             this._eventBlocker.raise_top();
-    },
+    }
 
     pushModal(timestamp) {
         if (this._hasModal)
@@ -229,7 +226,7 @@ var ModalDialog = new Lang.Class({
         if (!this._shellReactive)
             this._eventBlocker.lower_bottom();
         return true;
-    },
+    }
 
     // This method is like close, but fades the dialog out much slower,
     // and leaves the lightbox in place. Once in the faded out state,
@@ -259,5 +256,5 @@ var ModalDialog = new Lang.Class({
                            }
                          });
     }
-});
+};
 Signals.addSignalMethods(ModalDialog.prototype);
diff --git a/js/ui/mpris.js b/js/ui/mpris.js
index 3b5521265..4968b4e7a 100644
--- a/js/ui/mpris.js
+++ b/js/ui/mpris.js
@@ -1,5 +1,4 @@
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -21,15 +20,12 @@ const MprisPlayerProxy = Gio.DBusProxy.makeProxyWrapper(MprisPlayerIface);
 
 const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.';
 
-var MediaMessage = new Lang.Class({
-    Name: 'MediaMessage',
-    Extends: MessageList.Message,
+var MediaMessage = class MediaMessage extends MessageList.Message {
+    constructor(player) {
+        super('', '');
 
-    _init(player) {
         this._player = player;
 
-        this.parent('', '');
-
         this._icon = new St.Icon({ style_class: 'media-message-cover-icon' });
         this.setIcon(this._icon);
 
@@ -51,16 +47,16 @@ var MediaMessage = new Lang.Class({
         this._player.connect('changed', this._update.bind(this));
         this._player.connect('closed', this.close.bind(this));
         this._update();
-    },
+    }
 
     _onClicked() {
         this._player.raise();
         Main.panel.closeCalendar();
-    },
+    }
 
     _updateNavButton(button, sensitive) {
         button.reactive = sensitive;
-    },
+    }
 
     _update() {
         this.setTitle(this._player.trackArtists.join(', '));
@@ -83,12 +79,10 @@ var MediaMessage = new Lang.Class({
         this._updateNavButton(this._prevButton, this._player.canGoPrevious);
         this._updateNavButton(this._nextButton, this._player.canGoNext);
     }
-});
-
-var MprisPlayer = new Lang.Class({
-    Name: 'MprisPlayer',
+};
 
-    _init(busName) {
+var MprisPlayer = class MprisPlayer {
+    constructor(busName) {
         this._mprisProxy = new MprisProxy(Gio.DBus.session, busName,
                                           '/org/mpris/MediaPlayer2',
                                           this._onMprisProxyReady.bind(this));
@@ -100,43 +94,43 @@ var MprisPlayer = new Lang.Class({
         this._trackArtists = [];
         this._trackTitle = '';
         this._trackCoverUrl = '';
-    },
+    }
 
     get status() {
         return this._playerProxy.PlaybackStatus;
-    },
+    }
 
     get trackArtists() {
         return this._trackArtists;
-    },
+    }
 
     get trackTitle() {
         return this._trackTitle;
-    },
+    }
 
     get trackCoverUrl() {
         return this._trackCoverUrl;
-    },
+    }
 
     playPause() {
         this._playerProxy.PlayPauseRemote();
-    },
+    }
 
     get canGoNext() {
         return this._playerProxy.CanGoNext;
-    },
+    }
 
     next() {
         this._playerProxy.NextRemote();
-    },
+    }
 
     get canGoPrevious() {
         return this._playerProxy.CanGoPrevious;
-    },
+    }
 
     previous() {
         this._playerProxy.PreviousRemote();
-    },
+    }
 
     raise() {
         // The remote Raise() method may run into focus stealing prevention,
@@ -151,7 +145,7 @@ var MprisPlayer = new Lang.Class({
             app.activate();
         else if (this._mprisProxy.CanRaise)
             this._mprisProxy.RaiseRemote();
-    },
+    }
 
     _close() {
         this._mprisProxy.disconnect(this._ownerNotifyId);
@@ -161,7 +155,7 @@ var MprisPlayer = new Lang.Class({
         this._playerProxy = null;
 
         this.emit('closed');
-    },
+    }
 
     _onMprisProxyReady() {
         this._ownerNotifyId = this._mprisProxy.connect('notify::g-name-owner',
@@ -169,13 +163,13 @@ var MprisPlayer = new Lang.Class({
                 if (!this._mprisProxy.g_name_owner)
                     this._close();
             });
-    },
+    }
 
     _onPlayerProxyReady() {
         this._propsChangedId = this._playerProxy.connect('g-properties-changed',
                                                          this._updateState.bind(this));
         this._updateState();
-    },
+    }
 
     _updateState() {
         let metadata = {};
@@ -197,15 +191,12 @@ var MprisPlayer = new Lang.Class({
                 this._close();
         }
     }
-});
+};
 Signals.addSignalMethods(MprisPlayer.prototype);
 
-var MediaSection = new Lang.Class({
-    Name: 'MediaSection',
-    Extends: MessageList.MessageListSection,
-
-    _init() {
-        this.parent();
+var MediaSection = class MediaSection extends MessageList.MessageListSection {
+    constructor() {
+        super();
 
         this._players = new Map();
 
@@ -213,11 +204,11 @@ var MediaSection = new Lang.Class({
                                     'org.freedesktop.DBus',
                                     '/org/freedesktop/DBus',
                                     this._onProxyReady.bind(this));
-    },
+    }
 
     _shouldShow() {
         return !this.empty && Calendar.isToday(this._date);
-    },
+    }
 
     _addPlayer(busName) {
         if (this._players.get(busName))
@@ -234,7 +225,7 @@ var MediaSection = new Lang.Class({
                 this.addMessage(message, true);
             });
         this._players.set(busName, player);
-    },
+    }
 
     _onProxyReady() {
         this._proxy.ListNamesRemote(([names]) => {
@@ -247,7 +238,7 @@ var MediaSection = new Lang.Class({
         });
         this._proxy.connectSignal('NameOwnerChanged',
                                   this._onNameOwnerChanged.bind(this));
-    },
+    }
 
     _onNameOwnerChanged(proxy, sender, [name, oldOwner, newOwner]) {
         if (!name.startsWith(MPRIS_PLAYER_PREFIX))
@@ -256,4 +247,4 @@ var MediaSection = new Lang.Class({
         if (newOwner && !oldOwner)
             this._addPlayer(name);
     }
-});
+};
diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js
index bb8185c03..0a456f039 100644
--- a/js/ui/notificationDaemon.js
+++ b/js/ui/notificationDaemon.js
@@ -5,7 +5,6 @@ const GdkPixbuf = imports.gi.GdkPixbuf;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Mainloop = imports.mainloop;
 const St = imports.gi.St;
@@ -51,10 +50,8 @@ const rewriteRules = {
     ]
 };
 
-var FdoNotificationDaemon = new Lang.Class({
-    Name: 'FdoNotificationDaemon',
-
-    _init() {
+var FdoNotificationDaemon = class FdoNotificationDaemon {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(FdoNotificationsIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
 
@@ -69,7 +66,7 @@ var FdoNotificationDaemon = new Lang.Class({
             this._onFocusAppChanged.bind(this));
         Main.overview.connect('hidden',
             this._onFocusAppChanged.bind(this));
-    },
+    }
 
     _imageForNotificationData(hints) {
         if (hints['image-data']) {
@@ -81,7 +78,7 @@ var FdoNotificationDaemon = new Lang.Class({
             return this._iconForNotificationData(hints['image-path']);
         }
         return null;
-    },
+    }
 
     _fallbackIconForNotificationData(hints) {
         let stockIcon;
@@ -95,7 +92,7 @@ var FdoNotificationDaemon = new Lang.Class({
                 break;
         }
         return new Gio.ThemedIcon({ name: stockIcon });
-    },
+    }
 
     _iconForNotificationData(icon) {
         if (icon) {
@@ -107,7 +104,7 @@ var FdoNotificationDaemon = new Lang.Class({
                 return new Gio.ThemedIcon({ name: icon });
         }
         return null;
-    },
+    }
 
     _lookupSource(title, pid) {
         for (let i = 0; i < this._sources.length; i++) {
@@ -116,7 +113,7 @@ var FdoNotificationDaemon = new Lang.Class({
                 return source;
         }
         return null;
-    },
+    }
 
     // Returns the source associated with ndata.notification if it is set.
     // If the existing or requested source is associated with a tray icon
@@ -158,7 +155,7 @@ var FdoNotificationDaemon = new Lang.Class({
 
         Main.messageTray.add(source);
         return source;
-    },
+    }
 
     NotifyAsync(params, invocation) {
         let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params;
@@ -266,7 +263,7 @@ var FdoNotificationDaemon = new Lang.Class({
         });
 
         return invocation.return_value(GLib.Variant.new('(u)', [id]));
-    },
+    }
 
     _notifyForSource(source, ndata) {
         let [id, icon, summary, body, actions, hints, notification] =
@@ -357,7 +354,7 @@ var FdoNotificationDaemon = new Lang.Class({
 
         let sourceGIcon = source.useNotificationIcon ? gicon : null;
         source.processNotification(notification, sourceGIcon);
-    },
+    }
 
     CloseNotification(id) {
         let ndata = this._notifications[id];
@@ -366,7 +363,7 @@ var FdoNotificationDaemon = new Lang.Class({
                 ndata.notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
             delete this._notifications[id];
         }
-    },
+    }
 
     GetCapabilities() {
         return [
@@ -381,7 +378,7 @@ var FdoNotificationDaemon = new Lang.Class({
             'persistence',
             'sound',
         ];
-    },
+    }
 
     GetServerInformation() {
         return [
@@ -390,7 +387,7 @@ var FdoNotificationDaemon = new Lang.Class({
             Config.PACKAGE_VERSION,
             '1.2'
         ];
-    },
+    }
 
     _onFocusAppChanged() {
         let tracker = Shell.WindowTracker.get_default();
@@ -404,31 +401,27 @@ var FdoNotificationDaemon = new Lang.Class({
                 return;
             }
         }
-    },
+    }
 
     _emitNotificationClosed(id, reason) {
         this._dbusImpl.emit_signal('NotificationClosed',
                                    GLib.Variant.new('(uu)', [id, reason]));
-    },
+    }
 
     _emitActionInvoked(id, action) {
         this._dbusImpl.emit_signal('ActionInvoked',
                                    GLib.Variant.new('(us)', [id, action]));
     }
-});
+};
 
-var FdoNotificationDaemonSource = new Lang.Class({
-    Name: 'FdoNotificationDaemonSource',
-    Extends: MessageTray.Source,
+var FdoNotificationDaemonSource =
+class FdoNotificationDaemonSource extends MessageTray.Source {
+    constructor(title, pid, sender, appId) {
+        super(title);
 
-    _init(title, pid, sender, appId) {
-        // Need to set the app before chaining up, so
-        // methods called from the parent constructor can find it
         this.pid = pid;
         this.app = this._getApp(appId);
 
-        this.parent(title);
-
         this.initialTitle = title;
 
         if (this.app)
@@ -443,7 +436,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
                                                               this._onNameVanished.bind(this));
         else
             this._nameWatcherId = 0;
-    },
+    }
 
     _createPolicy() {
         if (this.app && this.app.get_app_info()) {
@@ -452,7 +445,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
         } else {
             return new MessageTray.NotificationGenericPolicy();
         }
-    },
+    }
 
     _onNameVanished() {
         // Destroy the notification source when its sender is removed from DBus.
@@ -462,7 +455,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
         // so allow the code path that handles the tray icon being removed to handle that case.
         if (this.app)
             this.destroy();
-    },
+    }
 
     processNotification(notification, gicon) {
         if (gicon)
@@ -474,7 +467,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
             this.pushNotification(notification);
         else
             this.notify(notification);
-    },
+    }
 
     _getApp(appId) {
         let app;
@@ -490,7 +483,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
         }
 
         return null;
-    },
+    }
 
     setTitle(title) {
         // Do nothing if .app is set, we don't want to override the
@@ -499,13 +492,13 @@ var FdoNotificationDaemonSource = new Lang.Class({
         if (this.app)
             return;
 
-        this.parent(title);
-    },
+        super.setTitle(title);
+    }
 
     open() {
         this.openApp();
         this.destroyNonResidentNotifications();
-    },
+    }
 
     openApp() {
         if (this.app == null)
@@ -514,7 +507,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
         this.app.activate();
         Main.overview.hide();
         Main.panel.closeCalendar();
-    },
+    }
 
     destroy() {
         if (this._nameWatcherId) {
@@ -522,8 +515,8 @@ var FdoNotificationDaemonSource = new Lang.Class({
             this._nameWatcherId = 0;
         }
 
-        this.parent();
-    },
+        super.destroy();
+    }
 
     createIcon(size) {
         if (this.app) {
@@ -535,7 +528,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
             return null;
         }
     }
-});
+};
 
 const PRIORITY_URGENCY_MAP = {
     low: MessageTray.Urgency.LOW,
@@ -544,12 +537,10 @@ const PRIORITY_URGENCY_MAP = {
     urgent: MessageTray.Urgency.CRITICAL
 };
 
-var GtkNotificationDaemonNotification = new Lang.Class({
-    Name: 'GtkNotificationDaemonNotification',
-    Extends: MessageTray.Notification,
-
-    _init(source, notification) {
-        this.parent(source);
+var GtkNotificationDaemonNotification =
+class GtkNotificationDaemonNotification extends MessageTray.Notification {
+    constructor(source, notification) {
+        super(source);
         this._serialized = GLib.Variant.new('a{sv}', notification);
 
         let { "title": title,
@@ -586,7 +577,7 @@ var GtkNotificationDaemonNotification = new Lang.Class({
         this.update(title.unpack(), body ? body.unpack() : null,
                     { gicon: gicon ? Gio.icon_deserialize(gicon) : null,
                       datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
-    },
+    }
 
     _activateAction(namespacedActionId, target) {
         if (namespacedActionId) {
@@ -597,22 +588,22 @@ var GtkNotificationDaemonNotification = new Lang.Class({
         } else {
             this.source.open();
         }
-    },
+    }
 
     _onButtonClicked(button) {
         let { 'action': action, 'target': actionTarget } = button;
         this._activateAction(action.unpack(), actionTarget);
-    },
+    }
 
     activate() {
         this._activateAction(this._defaultAction, this._defaultActionTarget);
-        this.parent();
-    },
+        super.activate();
+    }
 
     serialize() {
         return this._serialized;
-    },
-});
+    }
+};
 
 const FdoApplicationIface = loadInterfaceXML('org.freedesktop.Application');
 const FdoApplicationProxy = Gio.DBusProxy.makeProxyWrapper(FdoApplicationIface);
@@ -628,41 +619,42 @@ function getPlatformData() {
 
 function InvalidAppError() {}
 
-var GtkNotificationDaemonAppSource = new Lang.Class({
-    Name: 'GtkNotificationDaemonAppSource',
-    Extends: MessageTray.Source,
-
-    _init(appId) {
-        this._appId = appId;
-        this._objectPath = objectPathFromAppId(appId);
-        if (!GLib.Variant.is_object_path(this._objectPath))
+var GtkNotificationDaemonAppSource = 
+class GtkNotificationDaemonAppSource extends MessageTray.Source {
+    constructor(appId) {
+        let objectPath = objectPathFromAppId(appId);
+        if (!GLib.Variant.is_object_path(objectPath))
             throw new InvalidAppError();
 
-        this._app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
-        if (!this._app)
+        let app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
+        if (!app)
             throw new InvalidAppError();
 
+        super(app.get_name());
+
+        this._appId = appId;
+        this._app = app;
+        this._objectPath = objectPath;
+
         this._notifications = {};
         this._notificationPending = false;
-
-        this.parent(this._app.get_name());
-    },
+    }
 
     createIcon(size) {
         return this._app.create_icon_texture(size);
-    },
+    }
 
     _createPolicy() {
         return new MessageTray.NotificationApplicationPolicy(this._appId);
-    },
+    }
 
     _createApp(callback) {
         return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath, callback);
-    },
+    }
 
     _createNotification(params) {
         return new GtkNotificationDaemonNotification(this, params);
-    },
+    }
 
     activateAction(actionId, target) {
         this._createApp((app, error) => {
@@ -673,7 +665,7 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
         });
         Main.overview.hide();
         Main.panel.closeCalendar();
-    },
+    }
 
     open() {
         this._createApp((app, error) => {
@@ -684,7 +676,7 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
         });
         Main.overview.hide();
         Main.panel.closeCalendar();
-    },
+    }
 
     addNotification(notificationId, notificationParams, showBanner) {
         this._notificationPending = true;
@@ -704,18 +696,18 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
             this.pushNotification(notification);
 
         this._notificationPending = false;
-    },
+    }
 
     destroy(reason) {
         if (this._notificationPending)
             return;
-        this.parent(reason);
-    },
+        super.destroy(reason);
+    }
 
     removeNotification(notificationId) {
         if (this._notifications[notificationId])
             
this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
-    },
+    }
 
     serialize() {
         let notifications = [];
@@ -724,15 +716,13 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
             notifications.push([notificationId, notification.serialize()]);
         }
         return [this._appId, notifications];
-    },
-});
+    }
+};
 
 const GtkNotificationsIface = loadInterfaceXML('org.gtk.Notifications');
 
-var GtkNotificationDaemon = new Lang.Class({
-    Name: 'GtkNotificationDaemon',
-
-    _init() {
+var GtkNotificationDaemon = class GtkNotificationDaemon {
+    constructor() {
         this._sources = {};
 
         this._loadNotifications();
@@ -741,7 +731,7 @@ var GtkNotificationDaemon = new Lang.Class({
         this._dbusImpl.export(Gio.DBus.session, '/org/gtk/Notifications');
 
         Gio.DBus.session.own_name('org.gtk.Notifications', Gio.BusNameOwnerFlags.REPLACE, null, null);
-    },
+    }
 
     _ensureAppSource(appId) {
         if (this._sources[appId])
@@ -757,7 +747,7 @@ var GtkNotificationDaemon = new Lang.Class({
         Main.messageTray.add(source);
         this._sources[appId] = source;
         return source;
-    },
+    }
 
     _loadNotifications() {
         this._isLoading = true;
@@ -785,7 +775,7 @@ var GtkNotificationDaemon = new Lang.Class({
         }
 
         this._isLoading = false;
-    },
+    }
 
     _saveNotifications() {
         if (this._isLoading)
@@ -798,7 +788,7 @@ var GtkNotificationDaemon = new Lang.Class({
         }
 
         global.set_persistent_state('notifications', new GLib.Variant('a(sa(sv))', sources));
-    },
+    }
 
     AddNotificationAsync(params, invocation) {
         let [appId, notificationId, notification] = params;
@@ -820,7 +810,7 @@ var GtkNotificationDaemon = new Lang.Class({
         source.addNotification(notificationId, notification, true);
 
         invocation.return_value(null);
-    },
+    }
 
     RemoveNotificationAsync(params, invocation) {
         let [appId, notificationId] = params;
@@ -829,14 +819,12 @@ var GtkNotificationDaemon = new Lang.Class({
             source.removeNotification(notificationId);
 
         invocation.return_value(null);
-    },
-});
-
-var NotificationDaemon = new Lang.Class({
-    Name: 'NotificationDaemon',
+    }
+};
 
-    _init() {
+var NotificationDaemon = class NotificationDaemon {
+    constructor() {
         this._fdoNotificationDaemon = new FdoNotificationDaemon();
         this._gtkNotificationDaemon = new GtkNotificationDaemon();
-    },
-});
+    }
+};
diff --git a/js/ui/osdMonitorLabeler.js b/js/ui/osdMonitorLabeler.js
index 9abd6ec83..cdb6e7627 100644
--- a/js/ui/osdMonitorLabeler.js
+++ b/js/ui/osdMonitorLabeler.js
@@ -4,17 +4,14 @@ const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const St = imports.gi.St;
 
-const Lang = imports.lang;
 const Main = imports.ui.main;
 const Tweener = imports.ui.tweener;
 const Meta = imports.gi.Meta;
 
 var FADE_TIME = 0.1;
 
-var OsdMonitorLabel = new Lang.Class({
-    Name: 'OsdMonitorLabel',
-
-    _init(monitor, label) {
+var OsdMonitorLabel = class {
+    constructor(monitor, label) {
         this._actor = new St.Widget({ x_expand: true,
                                       y_expand: true });
 
@@ -33,7 +30,7 @@ var OsdMonitorLabel = new Lang.Class({
         this._position();
 
         Meta.disable_unredirect_for_display(global.display);
-    },
+    }
 
     _position() {
         let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor);
@@ -44,18 +41,16 @@ var OsdMonitorLabel = new Lang.Class({
             this._box.x = workArea.x;
 
         this._box.y = workArea.y;
-    },
+    }
 
     destroy() {
         this._actor.destroy();
         Meta.enable_unredirect_for_display(global.display);
     }
-});
+};
 
-var OsdMonitorLabeler = new Lang.Class({
-    Name: 'OsdMonitorLabeler',
-
-    _init() {
+var OsdMonitorLabeler = class {
+    constructor() {
         this._monitorManager = Meta.MonitorManager.get();
         this._client = null;
         this._clientWatchId = 0;
@@ -64,7 +59,7 @@ var OsdMonitorLabeler = new Lang.Class({
         Main.layoutManager.connect('monitors-changed',
                                     this._reset.bind(this));
         this._reset();
-    },
+    }
 
     _reset() {
         for (let i in this._osdLabels)
@@ -74,7 +69,7 @@ var OsdMonitorLabeler = new Lang.Class({
         let monitors = Main.layoutManager.monitors;
         for (let i in monitors)
             this._monitorLabels.set(monitors[i].index, []);
-    },
+    }
 
     _trackClient(client) {
         if (this._client)
@@ -86,7 +81,7 @@ var OsdMonitorLabeler = new Lang.Class({
                                                      this.hide(name);
                                                  });
         return true;
-    },
+    }
 
     _untrackClient(client) {
         if (!this._client || this._client != client)
@@ -96,7 +91,7 @@ var OsdMonitorLabeler = new Lang.Class({
         this._clientWatchId = 0;
         this._client = null;
         return true;
-    },
+    }
 
     show(client, params) {
         if (!this._trackClient(client))
@@ -118,7 +113,7 @@ var OsdMonitorLabeler = new Lang.Class({
             labels.sort();
             this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
         }
-    },
+    }
 
     show2(client, params) {
         if (!this._trackClient(client))
@@ -137,7 +132,7 @@ var OsdMonitorLabeler = new Lang.Class({
             labels.sort();
             this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
         }
-    },
+    }
 
     hide(client) {
         if (!this._untrackClient(client))
@@ -145,4 +140,4 @@ var OsdMonitorLabeler = new Lang.Class({
 
         this._reset();
     }
-});
+};
diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js
index d7077a063..557fe1d4b 100644
--- a/js/ui/osdWindow.js
+++ b/js/ui/osdWindow.js
@@ -16,44 +16,38 @@ var HIDE_TIMEOUT = 1500;
 var FADE_TIME = 0.1;
 var LEVEL_ANIMATION_TIME = 0.1;
 
-var LevelBar = new Lang.Class({
-    Name: 'LevelBar',
-    Extends: BarLevel.BarLevel,
+var LevelBar = class extends BarLevel.BarLevel {
+    constructor() {
+        super(0, { styleClass: 'level' });
 
-    _init() {
         this._level = 0;
         this._maxLevel = 100;
 
-        let params = {
-            styleClass: 'level',
-        }
-        this.parent(this._level, params);
-
         this.actor.accessible_name = _("Volume");
 
         this.actor.connect('notify::width', () => { this.level = this.level; });
-    },
+    }
 
     get level() {
         return this._level;
-    },
+    }
 
     set level(value) {
         this._level = Math.max(0, Math.min(value, this._maxLevel));
 
         this.setValue(this._level / 100);
-    },
+    }
 
     get maxLevel() {
         return this._maxLevel;
-    },
+    }
 
     set maxLevel(value) {
         this._maxLevel = Math.max(100, value);
 
         this.setMaximumValue(this._maxLevel / 100);
     }
-});
+};
 
 var OsdWindowConstraint = new Lang.Class({
     Name: 'OsdWindowConstraint',
@@ -87,10 +81,8 @@ var OsdWindowConstraint = new Lang.Class({
     }
 });
 
-var OsdWindow = new Lang.Class({
-    Name: 'OsdWindow',
-
-    _init(monitorIndex) {
+var OsdWindow = class {
+    constructor(monitorIndex) {
         this.actor = new St.Widget({ x_expand: true,
                                      y_expand: true,
                                      x_align: Clutter.ActorAlign.CENTER,
@@ -129,7 +121,7 @@ var OsdWindow = new Lang.Class({
                                  this._relayout.bind(this));
         this._relayout();
         Main.uiGroup.add_child(this.actor);
-    },
+    }
 
     _onDestroy() {
         if (this._monitorsChangedId)
@@ -140,17 +132,17 @@ var OsdWindow = new Lang.Class({
         if (this._scaleChangedId)
             themeContext.disconnect(this._scaleChangedId);
         this._scaleChangedId = 0;
-    },
+    }
 
     setIcon(icon) {
         this._icon.gicon = icon;
-    },
+    }
 
     setLabel(label) {
         this._label.visible = (label != undefined);
         if (label)
             this._label.text = label;
-    },
+    }
 
     setLevel(level) {
         this._level.actor.visible = (level != undefined);
@@ -163,13 +155,13 @@ var OsdWindow = new Lang.Class({
             else
                 this._level.level = level;
         }
-    },
+    }
 
     setMaxLevel(maxLevel) {
         if (maxLevel === undefined)
             maxLevel = 100;
         this._level.maxLevel = maxLevel;
-    },
+    }
 
     show() {
         if (!this._icon.gicon)
@@ -192,7 +184,7 @@ var OsdWindow = new Lang.Class({
         this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT,
                                                    this._hide.bind(this));
         GLib.Source.set_name_by_id(this._hideTimeoutId, '[gnome-shell] this._hide');
-    },
+    }
 
     cancel() {
         if (!this._hideTimeoutId)
@@ -200,7 +192,7 @@ var OsdWindow = new Lang.Class({
 
         Mainloop.source_remove(this._hideTimeoutId);
         this._hide();
-    },
+    }
 
     _hide() {
         this._hideTimeoutId = 0;
@@ -214,14 +206,14 @@ var OsdWindow = new Lang.Class({
                            }
                          });
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _reset() {
         this.actor.hide();
         this.setLabel(null);
         this.setMaxLevel(null);
         this.setLevel(null);
-    },
+    }
 
     _relayout() {
         /* assume 110x110 on a 640x480 display and scale from there */
@@ -239,17 +231,15 @@ var OsdWindow = new Lang.Class({
         this._box.translation_y = Math.round(monitor.height / 4);
         this._boxConstraint.minSize = popupSize;
     }
-});
+};
 
-var OsdWindowManager = new Lang.Class({
-    Name: 'OsdWindowManager',
-
-    _init() {
+var OsdWindowManager = class {
+    constructor() {
         this._osdWindows = [];
         Main.layoutManager.connect('monitors-changed',
                                     this._monitorsChanged.bind(this));
         this._monitorsChanged();
-    },
+    }
 
     _monitorsChanged() {
         for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
@@ -263,7 +253,7 @@ var OsdWindowManager = new Lang.Class({
         }
 
         this._osdWindows.length = Main.layoutManager.monitors.length;
-    },
+    }
 
     _showOsdWindow(monitorIndex, icon, label, level, maxLevel) {
         this._osdWindows[monitorIndex].setIcon(icon);
@@ -271,7 +261,7 @@ var OsdWindowManager = new Lang.Class({
         this._osdWindows[monitorIndex].setMaxLevel(maxLevel);
         this._osdWindows[monitorIndex].setLevel(level);
         this._osdWindows[monitorIndex].show();
-    },
+    }
 
     show(monitorIndex, icon, label, level, maxLevel) {
         if (monitorIndex != -1) {
@@ -285,10 +275,10 @@ var OsdWindowManager = new Lang.Class({
             for (let i = 0; i < this._osdWindows.length; i++)
                 this._showOsdWindow(i, icon, label, level, maxLevel);
         }
-    },
+    }
 
     hideAll() {
         for (let i = 0; i < this._osdWindows.length; i++)
             this._osdWindows[i].cancel();
     }
-});
+};
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 35f5927a0..602e190a7 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -6,7 +6,6 @@ const Gtk = imports.gi.Gtk;
 const Meta = imports.gi.Meta;
 const Mainloop = imports.mainloop;
 const Signals = imports.signals;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 const Gdk = imports.gi.Gdk;
@@ -35,13 +34,11 @@ var DND_WINDOW_SWITCH_TIMEOUT = 750;
 
 var OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
 
-var ShellInfo = new Lang.Class({
-    Name: 'ShellInfo',
-
-    _init() {
+var ShellInfo = class {
+    constructor() {
         this._source = null;
         this._undoCallback = null;
-    },
+    }
 
     _onUndoClicked() {
         if (this._undoCallback)
@@ -50,7 +47,7 @@ var ShellInfo = new Lang.Class({
 
         if (this._source)
             this._source.destroy();
-    },
+    }
 
     setMessage(text, options) {
         options = Params.parse(options, { undoCallback: null,
@@ -84,18 +81,16 @@ var ShellInfo = new Lang.Class({
 
         this._source.notify(notification);
     }
-});
+};
 
-var Overview = new Lang.Class({
-    Name: 'Overview',
-
-    _init() {
+var Overview = class {
+    constructor() {
         this._overviewCreated = false;
         this._initCalled = false;
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _createOverview() {
         if (this._overviewCreated)
@@ -167,7 +162,7 @@ var Overview = new Lang.Class({
 
         if (this._initCalled)
             this.init();
-    },
+    }
 
     _updateBackgrounds() {
         for (let i = 0; i < this._bgManagers.length; i++)
@@ -181,7 +176,7 @@ var Overview = new Lang.Class({
                                                                vignette: true });
             this._bgManagers.push(bgManager);
         }
-    },
+    }
 
     _unshadeBackgrounds() {
         let backgrounds = this._backgroundGroup.get_children();
@@ -193,7 +188,7 @@ var Overview = new Lang.Class({
                                transition: 'easeOutQuad'
                              });
         }
-    },
+    }
 
     _shadeBackgrounds() {
         let backgrounds = this._backgroundGroup.get_children();
@@ -205,12 +200,12 @@ var Overview = new Lang.Class({
                                transition: 'easeOutQuad'
                              });
         }
-    },
+    }
 
     _sessionUpdated() {
         this.isDummy = !Main.sessionMode.hasOverview;
         this._createOverview();
-    },
+    }
 
     // The members we construct that are implemented in JS might
     // want to access the overview as Main.overview to connect
@@ -259,15 +254,15 @@ var Overview = new Lang.Class({
 
         Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
         this._relayout();
-    },
+    }
 
     addSearchProvider(provider) {
         this.viewSelector.addSearchProvider(provider);
-    },
+    }
 
     removeSearchProvider(provider) {
         this.viewSelector.removeSearchProvider(provider);
-    },
+    }
 
     //
     // options:
@@ -279,7 +274,7 @@ var Overview = new Lang.Class({
             return;
 
         this._shellInfo.setMessage(text, options);
-    },
+    }
 
     _onDragBegin() {
         this._inXdndDrag = true;
@@ -288,7 +283,7 @@ var Overview = new Lang.Class({
         // Remember the workspace we started from
         let workspaceManager = global.workspace_manager;
         this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index();
-    },
+    }
 
     _onDragEnd(time) {
         this._inXdndDrag = false;
@@ -305,7 +300,7 @@ var Overview = new Lang.Class({
         this._lastHoveredWindow = null;
         DND.removeDragMonitor(this._dragMonitor);
         this.endItemDrag();
-    },
+    }
 
     _resetWindowSwitchTimeout() {
         if (this._windowSwitchTimeoutId != 0) {
@@ -313,7 +308,7 @@ var Overview = new Lang.Class({
             this._windowSwitchTimeoutId = 0;
             this._needsFakePointerEvent = false;
         }
-    },
+    }
 
     _fakePointerEvent() {
         let display = Gdk.Display.get_default();
@@ -322,7 +317,7 @@ var Overview = new Lang.Class({
         let [gdkScreen, pointerX, pointerY] = pointer.get_position();
 
         pointer.warp(gdkScreen, pointerX, pointerY);
-    },
+    }
 
     _onDragMotion(dragEvent) {
         let targetIsWindow = dragEvent.targetActor &&
@@ -356,19 +351,19 @@ var Overview = new Lang.Class({
         }
 
         return DND.DragMotionResult.CONTINUE;
-    },
+    }
 
     _onScrollEvent(actor, event) {
         this.emit('scroll-event', event);
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     addAction(action) {
         if (this.isDummy)
             return;
 
         this._backgroundGroup.add_action(action);
-    },
+    }
 
     _getDesktopClone() {
         let windows = global.get_window_actors().filter(
@@ -384,7 +379,7 @@ var Overview = new Lang.Class({
             clone.destroy();
         });
         return clone;
-    },
+    }
 
     _relayout() {
         // To avoid updating the position and size of the workspaces
@@ -399,7 +394,7 @@ var Overview = new Lang.Class({
         this._coverPane.set_size(global.screen_width, global.screen_height);
 
         this._updateBackgrounds();
-    },
+    }
 
     _onRestacked() {
         let stack = global.get_window_actors();
@@ -411,44 +406,44 @@ var Overview = new Lang.Class({
         }
 
         this.emit('windows-restacked', stackIndices);
-    },
+    }
 
     beginItemDrag(source) {
         this.emit('item-drag-begin');
         this._inItemDrag = true;
-    },
+    }
 
     cancelledItemDrag(source) {
         this.emit('item-drag-cancelled');
-    },
+    }
 
     endItemDrag(source) {
         if (!this._inItemDrag)
             return;
         this.emit('item-drag-end');
         this._inItemDrag = false;
-    },
+    }
 
     beginWindowDrag(window) {
         this.emit('window-drag-begin', window);
         this._inWindowDrag = true;
-    },
+    }
 
     cancelledWindowDrag(window) {
         this.emit('window-drag-cancelled', window);
-    },
+    }
 
     endWindowDrag(window) {
         if (!this._inWindowDrag)
             return;
         this.emit('window-drag-end', window);
         this._inWindowDrag = false;
-    },
+    }
 
     focusSearch() {
         this.show();
         this._searchEntry.grab_key_focus();
-    },
+    }
 
     fadeInDesktop() {
             this._desktopFade.opacity = 0;
@@ -457,7 +452,7 @@ var Overview = new Lang.Class({
                              { opacity: 255,
                                time: ANIMATION_TIME,
                                transition: 'easeOutQuad' });
-    },
+    }
 
     fadeOutDesktop() {
         if (!this._desktopFade.get_n_children()) {
@@ -475,7 +470,7 @@ var Overview = new Lang.Class({
                            time: ANIMATION_TIME,
                            transition: 'easeOutQuad'
                          });
-    },
+    }
 
     // Checks if the Activities button is currently sensitive to
     // clicks. The first call to this function within the
@@ -492,7 +487,7 @@ var Overview = new Lang.Class({
             GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > 
OVERVIEW_ACTIVATION_TIMEOUT)
             return true;
         return false;
-    },
+    }
 
     _syncGrab() {
         // We delay grab changes during animation so that when removing the
@@ -521,7 +516,7 @@ var Overview = new Lang.Class({
             }
         }
         return true;
-    },
+    }
 
     // show:
     //
@@ -538,7 +533,7 @@ var Overview = new Lang.Class({
 
         Main.layoutManager.showOverview();
         this._animateVisible();
-    },
+    }
 
 
     _animateVisible() {
@@ -566,7 +561,7 @@ var Overview = new Lang.Class({
         this._coverPane.raise_top();
         this._coverPane.show();
         this.emit('showing');
-    },
+    }
 
     _showDone() {
         this.animationInProgress = false;
@@ -580,7 +575,7 @@ var Overview = new Lang.Class({
 
         this._syncGrab();
         global.sync_pointer();
-    },
+    }
 
     // hide:
     //
@@ -606,8 +601,7 @@ var Overview = new Lang.Class({
 
         this._animateNotVisible();
         this._syncGrab();
-    },
-
+    }
 
     _animateNotVisible() {
         if (!this.visible || this.animationInProgress)
@@ -631,7 +625,7 @@ var Overview = new Lang.Class({
         this._coverPane.raise_top();
         this._coverPane.show();
         this.emit('hiding');
-    },
+    }
 
     _hideDone() {
         // Re-enable unredirection
@@ -658,7 +652,7 @@ var Overview = new Lang.Class({
             this._fakePointerEvent();
             this._needsFakePointerEvent = false;
         }
-    },
+    }
 
     toggle() {
         if (this.isDummy)
@@ -668,10 +662,10 @@ var Overview = new Lang.Class({
             this.hide();
         else
             this.show();
-    },
+    }
 
     getShowAppsButton() {
         return this._dash.showAppsButton;
     }
-});
+};
 Signals.addSignalMethods(Overview.prototype);
diff --git a/js/ui/overviewControls.js b/js/ui/overviewControls.js
index 6dd4ae032..d57c27ac2 100644
--- a/js/ui/overviewControls.js
+++ b/js/ui/overviewControls.js
@@ -104,10 +104,8 @@ var SlideLayout = new Lang.Class({
     },
 });
 
-var SlidingControl = new Lang.Class({
-    Name: 'SlidingControl',
-
-    _init(params) {
+var SlidingControl = class {
+    constructor(params) {
         params = Params.parse(params, { slideDirection: SlideDirection.LEFT });
 
         this._visible = true;
@@ -128,23 +126,23 @@ var SlidingControl = new Lang.Class({
         Main.overview.connect('window-drag-begin', this._onWindowDragBegin.bind(this));
         Main.overview.connect('window-drag-cancelled', this._onWindowDragEnd.bind(this));
         Main.overview.connect('window-drag-end', this._onWindowDragEnd.bind(this));
-    },
+    }
 
     _getSlide() {
         throw new Error('getSlide() must be overridden');
-    },
+    }
 
     _updateSlide() {
         Tweener.addTween(this.layout, { slideX: this._getSlide(),
                                         time: SIDE_CONTROLS_ANIMATION_TIME,
                                         transition: 'easeOutQuad' });
-    },
+    }
 
     getVisibleWidth() {
         let child = this.actor.get_first_child();
         let [, , natWidth, ] = child.get_preferred_size();
         return natWidth;
-    },
+    }
 
     _getTranslation() {
         let child = this.actor.get_first_child();
@@ -155,7 +153,7 @@ var SlidingControl = new Lang.Class({
             return - visibleWidth;
         else
             return visibleWidth;
-    },
+    }
 
     _updateTranslation() {
         let translationStart = 0;
@@ -176,57 +174,57 @@ var SlidingControl = new Lang.Class({
         Tweener.addTween(this.layout, { translationX: translationEnd,
                                         time: SIDE_CONTROLS_ANIMATION_TIME,
                                         transition: 'easeOutQuad' });
-    },
+    }
 
     _onOverviewHiding() {
         // We need to explicitly slideOut since showing pages
         // doesn't imply sliding out, instead, hiding the overview does.
         this.slideOut();
-    },
+    }
 
     _onWindowDragBegin() {
         this._onDragBegin();
-    },
+    }
 
     _onWindowDragEnd() {
         this._onDragEnd();
-    },
+    }
 
     _onDragBegin() {
         this._inDrag = true;
         this._updateTranslation();
         this._updateSlide();
-    },
+    }
 
     _onDragEnd() {
         this._inDrag = false;
         this._updateSlide();
-    },
+    }
 
     fadeIn() {
         Tweener.addTween(this.actor, { opacity: 255,
                                        time: SIDE_CONTROLS_ANIMATION_TIME / 2,
                                        transition: 'easeInQuad'
                                      });
-    },
+    }
 
     fadeHalf() {
         Tweener.addTween(this.actor, { opacity: 128,
                                        time: SIDE_CONTROLS_ANIMATION_TIME / 2,
                                        transition: 'easeOutQuad'
                                      });
-    },
+    }
 
     slideIn() {
         this._visible = true;
         // we will update slideX and the translation from pageEmpty
-    },
+    }
 
     slideOut() {
         this._visible = false;
         this._updateTranslation();
         // we will update slideX from pageEmpty
-    },
+    }
 
     pageEmpty() {
         // When pageEmpty is received, there's no visible view in the
@@ -236,14 +234,11 @@ var SlidingControl = new Lang.Class({
         this.layout.slideX = this._getSlide();
         this._updateTranslation();
     }
-});
-
-var ThumbnailsSlider = new Lang.Class({
-    Name: 'ThumbnailsSlider',
-    Extends: SlidingControl,
+};
 
-    _init(thumbnailsBox) {
-        this.parent({ slideDirection: SlideDirection.RIGHT });
+var ThumbnailsSlider = class extends SlidingControl {
+    constructor(thumbnailsBox) {
+        super({ slideDirection: SlideDirection.RIGHT });
 
         this._thumbnailsBox = thumbnailsBox;
 
@@ -259,7 +254,7 @@ var ThumbnailsSlider = new Lang.Class({
                                          this._updateSlide.bind(this));
         this.actor.connect('notify::hover', this._updateSlide.bind(this));
         this._thumbnailsBox.bind_property('visible', this.actor, 'visible', 
GObject.BindingFlags.SYNC_CREATE);
-    },
+    }
 
     _getAlwaysZoomOut() {
         // Always show the pager on hover, during a drag, or if workspaces are
@@ -287,17 +282,17 @@ var ThumbnailsSlider = new Lang.Class({
         }
 
         return alwaysZoomOut;
-    },
+    }
 
     getNonExpandedWidth() {
         let child = this.actor.get_first_child();
         return child.get_theme_node().get_length('visible-width');
-    },
+    }
 
     _onDragEnd() {
         this.actor.sync_hover();
-        this.parent();
-    },
+        super._onDragEnd();
+    }
 
     _getSlide() {
         if (!this._visible)
@@ -312,23 +307,20 @@ var ThumbnailsSlider = new Lang.Class({
         let expandedWidth = child.get_preferred_width(preferredHeight)[1];
 
         return this.getNonExpandedWidth() / expandedWidth;
-    },
+    }
 
     getVisibleWidth() {
         let alwaysZoomOut = this._getAlwaysZoomOut();
         if (alwaysZoomOut)
-            return this.parent();
+            return super.getVisibleWidth();
         else
             return this.getNonExpandedWidth();
     }
-});
-
-var DashSlider = new Lang.Class({
-    Name: 'DashSlider',
-    Extends: SlidingControl,
+};
 
-    _init(dash) {
-        this.parent({ slideDirection: SlideDirection.LEFT });
+var DashSlider = class extends SlidingControl {
+    constructor(dash) {
+        super({ slideDirection: SlideDirection.LEFT });
 
         this._dash = dash;
 
@@ -344,23 +336,23 @@ var DashSlider = new Lang.Class({
         this.actor.add_actor(this._dash.actor);
 
         this._dash.connect('icon-size-changed', this._updateSlide.bind(this));
-    },
+    }
 
     _getSlide() {
         if (this._visible || this._inDrag)
             return 1;
         else
             return 0;
-    },
+    }
 
     _onWindowDragBegin() {
         this.fadeHalf();
-    },
+    }
 
     _onWindowDragEnd() {
         this.fadeIn();
     }
-});
+};
 
 var DashSpacer = new Lang.Class({
     Name: 'DashSpacer',
@@ -411,10 +403,8 @@ var ControlsLayout = new Lang.Class({
     }
 });
 
-var ControlsManager = new Lang.Class({
-    Name: 'ControlsManager',
-
-    _init(searchEntry) {
+var ControlsManager = class {
+    constructor(searchEntry) {
         this.dash = new Dash.Dash();
         this._dashSlider = new DashSlider(this.dash);
         this._dashSpacer = new DashSpacer();
@@ -457,7 +447,7 @@ var ControlsManager = new Lang.Class({
         Main.overview.connect('item-drag-cancelled', () => {
             this.viewSelector.fadeIn();
         });
-    },
+    }
 
     _updateWorkspacesGeometry() {
         let [x, y] = this.actor.get_transformed_position();
@@ -477,7 +467,7 @@ var ControlsManager = new Lang.Class({
             geometry.x += thumbnailsWidth;
 
         this.viewSelector.setWorkspacesFullGeometry(geometry);
-    },
+    }
 
     _setVisibility() {
         // Ignore the case when we're leaving the overview, since
@@ -502,7 +492,7 @@ var ControlsManager = new Lang.Class({
             this._thumbnailsSlider.slideIn();
         else
             this._thumbnailsSlider.slideOut();
-    },
+    }
 
     _updateSpacerVisibility() {
         if (Main.overview.animationInProgress && !Main.overview.visibleTarget)
@@ -510,7 +500,7 @@ var ControlsManager = new Lang.Class({
 
         let activePage = this.viewSelector.getActivePage();
         this._dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS);
-    },
+    }
 
     _onPageEmpty() {
         this._dashSlider.pageEmpty();
@@ -518,4 +508,4 @@ var ControlsManager = new Lang.Class({
 
         this._updateSpacerVisibility();
     }
-});
+};
diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js
index 48219026c..79b3eeb79 100644
--- a/js/ui/padOsd.js
+++ b/js/ui/padOsd.js
@@ -32,10 +32,8 @@ const CCW = 1;
 const UP = 0;
 const DOWN = 1;
 
-var PadChooser = new Lang.Class({
-    Name: 'PadChooser',
-
-    _init(device, groupDevices) {
+var PadChooser = class {
+    constructor(device, groupDevices) {
         this.actor = new St.Button({ style_class: 'pad-chooser-button',
                                      toggle_mode: true,
                                      x_fill: false,
@@ -62,7 +60,7 @@ var PadChooser = new Lang.Class({
                 this._padChooserMenu.close(true);
             }
         });
-    },
+    }
 
     _ensureMenu(devices) {
         this._padChooserMenu =  new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.TOP);
@@ -81,33 +79,31 @@ var PadChooser = new Lang.Class({
                 this.emit('pad-selected', device);
             });
         }
-    },
+    }
 
     _onDestroy() {
         this._padChooserMenu.destroy();
-    },
+    }
 
     update(devices) {
         if (this._padChooserMenu)
             this._padChooserMenu.actor.destroy();
         this.actor.set_checked(false);
         this._ensureMenu(devices);
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
-});
+    }
+};
 Signals.addSignalMethods(PadChooser.prototype);
 
-var KeybindingEntry = new Lang.Class({
-    Name: 'KeybindingEntry',
-
-    _init() {
+var KeybindingEntry = class {
+    constructor() {
         this.actor = new St.Entry({ hint_text: _("New shortcut…"),
                                     style: 'width: 10em' });
         this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         if (event.type() != Clutter.EventType.KEY_PRESS)
@@ -121,13 +117,11 @@ var KeybindingEntry = new Lang.Class({
         this.emit('keybinding-edited', str);
         return Clutter.EVENT_STOP;
     }
-});
+};
 Signals.addSignalMethods(KeybindingEntry.prototype);
 
-var ActionComboBox = new Lang.Class({
-    Name: 'ActionComboBox',
-
-    _init() {
+var ActionComboBox = class {
+    constructor() {
         this.actor = new St.Button({ style_class: 'button' });
         this.actor.connect('clicked', this._onButtonClicked.bind(this));
         this.actor.set_toggle_mode(true);
@@ -175,43 +169,41 @@ var ActionComboBox = new Lang.Class({
         }
 
         this.setAction(GDesktopEnums.PadButtonAction.NONE);
-    },
+    }
 
     _onActionSelected(action) {
         this.setAction(action);
         this.popdown();
         this.emit('action-selected', action);
-    },
+    }
 
     setAction(action) {
         this._label.set_text(this._actionLabels.get(action));
-    },
+    }
 
     popup() {
         this._editMenu.open(true);
-    },
+    }
 
     popdown() {
         this._editMenu.close(true);
-    },
+    }
 
     _onButtonClicked() {
         if (this.actor.get_checked())
             this.popup();
         else
             this.popdown();
-    },
+    }
 
     setButtonActionsActive(active) {
         this._buttonItems.forEach(item => { item.setSensitive(active); });
     }
-});
+};
 Signals.addSignalMethods(ActionComboBox.prototype);
 
-var ActionEditor = new Lang.Class({
-    Name: 'ActionEditor',
-
-    _init() {
+var ActionEditor = class {
+    constructor() {
         let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
                                                 spacing: 12 });
 
@@ -230,7 +222,7 @@ var ActionEditor = new Lang.Class({
                                            x_expand: false});
         this._doneButton.connect('clicked', this._onEditingDone.bind(this));
         this.actor.add_actor(this._doneButton);
-    },
+    }
 
     _updateKeybindingEntryState() {
         if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) {
@@ -240,7 +232,7 @@ var ActionEditor = new Lang.Class({
         } else {
             this._keybindingEdit.actor.hide();
         }
-    },
+    }
 
     setSettings(settings, action) {
         this._buttonSettings = settings;
@@ -252,21 +244,21 @@ var ActionEditor = new Lang.Class({
 
         let isButton = (action == Meta.PadActionType.BUTTON);
         this._actionComboBox.setButtonActionsActive(isButton);
-    },
+    }
 
     close() {
         this._actionComboBox.popdown();
         this.actor.hide();
-    },
+    }
 
     _onKeybindingEdited(entry, keybinding) {
         this._currentKeybinding = keybinding;
-    },
+    }
 
     _onActionSelected(menu, action) {
         this._currentAction = action;
         this._updateKeybindingEntryState();
-    },
+    }
 
     _storeSettings() {
         if (!this._buttonSettings)
@@ -283,14 +275,14 @@ var ActionEditor = new Lang.Class({
             this._buttonSettings.set_string('keybinding', keybinding);
         else
             this._buttonSettings.reset('keybinding');
-    },
+    }
 
     _onEditingDone() {
         this._storeSettings();
         this.close();
         this.emit('done');
     }
-});
+};
 Signals.addSignalMethods(ActionEditor.prototype);
 
 var PadDiagram = new Lang.Class({
@@ -629,10 +621,8 @@ var PadDiagram = new Lang.Class({
     }
 });
 
-var PadOsd = new Lang.Class({
-    Name: 'PadOsd',
-
-    _init(padDevice, settings, imagePath, editionMode, monitorIndex) {
+var PadOsd = class {
+    constructor(padDevice, settings, imagePath, editionMode, monitorIndex) {
         this.padDevice = padDevice;
         this._groupPads = [ padDevice ];
         this._settings = settings;
@@ -752,7 +742,7 @@ var PadOsd = new Lang.Class({
 
         this._syncEditionMode();
         Main.pushModal(this.actor);
-    },
+    }
 
     _updatePadChooser() {
         if (this._groupPads.length > 1) {
@@ -769,7 +759,7 @@ var PadOsd = new Lang.Class({
             this._padChooser.destroy();
             this._padChooser = null;
         }
-    },
+    }
 
     _requestForOtherPad(pad) {
         if (pad == this.padDevice ||
@@ -779,13 +769,13 @@ var PadOsd = new Lang.Class({
         let editionMode = this._editionMode;
         this.destroy();
         global.display.request_pad_osd(pad, editionMode);
-    },
+    }
 
     _createLabel(type, number, dir) {
         let str = global.display.get_pad_action_label(this.padDevice, type, number);
         let label = new St.Label({ text: str ? str : _("None") });
         this._padDiagram.addLabel(label, type, number, dir);
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
@@ -830,7 +820,7 @@ var PadOsd = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _syncEditionMode() {
         this._editButton.set_reactive(!this._editionMode);
@@ -850,7 +840,7 @@ var PadOsd = new Lang.Class({
         }
 
         this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>');
-    },
+    }
 
     _isEditedAction(type, number, dir) {
         if (!this._editedAction)
@@ -859,7 +849,7 @@ var PadOsd = new Lang.Class({
         return (this._editedAction.type == type &&
                 this._editedAction.number == number &&
                 this._editedAction.dir == dir);
-    },
+    }
 
     _followUpActionEdition(str) {
         let { type, dir, number, mode } = this._editedAction;
@@ -876,7 +866,7 @@ var PadOsd = new Lang.Class({
             this._startStripActionEdition(number, DOWN, mode);
 
         return true;
-    },
+    }
 
     _endActionEdition() {
         this._actionEditor.close();
@@ -893,7 +883,7 @@ var PadOsd = new Lang.Class({
         }
 
         this._editedActionSettings = null;
-    },
+    }
 
     _startActionEdition(key, type, number, dir, mode) {
         if (this._isEditedAction(type, number, dir))
@@ -907,25 +897,25 @@ var PadOsd = new Lang.Class({
                                                                 settingsPath);
         this._actionEditor.setSettings(this._editedActionSettings, type);
         this._padDiagram.startEdition(type, number, dir);
-    },
+    }
 
     _startButtonActionEdition(button) {
         let ch = String.fromCharCode('A'.charCodeAt() + button);
         let key = 'button' + ch;
         this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
-    },
+    }
 
     _startRingActionEdition(ring, dir, mode) {
         let ch = String.fromCharCode('A'.charCodeAt() + ring);
         let key = 'ring%s-%s-mode-%d'.format(ch, dir == CCW ? 'ccw' : 'cw', mode);
         this._startActionEdition(key, Meta.PadActionType.RING, ring, dir, mode);
-    },
+    }
 
     _startStripActionEdition(strip, dir, mode) {
         let ch = String.fromCharCode('A'.charCodeAt() + strip);
         let key = 'strip%s-%s-mode-%d'.format(ch, dir == UP ? 'up' : 'down', mode);
         this._startActionEdition(key, Meta.PadActionType.STRIP, strip, dir, mode);
-    },
+    }
 
     setEditionMode(editionMode) {
         if (this._editionMode == editionMode)
@@ -933,11 +923,11 @@ var PadOsd = new Lang.Class({
 
         this._editionMode = editionMode;
         this._syncEditionMode();
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     _onDestroy() {
         Main.popModal(this.actor);
@@ -961,19 +951,17 @@ var PadOsd = new Lang.Class({
         this.actor = null;
         this.emit('closed');
     }
-});
+};
 Signals.addSignalMethods(PadOsd.prototype);
 
 const PadOsdIface = loadInterfaceXML('org.gnome.Shell.Wacom.PadOsd');
 
-var PadOsdService = new Lang.Class({
-    Name: 'PadOsdService',
-
-    _init() {
+var PadOsdService = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom');
         Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null);
-    },
+    }
 
     ShowAsync(params, invocation) {
         let [deviceNode, editionMode] = params;
@@ -997,5 +985,5 @@ var PadOsdService = new Lang.Class({
         global.display.request_pad_osd(padDevice, editionMode);
         invocation.return_value(null);
     }
-});
+};
 Signals.addSignalMethods(PadOsdService.prototype);
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 1c6445a35..13eab5bed 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -488,16 +488,14 @@ var ActivitiesButton = new Lang.Class({
     }
 });
 
-var PanelCorner = new Lang.Class({
-    Name: 'PanelCorner',
-
-    _init(side) {
+var PanelCorner = class {
+    constructor(side) {
         this._side = side;
 
         this.actor = new St.DrawingArea({ style_class: 'panel-corner' });
         this.actor.connect('style-changed', this._styleChanged.bind(this));
         this.actor.connect('repaint', this._repaint.bind(this));
-    },
+    }
 
     _findRightmostButton(container) {
         if (!container.get_children)
@@ -522,7 +520,7 @@ var PanelCorner = new Lang.Class({
             return this._findRightmostButton(children[index]);
 
         return children[index];
-    },
+    }
 
     _findLeftmostButton(container) {
         if (!container.get_children)
@@ -547,7 +545,7 @@ var PanelCorner = new Lang.Class({
             return this._findLeftmostButton(children[index]);
 
         return children[index];
-    },
+    }
 
     setStyleParent(box) {
         let side = this._side;
@@ -593,7 +591,7 @@ var PanelCorner = new Lang.Class({
             // the .panel-button default
             button.style = 'transition-duration: 0ms';
         }
-    },
+    }
 
     _repaint() {
         let node = this.actor.get_theme_node();
@@ -641,7 +639,7 @@ var PanelCorner = new Lang.Class({
         }
 
         cr.$dispose();
-    },
+    }
 
     _styleChanged() {
         let node = this.actor.get_theme_node();
@@ -652,7 +650,7 @@ var PanelCorner = new Lang.Class({
         this.actor.set_size(cornerRadius, borderWidth + cornerRadius);
         this.actor.set_anchor_point(0, borderWidth);
     }
-});
+};
 
 var AggregateLayout = new Lang.Class({
     Name: 'AggregateLayout',
diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js
index 401419dec..d6c7b10b7 100644
--- a/js/ui/panelMenu.js
+++ b/js/ui/panelMenu.js
@@ -210,19 +210,17 @@ var Button = new Lang.Class({
  * of an icon and a menu section, which will be composed into the
  * aggregate menu.
  */
-var SystemIndicator = new Lang.Class({
-    Name: 'SystemIndicator',
-
-    _init() {
+var SystemIndicator = class {
+    constructor() {
         this.indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box',
                                              reactive: true });
         this.indicators.hide();
         this.menu = new PopupMenu.PopupMenuSection();
-    },
+    }
 
     _syncIndicatorsVisible() {
         this.indicators.visible = this.indicators.get_children().some(a => a.visible);
-    },
+    }
 
     _addIndicator() {
         let icon = new St.Icon({ style_class: 'system-status-icon' });
@@ -231,5 +229,5 @@ var SystemIndicator = new Lang.Class({
         this._syncIndicatorsVisible();
         return icon;
     }
-});
+};
 Signals.addSignalMethods(SystemIndicator.prototype);
diff --git a/js/ui/pointerWatcher.js b/js/ui/pointerWatcher.js
index 3b1fbdb8f..26bb28527 100644
--- a/js/ui/pointerWatcher.js
+++ b/js/ui/pointerWatcher.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Meta = imports.gi.Meta;
 const GnomeDesktop = imports.gi.GnomeDesktop;
@@ -22,14 +21,12 @@ function getPointerWatcher() {
     return _pointerWatcher;
 }
 
-var PointerWatch = new Lang.Class({
-    Name: 'PointerWatch',
-
-    _init(watcher, interval, callback) {
+var PointerWatch = class {
+    constructor(watcher, interval, callback) {
         this.watcher = watcher;
         this.interval = interval;
         this.callback = callback;
-    },
+    }
 
     // remove:
     // remove this watch. This function may safely be called
@@ -37,19 +34,17 @@ var PointerWatch = new Lang.Class({
     remove() {
         this.watcher._removeWatch(this);
     }
-});
-
-var PointerWatcher = new Lang.Class({
-    Name: 'PointerWatcher',
+};
 
-    _init() {
+var PointerWatcher = class {
+    constructor() {
         this._idleMonitor = Meta.IdleMonitor.get_core();
         this._idleMonitor.add_idle_watch(IDLE_TIME, this._onIdleMonitorBecameIdle.bind(this));
         this._idle = this._idleMonitor.get_idletime() > IDLE_TIME;
         this._watches = [];
         this.pointerX = null;
         this.pointerY = null;
-    },
+    }
 
     // addWatch:
     // @interval: hint as to the time resolution needed. When the user is
@@ -68,7 +63,7 @@ var PointerWatcher = new Lang.Class({
         this._watches.push(watch);
         this._updateTimeout();
         return watch;
-    },
+    }
 
     _removeWatch(watch) {
         for (let i = 0; i < this._watches.length; i++) {
@@ -78,19 +73,19 @@ var PointerWatcher = new Lang.Class({
                 return;
             }
         }
-    },
+    }
 
     _onIdleMonitorBecameActive(monitor) {
         this._idle = false;
         this._updatePointer();
         this._updateTimeout();
-    },
+    }
 
     _onIdleMonitorBecameIdle(monitor) {
         this._idle = true;
         this._idleMonitor.add_user_active_watch(this._onIdleMonitorBecameActive.bind(this));
         this._updateTimeout();
-    },
+    }
 
     _updateTimeout() {
         if (this._timeoutId) {
@@ -108,12 +103,12 @@ var PointerWatcher = new Lang.Class({
         this._timeoutId = Mainloop.timeout_add(minInterval,
                                                this._onTimeout.bind(this));
         GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
-    },
+    }
 
     _onTimeout() {
         this._updatePointer();
         return GLib.SOURCE_CONTINUE;
-    },
+    }
 
     _updatePointer() {
         let [x, y, mods] = global.get_pointer();
@@ -130,4 +125,4 @@ var PointerWatcher = new Lang.Class({
                 i++;
         }
     }
-});
+};
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index b0a919d1b..02ab885d4 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
 const Gtk = imports.gi.Gtk;
 const Gio = imports.gi.Gio;
 const GObject = imports.gi.GObject;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 const St = imports.gi.St;
@@ -58,10 +57,8 @@ function arrowIcon(side) {
     return arrow;
 }
 
-var PopupBaseMenuItem = new Lang.Class({
-    Name: 'PopupBaseMenuItem',
-
-    _init(params) {
+var PopupBaseMenuItem = class {
+    constructor(params) {
         params = Params.parse (params, { reactive: true,
                                          activate: true,
                                          hover: true,
@@ -103,30 +100,30 @@ var PopupBaseMenuItem = new Lang.Class({
         this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
         this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
         this.actor.connect('destroy', this._onDestroy.bind(this));
-    },
+    }
 
     _getTopMenu() {
         if (this._parent)
             return this._parent._getTopMenu();
         else
             return this;
-    },
+    }
 
     _setParent(parent) {
         this._parent = parent;
-    },
+    }
 
     _onButtonPressEvent(actor, event) {
         // This is the CSS active state
         this.actor.add_style_pseudo_class ('active');
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onButtonReleaseEvent(actor, event) {
         this.actor.remove_style_pseudo_class ('active');
         this.activate(event);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onTouchEvent(actor, event) {
         if (event.type() == Clutter.EventType.TOUCH_END) {
@@ -138,7 +135,7 @@ var PopupBaseMenuItem = new Lang.Class({
             this.actor.add_style_pseudo_class ('active');
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onKeyPressEvent(actor, event) {
         let state = event.get_state();
@@ -158,23 +155,23 @@ var PopupBaseMenuItem = new Lang.Class({
             return Clutter.EVENT_STOP;
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onKeyFocusIn(actor) {
         this.setActive(true);
-    },
+    }
 
     _onKeyFocusOut(actor) {
         this.setActive(false);
-    },
+    }
 
     _onHoverChanged(actor) {
         this.setActive(actor.hover);
-    },
+    }
 
     activate(event) {
         this.emit('activate', event);
-    },
+    }
 
     setActive(active) {
         let activeChanged = active != this.active;
@@ -195,7 +192,7 @@ var PopupBaseMenuItem = new Lang.Class({
             }
             this.emit('active-changed', active);
         }
-    },
+    }
 
     syncSensitive() {
         let sensitive = this.getSensitive();
@@ -203,12 +200,12 @@ var PopupBaseMenuItem = new Lang.Class({
         this.actor.can_focus = sensitive;
         this.emit('sensitive-changed');
         return sensitive;
-    },
+    }
 
     getSensitive() {
         let parentSensitive = this._parent ? this._parent.getSensitive() : true;
         return this._activatable && this._sensitive && parentSensitive;
-    },
+    }
 
     setSensitive(sensitive) {
         if (this._sensitive == sensitive)
@@ -216,15 +213,15 @@ var PopupBaseMenuItem = new Lang.Class({
 
         this._sensitive = sensitive;
         this.syncSensitive();
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     _onDestroy() {
         this.emit('destroy');
-    },
+    }
 
     setOrnament(ornament) {
         if (ornament == this._ornament)
@@ -243,29 +240,23 @@ var PopupBaseMenuItem = new Lang.Class({
             this.actor.remove_accessible_state(Atk.StateType.CHECKED);
         }
     }
-});
+};
 Signals.addSignalMethods(PopupBaseMenuItem.prototype);
 
-var PopupMenuItem = new Lang.Class({
-    Name: 'PopupMenuItem',
-    Extends: PopupBaseMenuItem,
-
-    _init(text, params) {
-        this.parent(params);
+var PopupMenuItem = class extends PopupBaseMenuItem {
+    constructor(text, params) {
+        super(params);
 
         this.label = new St.Label({ text: text });
         this.actor.add_child(this.label);
         this.actor.label_actor = this.label
     }
-});
-
-var PopupSeparatorMenuItem = new Lang.Class({
-    Name: 'PopupSeparatorMenuItem',
-    Extends: PopupBaseMenuItem,
+};
 
-    _init(text) {
-        this.parent({ reactive: false,
-                      can_focus: false});
+var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
+    constructor(text) {
+        super({ reactive: false,
+                can_focus: false});
 
         this.label = new St.Label({ text: text || '' });
         this.actor.add(this.label);
@@ -279,17 +270,15 @@ var PopupSeparatorMenuItem = new Lang.Class({
                                           y_expand: true,
                                           y_align: Clutter.ActorAlign.CENTER });
         this.actor.add(this._separator, { expand: true });
-    },
+    }
 
     _syncVisibility() {
         this.label.visible = this.label.text != '';
     }
-});
-
-var Switch = new Lang.Class({
-    Name: 'Switch',
+};
 
-    _init(state) {
+var Switch = class {
+    constructor(state) {
         this.actor = new St.Bin({ style_class: 'toggle-switch',
                                   accessible_role: Atk.Role.CHECK_BOX,
                                   can_focus: true });
@@ -300,7 +289,7 @@ var Switch = new Lang.Class({
         // simply result in invisible toggle switches.
         this.actor.add_style_class_name(_("toggle-switch-us"));
         this.setToggleState(state);
-    },
+    }
 
     setToggleState(state) {
         if (state)
@@ -308,19 +297,16 @@ var Switch = new Lang.Class({
         else
             this.actor.remove_style_pseudo_class('checked');
         this.state = state;
-    },
+    }
 
     toggle() {
         this.setToggleState(!this.state);
     }
-});
-
-var PopupSwitchMenuItem = new Lang.Class({
-    Name: 'PopupSwitchMenuItem',
-    Extends: PopupBaseMenuItem,
+};
 
-    _init(text, active, params) {
-        this.parent(params);
+var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
+    constructor(text, active, params) {
+        super(params);
 
         this.label = new St.Label({ text: text });
         this._switch = new Switch(active);
@@ -338,7 +324,7 @@ var PopupSwitchMenuItem = new Lang.Class({
                                            style_class: 'popup-status-menu-item'
                                          });
         this._statusBin.child = this._switch.actor;
-    },
+    }
 
     setStatus(text) {
         if (text != null) {
@@ -352,7 +338,7 @@ var PopupSwitchMenuItem = new Lang.Class({
             this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
         }
         this.checkAccessibleState();
-    },
+    }
 
     activate(event) {
         if (this._switch.actor.mapped) {
@@ -365,23 +351,23 @@ var PopupSwitchMenuItem = new Lang.Class({
             event.get_key_symbol() == Clutter.KEY_space)
             return;
 
-        this.parent(event);
-    },
+        super.activate(event);
+    }
 
     toggle() {
         this._switch.toggle();
         this.emit('toggled', this._switch.state);
         this.checkAccessibleState();
-    },
+    }
 
     get state() {
         return this._switch.state;
-    },
+    }
 
     setToggleState(state) {
         this._switch.setToggleState(state);
         this.checkAccessibleState();
-    },
+    }
 
     checkAccessibleState() {
         switch (this.actor.accessible_role) {
@@ -395,14 +381,11 @@ var PopupSwitchMenuItem = new Lang.Class({
             this.actor.remove_accessible_state (Atk.StateType.CHECKED);
         }
     }
-});
-
-var PopupImageMenuItem = new Lang.Class({
-    Name: 'PopupImageMenuItem',
-    Extends: PopupBaseMenuItem,
+};
 
-    _init(text, icon, params) {
-        this.parent(params);
+var PopupImageMenuItem = class extends PopupBaseMenuItem {
+    constructor(text, icon, params) {
+        super(params);
 
         this._icon = new St.Icon({ style_class: 'popup-menu-icon',
                                    x_align: Clutter.ActorAlign.END });
@@ -412,7 +395,7 @@ var PopupImageMenuItem = new Lang.Class({
         this.actor.label_actor = this.label;
 
         this.setIcon(icon);
-    },
+    }
 
     setIcon(icon) {
         // The 'icon' parameter can be either a Gio.Icon or a string.
@@ -421,13 +404,13 @@ var PopupImageMenuItem = new Lang.Class({
         else
             this._icon.icon_name = icon;
     }
-});
+};
 
-var PopupMenuBase = new Lang.Class({
-    Name: 'PopupMenuBase',
-    Abstract: true,
+var PopupMenuBase = class {
+    constructor(sourceActor, styleClass) {
+        if (new.target === PopupMenuBase)
+            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 
-    _init(sourceActor, styleClass) {
         this.sourceActor = sourceActor;
         this._parent = null;
 
@@ -451,33 +434,33 @@ var PopupMenuBase = new Lang.Class({
         this._sensitive = true;
 
         this._sessionUpdatedId = Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
-    },
+    }
 
     _getTopMenu() {
         if (this._parent)
             return this._parent._getTopMenu();
         else
             return this;
-    },
+    }
 
     _setParent(parent) {
         this._parent = parent;
-    },
+    }
 
     getSensitive() {
         let parentSensitive = this._parent ? this._parent.getSensitive() : true;
         return this._sensitive && parentSensitive;
-    },
+    }
 
     setSensitive(sensitive) {
         this._sensitive = sensitive;
         this.emit('sensitive-changed');
-    },
+    }
 
     _sessionUpdated() {
         this._setSettingsVisibility(Main.sessionMode.allowSettings);
         this.close();
-    },
+    }
 
     addAction(title, callback, icon) {
         let menuItem;
@@ -492,7 +475,7 @@ var PopupMenuBase = new Lang.Class({
         });
 
         return menuItem;
-    },
+    }
 
     addSettingsAction(title, desktopFile) {
         let menuItem = this.addAction(title, () => {
@@ -511,14 +494,14 @@ var PopupMenuBase = new Lang.Class({
         this._settingsActions[desktopFile] = menuItem;
 
         return menuItem;
-    },
+    }
 
     _setSettingsVisibility(visible) {
         for (let id in this._settingsActions) {
             let item = this._settingsActions[id];
             item.actor.visible = visible;
         }
-    },
+    }
 
     isEmpty() {
         let hasVisibleChildren = this.box.get_children().some(child => {
@@ -528,21 +511,21 @@ var PopupMenuBase = new Lang.Class({
         });
 
         return !hasVisibleChildren;
-    },
+    }
 
     itemActivated(animate) {
         if (animate == undefined)
             animate = BoxPointer.PopupAnimation.FULL;
 
         this._getTopMenu().close(animate);
-    },
+    }
 
     _subMenuActiveChanged(submenu, submenuItem) {
         if (this._activeMenuItem && this._activeMenuItem != submenuItem)
             this._activeMenuItem.setActive(false);
         this._activeMenuItem = submenuItem;
         this.emit('active-changed', submenuItem);
-    },
+    }
 
     _connectItemSignals(menuItem) {
         menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
@@ -590,7 +573,7 @@ var PopupMenuBase = new Lang.Class({
             if (menuItem == this._activeMenuItem)
                 this._activeMenuItem = null;
         });
-    },
+    }
 
     _updateSeparatorVisibility(menuItem) {
         if (menuItem.label.text)
@@ -626,7 +609,7 @@ var PopupMenuBase = new Lang.Class({
         }
 
         menuItem.actor.show();
-    },
+    }
 
     moveMenuItem(menuItem, position) {
         let items = this._getMenuItems();
@@ -644,7 +627,7 @@ var PopupMenuBase = new Lang.Class({
         } else {
                 this.box.set_child_above_sibling(menuItem.actor, null);
         }
-    },
+    }
 
     addMenuItem(menuItem, position) {
         let before_item = null;
@@ -721,13 +704,13 @@ var PopupMenuBase = new Lang.Class({
         menuItem._setParent(this);
 
         this.length++;
-    },
+    }
 
     _getMenuItems() {
         return this.box.get_children().map(a => a._delegate).filter(item => {
             return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection;
         });
-    },
+    }
 
     get firstMenuItem() {
         let items = this._getMenuItems();
@@ -735,11 +718,11 @@ var PopupMenuBase = new Lang.Class({
             return items[0];
         else
             return null;
-    },
+    }
 
     get numMenuItems() {
         return this._getMenuItems().length;
-    },
+    }
 
     removeAll() {
         let children = this._getMenuItems();
@@ -747,14 +730,14 @@ var PopupMenuBase = new Lang.Class({
             let item = children[i];
             item.destroy();
         }
-    },
+    }
 
     toggle() {
         if (this.isOpen)
             this.close(BoxPointer.PopupAnimation.FULL);
         else
             this.open(BoxPointer.PopupAnimation.FULL);
-    },
+    }
 
     destroy() {
         this.close();
@@ -766,15 +749,12 @@ var PopupMenuBase = new Lang.Class({
         Main.sessionMode.disconnect(this._sessionUpdatedId);
         this._sessionUpdatedId = 0;
     }
-});
+};
 Signals.addSignalMethods(PopupMenuBase.prototype);
 
-var PopupMenu = new Lang.Class({
-    Name: 'PopupMenu',
-    Extends: PopupMenuBase,
-
-    _init(sourceActor, arrowAlignment, arrowSide) {
-        this.parent(sourceActor, 'popup-menu-content');
+var PopupMenu = class extends PopupMenuBase {
+    constructor(sourceActor, arrowAlignment, arrowSide) {
+        super(sourceActor, 'popup-menu-content');
 
         this._arrowAlignment = arrowAlignment;
         this._arrowSide = arrowSide;
@@ -798,14 +778,14 @@ var PopupMenu = new Lang.Class({
                                                         this._onKeyPress.bind(this));
 
         this._openedSubMenu = null;
-    },
+    }
 
     _setOpenedSubMenu(submenu) {
         if (this._openedSubMenu)
             this._openedSubMenu.close(true);
 
         this._openedSubMenu = submenu;
-    },
+    }
 
     _onKeyPress(actor, event) {
         // Disable toggling the menu by keyboard
@@ -853,16 +833,15 @@ var PopupMenu = new Lang.Class({
             return Clutter.EVENT_STOP;
         } else
             return Clutter.EVENT_PROPAGATE;
-    },
-
+    }
 
     setArrowOrigin(origin) {
         this._boxPointer.setArrowOrigin(origin);
-    },
+    }
 
     setSourceAlignment(alignment) {
         this._boxPointer.setSourceAlignment(alignment);
-    },
+    }
 
     open(animate) {
         if (this.isOpen)
@@ -879,7 +858,7 @@ var PopupMenu = new Lang.Class({
         this.actor.raise_top();
 
         this.emit('open-state-changed', true);
-    },
+    }
 
     close(animate) {
         if (this._activeMenuItem)
@@ -896,43 +875,38 @@ var PopupMenu = new Lang.Class({
 
         this.isOpen = false;
         this.emit('open-state-changed', false);
-    },
+    }
 
     destroy() {
         if (this._keyPressId)
             this.sourceActor.disconnect(this._keyPressId);
-        this.parent();
+        super.destroy();
     }
-});
-
-var PopupDummyMenu = new Lang.Class({
-    Name: 'PopupDummyMenu',
+};
 
-    _init(sourceActor) {
+var PopupDummyMenu = class {
+    constructor(sourceActor) {
         this.sourceActor = sourceActor;
         this.actor = sourceActor;
         this.actor._delegate = this;
-    },
+    }
 
     getSensitive() {
         return true;
-    },
+    }
 
-    open() { this.emit('open-state-changed', true); },
-    close() { this.emit('open-state-changed', false); },
-    toggle() {},
+    open() { this.emit('open-state-changed', true); }
+    close() { this.emit('open-state-changed', false); }
+    toggle() {}
     destroy() {
         this.emit('destroy');
-    },
-});
+    }
+};
 Signals.addSignalMethods(PopupDummyMenu.prototype);
 
-var PopupSubMenu = new Lang.Class({
-    Name: 'PopupSubMenu',
-    Extends: PopupMenuBase,
-
-    _init(sourceActor, sourceArrow) {
-        this.parent(sourceActor);
+var PopupSubMenu = class extends PopupMenuBase {
+    constructor(sourceActor, sourceArrow) {
+        super(sourceActor);
 
         this._arrow = sourceArrow;
 
@@ -948,7 +922,7 @@ var PopupSubMenu = new Lang.Class({
         this.actor.clip_to_allocation = true;
         this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
         this.actor.hide();
-    },
+    }
 
     _needsScrollbar() {
         let topMenu = this._getTopMenu();
@@ -957,11 +931,11 @@ var PopupSubMenu = new Lang.Class({
 
         let topMaxHeight = topThemeNode.get_max_height();
         return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight;
-    },
+    }
 
     getSensitive() {
         return this._sensitive && this.sourceActor._delegate.getSensitive();
-    },
+    }
 
     open(animate) {
         if (this.isOpen)
@@ -1017,7 +991,7 @@ var PopupSubMenu = new Lang.Class({
         } else {
             this._arrow.rotation_angle_z = targetAngle;
         }
-    },
+    }
 
     close(animate) {
         if (!this.isOpen)
@@ -1052,7 +1026,7 @@ var PopupSubMenu = new Lang.Class({
             this._arrow.rotation_angle_z = 0;
             this.actor.hide();
         }
-    },
+    }
 
     _onKeyPressEvent(actor, event) {
         // Move focus back to parent menu if the user types Left.
@@ -1065,7 +1039,7 @@ var PopupSubMenu = new Lang.Class({
 
         return Clutter.EVENT_PROPAGATE;
     }
-});
+};
 
 /**
  * PopupMenuSection:
@@ -1075,30 +1049,24 @@ var PopupSubMenu = new Lang.Class({
  * can add it to another menu), but is completely transparent
  * to the user
  */
-var PopupMenuSection = new Lang.Class({
-    Name: 'PopupMenuSection',
-    Extends: PopupMenuBase,
-
-    _init() {
-        this.parent();
+var PopupMenuSection = class extends PopupMenuBase {
+    constructor() {
+        super();
 
         this.actor = this.box;
         this.actor._delegate = this;
         this.isOpen = true;
-    },
+    }
 
     // deliberately ignore any attempt to open() or close(), but emit the
     // corresponding signal so children can still pick it up
-    open() { this.emit('open-state-changed', true); },
-    close() { this.emit('open-state-changed', false); },
-});
-
-var PopupSubMenuMenuItem = new Lang.Class({
-    Name: 'PopupSubMenuMenuItem',
-    Extends: PopupBaseMenuItem,
+    open() { this.emit('open-state-changed', true); }
+    close() { this.emit('open-state-changed', false); }
+};
 
-    _init(text, wantIcon) {
-        this.parent();
+var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
+    constructor(text, wantIcon) {
+        super();
 
         this.actor.add_style_class_name('popup-submenu-menu-item');
 
@@ -1128,19 +1096,19 @@ var PopupSubMenuMenuItem = new Lang.Class({
 
         this.menu = new PopupSubMenu(this.actor, this._triangle);
         this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
-    },
+    }
 
     _setParent(parent) {
-        this.parent(parent);
+        super._setParent(parent);
         this.menu._setParent(parent);
-    },
+    }
 
     syncSensitive() {
-        let sensitive = this.parent();
+        let sensitive = super.syncSensitive();
         this._triangle.visible = sensitive;
         if (!sensitive)
             this.menu.close(false);
-    },
+    }
 
     _subMenuOpenStateChanged(menu, open) {
         if (open) {
@@ -1154,28 +1122,28 @@ var PopupSubMenuMenuItem = new Lang.Class({
             this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
             this.actor.remove_style_pseudo_class('checked');
         }
-    },
+    }
 
     destroy() {
         this.menu.destroy();
 
-        this.parent();
-    },
+        super.destroy();
+    }
 
     setSubmenuShown(open) {
         if (open)
             this.menu.open(BoxPointer.PopupAnimation.FULL);
         else
             this.menu.close(BoxPointer.PopupAnimation.FULL);
-    },
+    }
 
     _setOpenState(open) {
         this.setSubmenuShown(open);
-    },
+    }
 
     _getOpenState() {
         return this.menu.isOpen;
-    },
+    }
 
     _onKeyPressEvent(actor, event) {
         let symbol = event.get_key_symbol();
@@ -1189,12 +1157,12 @@ var PopupSubMenuMenuItem = new Lang.Class({
             return Clutter.EVENT_STOP;
         }
 
-        return this.parent(actor, event);
-    },
+        return super._onKeyPressEvent(actor, event);
+    }
 
     activate(event) {
         this._setOpenState(true);
-    },
+    }
 
     _onButtonReleaseEvent(actor) {
         // Since we override the parent, we need to manage what the parent does
@@ -1202,7 +1170,7 @@ var PopupSubMenuMenuItem = new Lang.Class({
         this.actor.remove_style_pseudo_class ('active');
         this._setOpenState(!this._getOpenState());
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onTouchEvent(actor, event) {
         if (event.type() == Clutter.EventType.TOUCH_END) {
@@ -1213,21 +1181,19 @@ var PopupSubMenuMenuItem = new Lang.Class({
         }
         return Clutter.EVENT_PROPAGATE;
     }
-});
+};
 
 /* Basic implementation of a menu manager.
  * Call addMenu to add menus
  */
-var PopupMenuManager = new Lang.Class({
-    Name: 'PopupMenuManager',
-
-    _init(owner, grabParams) {
+var PopupMenuManager = class {
+    constructor(owner, grabParams) {
         grabParams = Params.parse(grabParams,
                                   { actionMode: Shell.ActionMode.POPUP });
         this._owner = owner;
         this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
         this._menus = [];
-    },
+    }
 
     addMenu(menu, position) {
         if (this._findMenu(menu) > -1)
@@ -1256,7 +1222,7 @@ var PopupMenuManager = new Lang.Class({
             this._menus.push(menudata);
         else
             this._menus.splice(position, 0, menudata);
-    },
+    }
 
     removeMenu(menu) {
         if (menu == this.activeMenu)
@@ -1278,7 +1244,7 @@ var PopupMenuManager = new Lang.Class({
         if (menu.sourceActor)
             this._grabHelper.removeActor(menu.sourceActor);
         this._menus.splice(position, 1);
-    },
+    }
 
     get activeMenu() {
         let firstGrab = this._grabHelper.grabStack[0];
@@ -1286,11 +1252,11 @@ var PopupMenuManager = new Lang.Class({
             return firstGrab.actor._delegate;
         else
             return null;
-    },
+    }
 
     ignoreRelease() {
         return this._grabHelper.ignoreRelease();
-    },
+    }
 
     _onMenuOpenState(menu, open) {
         if (open) {
@@ -1303,12 +1269,12 @@ var PopupMenuManager = new Lang.Class({
         } else {
             this._grabHelper.ungrab({ actor: menu.actor });
         }
-    },
+    }
 
     _changeMenu(newMenu) {
         newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
                                      : BoxPointer.PopupAnimation.FULL);
-    },
+    }
 
     _onMenuSourceEnter(menu) {
         if (!this._grabHelper.grabbed)
@@ -1319,11 +1285,11 @@ var PopupMenuManager = new Lang.Class({
 
         this._changeMenu(menu);
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onMenuDestroy(menu) {
         this.removeMenu(menu);
-    },
+    }
 
     _findMenu(item) {
         for (let i = 0; i < this._menus.length; i++) {
@@ -1332,7 +1298,7 @@ var PopupMenuManager = new Lang.Class({
                 return i;
         }
         return -1;
-    },
+    }
 
     _closeMenu(isUser, menu) {
         // If this isn't a user action, we called close()
@@ -1341,4 +1307,4 @@ var PopupMenuManager = new Lang.Class({
         if (isUser)
             menu.close(BoxPointer.PopupAnimation.FULL);
     }
-});
+};
diff --git a/js/ui/remoteMenu.js b/js/ui/remoteMenu.js
index 78a2e2934..0cdcac8c1 100644
--- a/js/ui/remoteMenu.js
+++ b/js/ui/remoteMenu.js
@@ -4,7 +4,6 @@ const Atk = imports.gi.Atk;
 const GLib = imports.gi.GLib;
 const GObject = imports.gi.GObject;
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const ShellMenu = imports.gi.ShellMenu;
 const St = imports.gi.St;
@@ -38,10 +37,8 @@ function _removeItem(menu, position) {
     items[position].destroy();
 }
 
-var RemoteMenuSeparatorItemMapper = new Lang.Class({
-    Name: 'RemoteMenuSeparatorItemMapper',
-
-    _init(trackerItem) {
+var RemoteMenuSeparatorItemMapper = class {
+    constructor(trackerItem) {
         this._trackerItem = trackerItem;
         this.menuItem = new PopupMenu.PopupSeparatorMenuItem();
         this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
@@ -50,36 +47,31 @@ var RemoteMenuSeparatorItemMapper = new Lang.Class({
         this.menuItem.connect('destroy', () => {
             trackerItem.run_dispose();
         });
-    },
+    }
 
     _updateLabel() {
         this.menuItem.label.text = stripMnemonics(this._trackerItem.label);
-    },
-});
-
-var RequestSubMenu = new Lang.Class({
-    Name: 'RequestSubMenu',
-    Extends: PopupMenu.PopupSubMenuMenuItem,
+    }
+};
 
-    _init() {
-        this.parent('');
+var RequestSubMenu = class extends PopupMenu.PopupSubMenuMenuItem {
+    constructor() {
+        super('');
         this._requestOpen = false;
-    },
+    }
 
     _setOpenState(open) {
         this.emit('request-open', open);
         this._requestOpen = open;
-    },
+    }
 
     _getOpenState() {
         return this._requestOpen;
-    },
-});
-
-var RemoteMenuSubmenuItemMapper = new Lang.Class({
-    Name: 'RemoteMenuSubmenuItemMapper',
+    }
+};
 
-    _init(trackerItem) {
+var RemoteMenuSubmenuItemMapper = class {
+    constructor(trackerItem) {
         this._trackerItem = trackerItem;
         this.menuItem = new RequestSubMenu();
         this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
@@ -100,22 +92,19 @@ var RemoteMenuSubmenuItemMapper = new Lang.Class({
         this.menuItem.connect('destroy', () => {
             trackerItem.run_dispose();
         });
-    },
+    }
 
     destroy() {
         this._tracker.destroy();
-        this.parent();
-    },
+    }
 
     _updateLabel() {
         this.menuItem.label.text = stripMnemonics(this._trackerItem.label);
-    },
-});
+    }
+};
 
-var RemoteMenuItemMapper = new Lang.Class({
-    Name: 'RemoteMenuItemMapper',
-
-    _init(trackerItem) {
+var RemoteMenuItemMapper = class {
+    constructor(trackerItem) {
         this._trackerItem = trackerItem;
 
         this.menuItem = new PopupMenu.PopupBaseMenuItem();
@@ -146,20 +135,20 @@ var RemoteMenuItemMapper = new Lang.Class({
         this.menuItem.connect('destroy', () => {
             trackerItem.run_dispose();
         });
-    },
+    }
 
     _updateIcon() {
         this._icon.gicon = this._trackerItem.icon;
         this._icon.visible = (this._icon.gicon != null);
-    },
+    }
 
     _updateLabel() {
         this._label.text = stripMnemonics(this._trackerItem.label);
-    },
+    }
 
     _updateSensitivity() {
         this.menuItem.setSensitive(this._trackerItem.sensitive);
-    },
+    }
 
     _updateDecoration() {
         let ornamentForRole = {};
@@ -171,7 +160,7 @@ var RemoteMenuItemMapper = new Lang.Class({
             ornament = ornamentForRole[this._trackerItem.role];
 
         this.menuItem.setOrnament(ornament);
-    },
+    }
 
     _updateRole() {
         let a11yRoles = {};
@@ -183,15 +172,12 @@ var RemoteMenuItemMapper = new Lang.Class({
         this.menuItem.actor.accessible_role = a11yRole;
 
         this._updateDecoration();
-    },
-});
-
-var RemoteMenu = new Lang.Class({
-    Name: 'RemoteMenu',
-    Extends: PopupMenu.PopupMenu,
+    }
+};
 
-    _init(sourceActor, model, actionGroup) {
-        this.parent(sourceActor, 0.0, St.Side.TOP);
+var RemoteMenu = class extends PopupMenu.PopupMenu {
+    constructor(sourceActor, model, actionGroup) {
+        super(sourceActor, 0.0, St.Side.TOP);
 
         this._model = model;
         this._actionGroup = actionGroup;
@@ -200,14 +186,14 @@ var RemoteMenu = new Lang.Class({
                                               null, /* action namespace */
                                               _insertItem.bind(null, this),
                                               _removeItem.bind(null, this));
-    },
+    }
 
     get actionGroup() {
         return this._actionGroup;
-    },
+    }
 
     destroy() {
         this._tracker.destroy();
-        this.parent();
-    },
-});
+        super.destroy();
+    }
+};
diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js
index 3b847af5b..b4e9202df 100644
--- a/js/ui/remoteSearch.js
+++ b/js/ui/remoteSearch.js
@@ -3,7 +3,6 @@
 const GdkPixbuf = imports.gi.GdkPixbuf;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 
@@ -190,10 +189,8 @@ function loadRemoteSearchProviders(searchSettings, callback) {
     callback(loadedProviders);
 }
 
-var RemoteSearchProvider = new Lang.Class({
-    Name: 'RemoteSearchProvider',
-
-    _init(appInfo, dbusName, dbusPath, autoStart, proxyInfo) {
+var RemoteSearchProvider = class {
+    constructor(appInfo, dbusName, dbusPath, autoStart, proxyInfo) {
         if (!proxyInfo)
             proxyInfo = SearchProviderProxyInfo;
 
@@ -215,7 +212,7 @@ var RemoteSearchProvider = new Lang.Class({
         this.id = appInfo.get_id();
         this.isRemoteProvider = true;
         this.canLaunchSearch = false;
-    },
+    }
 
     createIcon(size, meta) {
         let gicon = null;
@@ -236,7 +233,7 @@ var RemoteSearchProvider = new Lang.Class({
             icon = new St.Icon({ gicon: gicon,
                                  icon_size: size });
         return icon;
-    },
+    }
 
     filterResults(results, maxNumber) {
         if (results.length <= maxNumber)
@@ -246,7 +243,7 @@ var RemoteSearchProvider = new Lang.Class({
         let specialResults = results.filter(r => r.startsWith('special:'));
 
         return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber));
-    },
+    }
 
     _getResultsFinished(results, error, callback) {
         if (error) {
@@ -259,7 +256,7 @@ var RemoteSearchProvider = new Lang.Class({
         }
 
         callback(results[0]);
-    },
+    }
 
     getInitialResultSet(terms, callback, cancellable) {
         this.proxy.GetInitialResultSetRemote(terms,
@@ -267,7 +264,7 @@ var RemoteSearchProvider = new Lang.Class({
                                                  this._getResultsFinished(results, error, callback);
                                              },
                                              cancellable);
-    },
+    }
 
     getSubsearchResultSet(previousResults, newTerms, callback, cancellable) {
         this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
@@ -275,7 +272,7 @@ var RemoteSearchProvider = new Lang.Class({
                                                    this._getResultsFinished(results, error, callback);
                                                },
                                                cancellable);
-    },
+    }
 
     _getResultMetasFinished(results, error, callback) {
         if (error) {
@@ -302,7 +299,7 @@ var RemoteSearchProvider = new Lang.Class({
                                clipboardText: metas[i]['clipboardText'] });
         }
         callback(resultMetas);
-    },
+    }
 
     getResultMetas(ids, callback, cancellable) {
         this.proxy.GetResultMetasRemote(ids,
@@ -310,11 +307,11 @@ var RemoteSearchProvider = new Lang.Class({
                                             this._getResultMetasFinished(results, error, callback);
                                         },
                                         cancellable);
-    },
+    }
 
     activateResult(id) {
         this.proxy.ActivateResultRemote(id);
-    },
+    }
 
     launchSearch(terms) {
         // the provider is not compatible with the new version of the interface, launch
@@ -322,23 +319,20 @@ var RemoteSearchProvider = new Lang.Class({
         log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch');
         this.appInfo.launch([], global.create_app_launch_context(0, -1));
     }
-});
+};
 
-var RemoteSearchProvider2 = new Lang.Class({
-    Name: 'RemoteSearchProvider2',
-    Extends: RemoteSearchProvider,
-
-    _init(appInfo, dbusName, dbusPath, autoStart) {
-        this.parent(appInfo, dbusName, dbusPath, autoStart, SearchProvider2ProxyInfo);
+var RemoteSearchProvider2 = class extends RemoteSearchProvider {
+    constructor(appInfo, dbusName, dbusPath, autoStart) {
+        super(appInfo, dbusName, dbusPath, autoStart, SearchProvider2ProxyInfo);
 
         this.canLaunchSearch = true;
-    },
+    }
 
     activateResult(id, terms) {
         this.proxy.ActivateResultRemote(id, terms, global.get_current_time());
-    },
+    }
 
     launchSearch(terms) {
         this.proxy.LaunchSearchRemote(terms, global.get_current_time());
     }
-});
+};
diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js
index 6e8c8a905..4df315d17 100644
--- a/js/ui/runDialog.js
+++ b/js/ui/runDialog.js
@@ -3,7 +3,6 @@
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
@@ -30,13 +29,10 @@ const EXEC_ARG_KEY = 'exec-arg';
 
 var DIALOG_GROW_TIME = 0.1;
 
-var RunDialog = new Lang.Class({
-    Name: 'RunDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init() {
-        this.parent({ styleClass: 'run-dialog',
-                      destroyOnClose: false });
+var RunDialog = class extends ModalDialog.ModalDialog {
+    constructor() {
+        super({ styleClass: 'run-dialog',
+                destroyOnClose: false });
 
         this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
         this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
@@ -144,7 +140,7 @@ var RunDialog = new Lang.Class({
             }
             return Clutter.EVENT_PROPAGATE;
         });
-    },
+    }
 
     _getCommandCompletion(text) {
         function _getCommon(s1, s2) {
@@ -189,7 +185,7 @@ var RunDialog = new Lang.Class({
 
         let common = results.reduce(_getCommon, null);
         return common.substr(text.length);
-    },
+    }
 
     _getCompletion(text) {
         if (text.indexOf('/') != -1) {
@@ -197,7 +193,7 @@ var RunDialog = new Lang.Class({
         } else {
             return this._getCommandCompletion(text);
         }
-    },
+    }
 
     _run(input, inTerminal) {
         let command = input;
@@ -248,7 +244,7 @@ var RunDialog = new Lang.Class({
                 }
             }
         }
-    },
+    }
 
     _showError(message) {
         this._commandError = true;
@@ -269,7 +265,7 @@ var RunDialog = new Lang.Class({
                                }
                              });
         }
-    },
+    }
 
     _restart() {
         if (Meta.is_wayland_compositor()) {
@@ -279,7 +275,7 @@ var RunDialog = new Lang.Class({
         this._shouldFadeOut = false;
         this.close();
         Meta.restart(_("Restarting…"));
-    },
+    }
 
     open() {
         this._history.lastItem();
@@ -290,7 +286,7 @@ var RunDialog = new Lang.Class({
         if (this._lockdownSettings.get_boolean(DISABLE_COMMAND_LINE_KEY))
             return;
 
-        this.parent();
-    },
-});
+        super.open();
+    }
+};
 Signals.addSignalMethods(RunDialog.prototype);
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 7004c93dd..b0119455a 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -60,10 +60,8 @@ var MANUAL_FADE_TIME = 0.3;
 var BACKGROUND_FADE_TIME = 1.0;
 var CURTAIN_SLIDE_TIME = 0.3;
 
-var Clock = new Lang.Class({
-    Name: 'ScreenShieldClock',
-
-    _init() {
+var Clock = class {
+    constructor() {
         this.actor = new St.BoxLayout({ style_class: 'screen-shield-clock',
                                         vertical: true });
 
@@ -77,7 +75,7 @@ var Clock = new Lang.Class({
         this._wallClock.connect('notify::clock', this._updateClock.bind(this));
 
         this._updateClock();
-    },
+    }
 
     _updateClock() {
         this._time.text = this._wallClock.clock;
@@ -87,18 +85,16 @@ var Clock = new Lang.Class({
            long format */
         let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d"));
         this._date.text = date.toLocaleFormat(dateFormat);
-    },
+    }
 
     destroy() {
         this.actor.destroy();
         this._wallClock.run_dispose();
     }
-});
+};
 
-var NotificationsBox = new Lang.Class({
-    Name: 'NotificationsBox',
-
-    _init() {
+var NotificationsBox = class {
+    constructor() {
         this.actor = new St.BoxLayout({ vertical: true,
                                         name: 'screenShieldNotifications',
                                         style_class: 'screen-shield-notifications-container' });
@@ -118,7 +114,7 @@ var NotificationsBox = new Lang.Class({
         this._updateVisibility();
 
         this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this));
-    },
+    }
 
     destroy() {
         if (this._sourceAddedId) {
@@ -132,21 +128,21 @@ var NotificationsBox = new Lang.Class({
         }
 
         this.actor.destroy();
-    },
+    }
 
     _updateVisibility() {
         this._notificationBox.visible =
             this._notificationBox.get_children().some(a => a.visible);
 
         this.actor.visible = this._notificationBox.visible;
-    },
+    }
 
     _makeNotificationCountText(count, isChat) {
         if (isChat)
             return ngettext("%d new message", "%d new messages", count).format(count);
         else
             return ngettext("%d new notification", "%d new notifications", count).format(count);
-    },
+    }
 
     _makeNotificationSource(source, box) {
         let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
@@ -166,7 +162,7 @@ var NotificationsBox = new Lang.Class({
 
         box.visible = count != 0;
         return [title, countLabel];
-    },
+    }
 
     _makeNotificationDetailedSource(source, box) {
         let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
@@ -204,7 +200,7 @@ var NotificationsBox = new Lang.Class({
 
         box.visible = visible;
         return [title, null];
-    },
+    }
 
     _showSource(source, obj, box) {
         if (obj.detailed) {
@@ -214,7 +210,7 @@ var NotificationsBox = new Lang.Class({
         }
 
         box.visible = obj.visible && (source.unseenCount > 0);
-    },
+    }
 
     _sourceAdded(tray, source, initial) {
         let obj = {
@@ -276,11 +272,11 @@ var NotificationsBox = new Lang.Class({
             if (obj.sourceBox.visible)
                 this.emit('wake-up-screen');
         }
-    },
+    }
 
     _titleChanged(source, obj) {
         obj.titleLabel.text = source.title;
-    },
+    }
 
     _countChanged(source, obj) {
         if (obj.detailed) {
@@ -300,7 +296,7 @@ var NotificationsBox = new Lang.Class({
         this._updateVisibility();
         if (obj.sourceBox.visible)
             this.emit('wake-up-screen');
-    },
+    }
 
     _visibleChanged(source, obj) {
         if (obj.visible == source.policy.showInLockScreen)
@@ -312,7 +308,7 @@ var NotificationsBox = new Lang.Class({
         this._updateVisibility();
         if (obj.sourceBox.visible)
             this.emit('wake-up-screen');
-    },
+    }
 
     _detailedChanged(source, obj) {
         if (obj.detailed == source.policy.detailsInLockScreen)
@@ -323,12 +319,12 @@ var NotificationsBox = new Lang.Class({
         obj.sourceBox.destroy_all_children();
         obj.titleLabel = obj.countLabel = null;
         this._showSource(source, obj, obj.sourceBox);
-    },
+    }
 
     _onSourceDestroy(source, obj) {
         this._removeSource(source, obj);
         this._updateVisibility();
-    },
+    }
 
     _removeSource(source, obj) {
         obj.sourceBox.destroy();
@@ -340,8 +336,8 @@ var NotificationsBox = new Lang.Class({
         source.policy.disconnect(obj.policyChangedId);
 
         this._sources.delete(source);
-    },
-});
+    }
+};
 Signals.addSignalMethods(NotificationsBox.prototype);
 
 var Arrow = new Lang.Class({
@@ -430,10 +426,8 @@ function clamp(value, min, max) {
  * This will ensure that the screen blanks at the right time when it fades out.
  * https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency.
  */
-var ScreenShield = new Lang.Class({
-    Name: 'ScreenShield',
-
-    _init() {
+var ScreenShield = class {
+    constructor() {
         this.actor = Main.layoutManager.screenShieldGroup;
 
         this._lockScreenState = MessageTray.State.HIDDEN;
@@ -573,7 +567,7 @@ var ScreenShield = new Lang.Class({
         this._cursorTracker = Meta.CursorTracker.get_for_display(global.display);
 
         this._syncInhibitor();
-    },
+    }
 
     _setActive(active) {
         let prevIsActive = this._isActive;
@@ -586,7 +580,7 @@ var ScreenShield = new Lang.Class({
             this._loginSession.SetLockedHintRemote(active);
 
         this._syncInhibitor();
-    },
+    }
 
     _createBackground(monitorIndex) {
         let monitor = Main.layoutManager.monitors[monitorIndex];
@@ -604,7 +598,7 @@ var ScreenShield = new Lang.Class({
         this._bgManagers.push(bgManager);
 
         this._backgroundGroup.add_child(widget);
-    },
+    }
 
     _updateBackgrounds() {
         for (let i = 0; i < this._bgManagers.length; i++)
@@ -615,7 +609,7 @@ var ScreenShield = new Lang.Class({
 
         for (let i = 0; i < Main.layoutManager.monitors.length; i++)
             this._createBackground(i);
-    },
+    }
 
     _liftShield(onPrimary, velocity) {
         if (this._isLocked) {
@@ -624,7 +618,7 @@ var ScreenShield = new Lang.Class({
         } else {
             this.deactivate(true /* animate */);
         }
-    },
+    }
 
     _maybeCancelDialog() {
         if (!this._dialog)
@@ -639,7 +633,7 @@ var ScreenShield = new Lang.Class({
         } else {
             this._dialog = null;
         }
-    },
+    }
 
     _becomeModal() {
         if (this._isModal)
@@ -654,7 +648,7 @@ var ScreenShield = new Lang.Class({
         this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
                                                      actionMode: Shell.ActionMode.LOCK_SCREEN });
         return this._isModal;
-    },
+    }
 
     _onLockScreenKeyPress(actor, event) {
         let symbol = event.get_key_symbol();
@@ -684,7 +678,7 @@ var ScreenShield = new Lang.Class({
 
         this._liftShield(true, 0);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onLockScreenScroll(actor, event) {
         if (this._lockScreenState != MessageTray.State.SHOWN)
@@ -704,7 +698,7 @@ var ScreenShield = new Lang.Class({
         }
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _syncInhibitor() {
         let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
@@ -723,7 +717,7 @@ var ScreenShield = new Lang.Class({
                 this._inhibitor.close(null);
             this._inhibitor = null;
         }
-    },
+    }
 
     _prepareForSleep(loginManager, aboutToSuspend) {
         if (aboutToSuspend) {
@@ -732,7 +726,7 @@ var ScreenShield = new Lang.Class({
         } else {
             this._wakeUpScreen();
         }
-    },
+    }
 
     _animateArrows() {
         let arrows = this._arrowContainer.get_children();
@@ -754,7 +748,7 @@ var ScreenShield = new Lang.Class({
         }
 
         return GLib.SOURCE_CONTINUE;
-    },
+    }
 
     _onDragBegin() {
         Tweener.removeTweens(this._lockScreenGroup);
@@ -764,7 +758,7 @@ var ScreenShield = new Lang.Class({
             this._ensureUnlockDialog(false, false);
 
         return true;
-    },
+    }
 
     _onDragMotion() {
        let [origX, origY] = this._dragAction.get_press_coords(0);
@@ -776,7 +770,7 @@ var ScreenShield = new Lang.Class({
        this._lockScreenGroup.y = newY;
 
        return true;
-    },
+    }
 
     _onDragEnd(action, actor, eventX, eventY, modifiers) {
         if (this._lockScreenState != MessageTray.State.HIDING)
@@ -804,7 +798,7 @@ var ScreenShield = new Lang.Class({
 
             this._maybeCancelDialog();
         }
-    },
+    }
 
     _onStatusChanged(status) {
         if (status != GnomeSession.PresenceStatus.IDLE)
@@ -855,7 +849,7 @@ var ScreenShield = new Lang.Class({
         }
 
         this._activateFade(this._longLightbox, STANDARD_FADE_TIME);
-    },
+    }
 
     _activateFade(lightbox, time) {
         Main.uiGroup.set_child_above_sibling(lightbox.actor, null);
@@ -863,7 +857,7 @@ var ScreenShield = new Lang.Class({
 
         if (this._becameActiveId == 0)
             this._becameActiveId = 
this.idleMonitor.add_user_active_watch(this._onUserBecameActive.bind(this));
-    },
+    }
 
     _onUserBecameActive() {
         // This function gets called here when the user becomes active
@@ -893,15 +887,15 @@ var ScreenShield = new Lang.Class({
         } else {
             this.deactivate(false);
         }
-    },
+    }
 
     _onLongLightboxShown() {
         this.activate(false);
-    },
+    }
 
     _onShortLightboxShown() {
         this._completeLockScreenShown();
-    },
+    }
 
     showDialog() {
         if (!this._becomeModal()) {
@@ -915,7 +909,7 @@ var ScreenShield = new Lang.Class({
         this._isLocked = true;
         if (this._ensureUnlockDialog(true, true))
             this._hideLockScreen(false, 0);
-    },
+    }
 
     _hideLockScreenComplete() {
         if (Main.sessionMode.currentMode == 'lock-screen')
@@ -928,7 +922,7 @@ var ScreenShield = new Lang.Class({
             this._dialog.actor.grab_key_focus();
             this._dialog.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
         }
-    },
+    }
 
     _hideLockScreen(animate, velocity) {
         if (this._lockScreenState == MessageTray.State.HIDDEN)
@@ -961,7 +955,7 @@ var ScreenShield = new Lang.Class({
         }
 
         this._cursorTracker.set_pointer_visible(true);
-    },
+    }
 
     _ensureUnlockDialog(onPrimary, allowCancel) {
         if (!this._dialog) {
@@ -989,12 +983,12 @@ var ScreenShield = new Lang.Class({
 
         this._dialog.allowCancel = allowCancel;
         return true;
-    },
+    }
 
     _onUnlockFailed() {
         this._resetLockScreen({ animateLockScreen: true,
                                 fadeToBlack: false });
-    },
+    }
 
     _resetLockScreen(params) {
         // Don't reset the lock screen unless it is completely hidden
@@ -1036,7 +1030,7 @@ var ScreenShield = new Lang.Class({
 
         if (Main.sessionMode.currentMode != 'lock-screen')
             Main.sessionMode.pushMode('lock-screen');
-    },
+    }
 
     _startArrowAnimation() {
         this._arrowActiveWatchId = 0;
@@ -1050,7 +1044,7 @@ var ScreenShield = new Lang.Class({
         if (!this._arrowWatchId)
             this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME,
                                                                  this._pauseArrowAnimation.bind(this));
-    },
+    }
 
     _pauseArrowAnimation() {
         if (this._arrowAnimationId) {
@@ -1060,7 +1054,7 @@ var ScreenShield = new Lang.Class({
 
         if (!this._arrowActiveWatchId)
             this._arrowActiveWatchId = 
this.idleMonitor.add_user_active_watch(this._startArrowAnimation.bind(this));
-    },
+    }
 
     _stopArrowAnimation() {
         if (this._arrowAnimationId) {
@@ -1075,7 +1069,7 @@ var ScreenShield = new Lang.Class({
             this.idleMonitor.remove_watch(this._arrowWatchId);
             this._arrowWatchId = 0;
         }
-    },
+    }
 
     _checkArrowAnimation() {
         let idleTime = this.idleMonitor.get_idletime();
@@ -1084,7 +1078,7 @@ var ScreenShield = new Lang.Class({
             this._startArrowAnimation();
         else
             this._pauseArrowAnimation();
-    },
+    }
 
     _lockScreenShown(params) {
         if (this._dialog && !this._isGreeter) {
@@ -1122,12 +1116,12 @@ var ScreenShield = new Lang.Class({
 
             this._completeLockScreenShown();
         }
-    },
+    }
 
     _completeLockScreenShown() {
         this._setActive(true);
         this.emit('lock-screen-shown');
-    },
+    }
 
     // Some of the actors in the lock screen are heavy in
     // resources, so we only create them when needed
@@ -1154,12 +1148,12 @@ var ScreenShield = new Lang.Class({
                                                                         expand: true });
 
         this._hasLockScreen = true;
-    },
+    }
 
     _wakeUpScreen() {
         this._onUserBecameActive();
         this.emit('wake-up-screen');
-    },
+    }
 
     _clearLockScreen() {
         this._clock.destroy();
@@ -1176,26 +1170,26 @@ var ScreenShield = new Lang.Class({
         this._lockScreenContentsBox.destroy();
 
         this._hasLockScreen = false;
-    },
+    }
 
     get locked() {
         return this._isLocked;
-    },
+    }
 
     get active() {
         return this._isActive;
-    },
+    }
 
     get activationTime() {
         return this._activationTime;
-    },
+    }
 
     deactivate(animate) {
         if (this._dialog)
             this._dialog.finish(() => { this._continueDeactivate(animate); });
         else
             this._continueDeactivate(animate);
-    },
+    }
 
     _continueDeactivate(animate) {
         this._hideLockScreen(animate, 0);
@@ -1237,7 +1231,7 @@ var ScreenShield = new Lang.Class({
             onComplete: this._completeDeactivate.bind(this),
             onCompleteScope: this
         });
-    },
+    }
 
     _completeDeactivate() {
         if (this._dialog) {
@@ -1264,7 +1258,7 @@ var ScreenShield = new Lang.Class({
         this._isLocked = false;
         this.emit('locked-changed');
         global.set_runtime_state(LOCKED_STATE_STR, null);
-    },
+    }
 
     activate(animate) {
         if (this._activationTime == 0)
@@ -1296,7 +1290,7 @@ var ScreenShield = new Lang.Class({
         // blank during the animation.
         // This is not a problem for the idle fade case, because we
         // activate without animation in that case.
-    },
+    }
 
     lock(animate) {
         if (this._lockSettings.get_boolean(DISABLE_LOCK_KEY)) {
@@ -1328,7 +1322,7 @@ var ScreenShield = new Lang.Class({
         this.activate(animate);
 
         this.emit('locked-changed');
-    },
+    }
 
     // If the previous shell crashed, and gnome-session restarted us, then re-lock
     lockIfWasLocked() {
@@ -1341,5 +1335,5 @@ var ScreenShield = new Lang.Class({
             this.lock(false);
         });
     }
-});
+};
 Signals.addSignalMethods(ScreenShield.prototype);
diff --git a/js/ui/screencast.js b/js/ui/screencast.js
index e57b0ef7d..2d99c711a 100644
--- a/js/ui/screencast.js
+++ b/js/ui/screencast.js
@@ -2,7 +2,6 @@
 
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 
@@ -12,10 +11,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
 
 const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
 
-var ScreencastService = new Lang.Class({
-    Name: 'ScreencastService',
-
-    _init() {
+var ScreencastService = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast');
 
@@ -26,11 +23,11 @@ var ScreencastService = new Lang.Class({
         this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
-    },
+    }
 
     get isRecording() {
         return this._recorders.size > 0;
-    },
+    }
 
     _ensureRecorderForSender(sender) {
         let recorder = this._recorders.get(sender);
@@ -44,7 +41,7 @@ var ScreencastService = new Lang.Class({
             this.emit('updated');
         }
         return recorder;
-    },
+    }
 
     _sessionUpdated() {
         if (Main.sessionMode.allowScreencast)
@@ -52,11 +49,11 @@ var ScreencastService = new Lang.Class({
 
         for (let sender of this._recorders.keys())
             this._stopRecordingForSender(sender);
-    },
+    }
 
     _onNameVanished(connection, name) {
         this._stopRecordingForSender(name);
-    },
+    }
 
     _stopRecordingForSender(sender) {
         let recorder = this._recorders.get(sender);
@@ -69,7 +66,7 @@ var ScreencastService = new Lang.Class({
         this.emit('updated');
 
         return true;
-    },
+    }
 
     _applyOptionalParameters(recorder, options) {
         for (let option in options)
@@ -81,7 +78,7 @@ var ScreencastService = new Lang.Class({
             recorder.set_framerate(options['framerate']);
         if ('draw-cursor' in options)
             recorder.set_draw_cursor(options['draw-cursor']);
-    },
+    }
 
     ScreencastAsync(params, invocation) {
         let returnValue = [false, ''];
@@ -105,7 +102,7 @@ var ScreencastService = new Lang.Class({
         }
 
         invocation.return_value(GLib.Variant.new('(bs)', returnValue));
-    },
+    }
 
     ScreencastAreaAsync(params, invocation) {
         let returnValue = [false, ''];
@@ -141,11 +138,11 @@ var ScreencastService = new Lang.Class({
         }
 
         invocation.return_value(GLib.Variant.new('(bs)', returnValue));
-    },
+    }
 
     StopScreencastAsync(params, invocation) {
         let success = this._stopRecordingForSender(invocation.get_sender());
         invocation.return_value(GLib.Variant.new('(b)', [success]));
     }
-});
+};
 Signals.addSignalMethods(ScreencastService.prototype);
diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
index edfac1dd9..81534acae 100644
--- a/js/ui/screenshot.js
+++ b/js/ui/screenshot.js
@@ -5,7 +5,6 @@ const Gdk = imports.gi.Gdk;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
@@ -20,10 +19,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
 
 const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot');
 
-var ScreenshotService = new Lang.Class({
-    Name: 'ScreenshotService',
-
-    _init() {
+var ScreenshotService = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
 
@@ -32,7 +29,7 @@ var ScreenshotService = new Lang.Class({
         this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
 
         Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
-    },
+    }
 
     _createScreenshot(invocation, needsDisk=true) {
         let lockedDown = false;
@@ -53,11 +50,11 @@ var ScreenshotService = new Lang.Class({
         this._screenShooter.set(sender, shooter);
 
         return shooter;
-    },
+    }
 
     _onNameVanished(connection, name) {
         this._removeShooterForSender(name);
-    },
+    }
 
     _removeShooterForSender(sender) {
         let shooter = this._screenShooter.get(sender);
@@ -66,14 +63,14 @@ var ScreenshotService = new Lang.Class({
 
         Gio.bus_unwatch_name(shooter._watchNameId);
         this._screenShooter.delete(sender);
-    },
+    }
 
     _checkArea(x, y, width, height) {
         return x >= 0 && y >= 0 &&
                width > 0 && height > 0 &&
                x + width <= global.screen_width &&
                y + height <= global.screen_height;
-    },
+    }
 
     _onScreenshotComplete(result, area, filenameUsed, flash, invocation) {
         if (result) {
@@ -89,7 +86,7 @@ var ScreenshotService = new Lang.Class({
 
         let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
         invocation.return_value(retval);
-    },
+    }
 
     _scaleArea(x, y, width, height) {
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
@@ -98,7 +95,7 @@ var ScreenshotService = new Lang.Class({
         width *= scaleFactor;
         height *= scaleFactor;
         return [x, y, width, height];
-    },
+    }
 
     _unscaleArea(x, y, width, height) {
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
@@ -107,7 +104,7 @@ var ScreenshotService = new Lang.Class({
         width /= scaleFactor;
         height /= scaleFactor;
         return [x, y, width, height];
-    },
+    }
 
     ScreenshotAreaAsync(params, invocation) {
         let [x, y, width, height, flash, filename, callback] = params;
@@ -132,7 +129,7 @@ var ScreenshotService = new Lang.Class({
                     invocation.return_gerror (e);
                 }
             });
-    },
+    }
 
     ScreenshotWindowAsync(params, invocation) {
         let [include_frame, include_cursor, flash, filename] = params;
@@ -150,7 +147,7 @@ var ScreenshotService = new Lang.Class({
                     invocation.return_gerror (e);
                 }
             });
-    },
+    }
 
     ScreenshotAsync(params, invocation) {
         let [include_cursor, flash, filename] = params;
@@ -168,7 +165,7 @@ var ScreenshotService = new Lang.Class({
                     invocation.return_gerror (e);
                 }
             });
-    },
+    }
 
     SelectAreaAsync(params, invocation) {
         let selectArea = new SelectArea();
@@ -184,7 +181,7 @@ var ScreenshotService = new Lang.Class({
                     "Operation was cancelled");
             }
         });
-    },
+    }
 
     FlashAreaAsync(params, invocation) {
         let [x, y, width, height] = params;
@@ -198,7 +195,7 @@ var ScreenshotService = new Lang.Class({
         let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
         flashspot.fire();
         invocation.return_value(null);
-    },
+    }
 
     PickColorAsync(params, invocation) {
         let pickPixel = new PickPixel();
@@ -227,12 +224,10 @@ var ScreenshotService = new Lang.Class({
             }
         });
     }
-});
+};
 
-var SelectArea = new Lang.Class({
-    Name: 'SelectArea',
-
-    _init() {
+var SelectArea = class {
+    constructor() {
         this._startX = -1;
         this._startY = -1;
         this._lastX = 0;
@@ -265,7 +260,7 @@ var SelectArea = new Lang.Class({
                                                    border_width: 1,
                                                    border_color: this._border });
         this._group.add_actor(this._rubberband);
-    },
+    }
 
     show() {
         if (!this._grabHelper.grab({ actor: this._group,
@@ -275,7 +270,7 @@ var SelectArea = new Lang.Class({
         global.display.set_cursor(Meta.Cursor.CROSSHAIR);
         Main.uiGroup.set_child_above_sibling(this._group, null);
         this._group.visible = true;
-    },
+    }
 
     _initRubberbandColors() {
         function colorFromRGBA(rgba) {
@@ -294,14 +289,14 @@ var SelectArea = new Lang.Class({
 
         this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
         this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
-    },
+    }
 
     _getGeometry() {
         return { x: Math.min(this._startX, this._lastX),
                  y: Math.min(this._startY, this._lastY),
                  width: Math.abs(this._startX - this._lastX) + 1,
                  height: Math.abs(this._startY - this._lastY) + 1 };
-    },
+    }
 
     _onMotionEvent(actor, event) {
         if (this._startX == -1 || this._startY == -1)
@@ -316,7 +311,7 @@ var SelectArea = new Lang.Class({
         this._rubberband.set_size(geometry.width, geometry.height);
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onButtonPress(actor, event) {
         [this._startX, this._startY] = event.get_coords();
@@ -325,7 +320,7 @@ var SelectArea = new Lang.Class({
         this._rubberband.set_position(this._startX, this._startY);
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onButtonRelease(actor, event) {
         this._result = this._getGeometry();
@@ -338,7 +333,7 @@ var SelectArea = new Lang.Class({
                            }
                          });
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onUngrab() {
         global.display.set_cursor(Meta.Cursor.DEFAULT);
@@ -349,13 +344,11 @@ var SelectArea = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
     }
-});
+};
 Signals.addSignalMethods(SelectArea.prototype);
 
-var PickPixel = new Lang.Class({
-    Name: 'PickPixel',
-
-    _init() {
+var PickPixel = class {
+    constructor() {
         this._result = null;
 
         this._group = new St.Widget({ visible: false,
@@ -370,7 +363,7 @@ var PickPixel = new Lang.Class({
         let constraint = new Clutter.BindConstraint({ source: global.stage,
                                                       coordinate: Clutter.BindCoordinate.ALL });
         this._group.add_constraint(constraint);
-    },
+    }
 
     show() {
         if (!this._grabHelper.grab({ actor: this._group,
@@ -380,13 +373,13 @@ var PickPixel = new Lang.Class({
         global.display.set_cursor(Meta.Cursor.CROSSHAIR);
         Main.uiGroup.set_child_above_sibling(this._group, null);
         this._group.visible = true;
-    },
+    }
 
     _onButtonRelease(actor, event) {
         this._result = event.get_coords();
         this._grabHelper.ungrab();
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onUngrab() {
         global.display.set_cursor(Meta.Cursor.DEFAULT);
@@ -397,23 +390,20 @@ var PickPixel = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
     }
-});
+};
 Signals.addSignalMethods(PickPixel.prototype);
 
 var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
 
-var Flashspot = new Lang.Class({
-    Name: 'Flashspot',
-    Extends: Lightbox.Lightbox,
-
-    _init(area) {
-        this.parent(Main.uiGroup, { inhibitEvents: true,
-                                    width: area.width,
-                                    height: area.height });
+var Flashspot = class extends Lightbox.Lightbox {
+    constructor(area) {
+        super(Main.uiGroup, { inhibitEvents: true,
+                              width: area.width,
+                              height: area.height });
 
         this.actor.style_class = 'flashspot';
         this.actor.set_position(area.x, area.y);
-    },
+    }
 
     fire(doneCallback) {
         this.actor.show();
@@ -429,4 +419,4 @@ var Flashspot = new Lang.Class({
                            }
                          });
     }
-});
+};
diff --git a/js/ui/search.js b/js/ui/search.js
index 4adf50217..3dc63c1e0 100644
--- a/js/ui/search.js
+++ b/js/ui/search.js
@@ -44,10 +44,8 @@ var MaxWidthBin = new Lang.Class({
     }
 });
 
-var SearchResult = new Lang.Class({
-    Name: 'SearchResult',
-
-    _init(provider, metaInfo, resultsView) {
+var SearchResult = class {
+    constructor(provider, metaInfo, resultsView) {
         this.provider = provider;
         this.metaInfo = metaInfo;
         this._resultsView = resultsView;
@@ -60,22 +58,18 @@ var SearchResult = new Lang.Class({
 
         this.actor._delegate = this;
         this.actor.connect('clicked', this.activate.bind(this));
-    },
+    }
 
     activate() {
         this.emit('activate', this.metaInfo.id);
     }
-});
+};
 Signals.addSignalMethods(SearchResult.prototype);
 
-var ListSearchResult = new Lang.Class({
-    Name: 'ListSearchResult',
-    Extends: SearchResult,
+var ListSearchResult = class extends SearchResult {
 
-    ICON_SIZE: 24,
-
-    _init(provider, metaInfo, resultsView) {
-        this.parent(provider, metaInfo, resultsView);
+    constructor(provider, metaInfo, resultsView) {
+        super(provider, metaInfo, resultsView);
 
         this.actor.style_class = 'list-search-result';
         this.actor.x_fill = true;
@@ -122,26 +116,27 @@ var ListSearchResult = new Lang.Class({
         }
 
         this.actor.connect('destroy', this._onDestroy.bind(this));
-    },
+    }
+
+    get ICON_SIZE() {
+        return 24;
+    }
 
     _highlightTerms() {
         let markup = this._resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]);
         this._descriptionLabel.clutter_text.set_markup(markup);
-    },
+    }
 
     _onDestroy() {
         if (this._termsChangedId)
             this._resultsView.disconnect(this._termsChangedId);
         this._termsChangedId = 0;
     }
-});
-
-var GridSearchResult = new Lang.Class({
-    Name: 'GridSearchResult',
-    Extends: SearchResult,
+};
 
-    _init(provider, metaInfo, resultsView) {
-        this.parent(provider, metaInfo, resultsView);
+var GridSearchResult = class extends SearchResult {
+    constructor(provider, metaInfo, resultsView) {
+        super(provider, metaInfo, resultsView);
 
         this.actor.style_class = 'grid-search-result';
 
@@ -151,12 +146,10 @@ var GridSearchResult = new Lang.Class({
         this.actor.set_child(content);
         this.actor.label_actor = this.icon.label;
     }
-});
+};
 
-var SearchResultsBase = new Lang.Class({
-    Name: 'SearchResultsBase',
-
-    _init(provider, resultsView) {
+var SearchResultsBase = class {
+    constructor(provider, resultsView) {
         this.provider = provider;
         this._resultsView = resultsView;
 
@@ -177,19 +170,19 @@ var SearchResultsBase = new Lang.Class({
         this._clipboard = St.Clipboard.get_default();
 
         this._cancellable = new Gio.Cancellable();
-    },
+    }
 
     destroy() {
         this.actor.destroy();
         this._terms = [];
-    },
+    }
 
     _createResultDisplay(meta) {
         if (this.provider.createResultObject)
             return this.provider.createResultObject(meta, this._resultsView);
 
         return null;
-    },
+    }
 
     clear() {
         this._cancellable.cancel();
@@ -198,21 +191,21 @@ var SearchResultsBase = new Lang.Class({
         this._resultDisplays = {};
         this._clearResultDisplay();
         this.actor.hide();
-    },
+    }
 
     _keyFocusIn(actor) {
         this.emit('key-focus-in', actor);
-    },
+    }
 
     _activateResult(result, id) {
         this.provider.activateResult(id, this._terms);
         if (result.metaInfo.clipboardText)
             this._clipboard.set_text(St.ClipboardType.CLIPBOARD, result.metaInfo.clipboardText);
         Main.overview.toggle();
-    },
+    }
 
     _setMoreCount(count) {
-    },
+    }
 
     _ensureResultActors(results, callback) {
         let metasNeeded = results.filter(
@@ -254,7 +247,7 @@ var SearchResultsBase = new Lang.Class({
                 callback(true);
             }, this._cancellable);
         }
-    },
+    }
 
     updateSearch(providerResults, terms, callback) {
         this._terms = terms;
@@ -288,14 +281,11 @@ var SearchResultsBase = new Lang.Class({
             });
         }
     }
-});
-
-var ListSearchResults = new Lang.Class({
-    Name: 'ListSearchResults',
-    Extends: SearchResultsBase,
+};
 
-    _init(provider, resultsView) {
-        this.parent(provider, resultsView);
+var ListSearchResults = class extends SearchResultsBase {
+    constructor(provider, resultsView) {
+        super(provider, resultsView);
 
         this._container = new St.BoxLayout({ style_class: 'search-section-content' });
         this.providerInfo = new ProviderInfo(provider);
@@ -316,28 +306,28 @@ var ListSearchResults = new Lang.Class({
         this._container.add(this._content, { expand: true });
 
         this._resultDisplayBin.set_child(this._container);
-    },
+    }
 
     _setMoreCount(count) {
         this.providerInfo.setMoreCount(count);
-    },
+    }
 
     _getMaxDisplayedResults() {
         return MAX_LIST_SEARCH_RESULTS_ROWS;
-    },
+    }
 
     _clearResultDisplay() {
         this._content.remove_all_children();
-    },
+    }
 
     _createResultDisplay(meta) {
-        return this.parent(meta, this._resultsView) ||
+        return super._createResultDisplay(meta, this._resultsView) ||
                new ListSearchResult(this.provider, meta, this._resultsView);
-    },
+    }
 
     _addItem(display) {
         this._content.add_actor(display.actor);
-    },
+    }
 
     getFirstResult() {
         if (this._content.get_n_children() > 0)
@@ -345,15 +335,12 @@ var ListSearchResults = new Lang.Class({
         else
             return null;
     }
-});
+};
 Signals.addSignalMethods(ListSearchResults.prototype);
 
-var GridSearchResults = new Lang.Class({
-    Name: 'GridSearchResults',
-    Extends: SearchResultsBase,
-
-    _init(provider, resultsView) {
-        this.parent(provider, resultsView);
+var GridSearchResults = class extends SearchResultsBase {
+    constructor(provider, resultsView) {
+        super(provider, resultsView);
         // We need to use the parent container to know how much results we can show.
         // None of the actors in this class can be used for that, since the main actor
         // goes hidden when no results are displayed, and then it lost its allocation.
@@ -368,26 +355,26 @@ var GridSearchResults = new Lang.Class({
         this._bin.set_child(this._grid);
 
         this._resultDisplayBin.set_child(this._bin);
-    },
+    }
 
     _getMaxDisplayedResults() {
         let parentThemeNode = this._parentContainer.get_theme_node();
         let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
         return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
-    },
+    }
 
     _clearResultDisplay() {
         this._grid.removeAll();
-    },
+    }
 
     _createResultDisplay(meta) {
-        return this.parent(meta, this._resultsView) ||
+        return super._createResultDisplay(meta, this._resultsView) ||
                new GridSearchResult(this.provider, meta, this._resultsView);
-    },
+    }
 
     _addItem(display) {
         this._grid.addItem(display);
-    },
+    }
 
     getFirstResult() {
         if (this._grid.visibleItemsCount() > 0)
@@ -395,13 +382,11 @@ var GridSearchResults = new Lang.Class({
         else
             return null;
     }
-});
+};
 Signals.addSignalMethods(GridSearchResults.prototype);
 
-var SearchResults = new Lang.Class({
-    Name: 'SearchResults',
-
-    _init() {
+var SearchResults = class {
+    constructor() {
         this.actor = new St.BoxLayout({ name: 'searchResults',
                                         vertical: true });
 
@@ -459,7 +444,7 @@ var SearchResults = new Lang.Class({
 
         this._registerProvider(new AppDisplay.AppSearchProvider());
         this._reloadRemoteProviders();
-    },
+    }
 
     _reloadRemoteProviders() {
         let remoteProviders = this._providers.filter(p => p.isRemoteProvider);
@@ -470,12 +455,12 @@ var SearchResults = new Lang.Class({
         RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => {
             providers.forEach(this._registerProvider.bind(this));
         });
-    },
+    }
 
     _registerProvider(provider) {
         this._providers.push(provider);
         this._ensureProviderDisplay(provider);
-    },
+    }
 
     _unregisterProvider(provider) {
         let index = this._providers.indexOf(provider);
@@ -483,19 +468,19 @@ var SearchResults = new Lang.Class({
 
         if (provider.display)
             provider.display.destroy();
-    },
+    }
 
     _gotResults(results, provider) {
         this._results[provider.id] = results;
         this._updateResults(provider, results);
-    },
+    }
 
     _clearSearchTimeout() {
         if (this._searchTimeoutId > 0) {
             GLib.source_remove(this._searchTimeoutId);
             this._searchTimeoutId = 0;
         }
-    },
+    }
 
     _reset() {
         this._terms = [];
@@ -506,7 +491,7 @@ var SearchResults = new Lang.Class({
         this._startingSearch = false;
 
         this._updateSearchProgress();
-    },
+    }
 
     _doSearch() {
         this._startingSearch = false;
@@ -536,13 +521,13 @@ var SearchResults = new Lang.Class({
         this._updateSearchProgress();
 
         this._clearSearchTimeout();
-    },
+    }
 
     _onSearchTimeout() {
         this._searchTimeoutId = 0;
         this._doSearch();
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     setTerms(terms) {
         // Check for the case of making a duplicate previous search before
@@ -579,18 +564,18 @@ var SearchResults = new Lang.Class({
         this._highlightRegex = new RegExp(`(${escapedTerms.join('|')})`, 'gi');
 
         this.emit('terms-changed');
-    },
+    }
 
     _onPan(action) {
         let [dist, dx, dy] = action.get_motion_delta(0);
         let adjustment = this._scrollView.vscroll.adjustment;
         adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
         return false;
-    },
+    }
 
     _keyFocusIn(provider, actor) {
         Util.ensureActorVisibleInScrollView(this._scrollView, actor);
-    },
+    }
 
     _ensureProviderDisplay(provider) {
         if (provider.display)
@@ -606,13 +591,13 @@ var SearchResults = new Lang.Class({
         providerDisplay.actor.hide();
         this._content.add(providerDisplay.actor);
         provider.display = providerDisplay;
-    },
+    }
 
     _clearDisplay() {
         this._providers.forEach(provider => {
             provider.display.clear();
         });
-    },
+    }
 
     _maybeSetInitialSelection() {
         let newDefaultResult = null;
@@ -638,14 +623,14 @@ var SearchResults = new Lang.Class({
 
             this._defaultResult = newDefaultResult;
         }
-    },
+    }
 
     get searchInProgress() {
         if (this._startingSearch)
             return true;
 
         return this._providers.some(p => p.searchInProgress);
-    },
+    }
 
     _updateSearchProgress() {
         let haveResults = this._providers.some(provider => {
@@ -663,7 +648,7 @@ var SearchResults = new Lang.Class({
                 this._statusText.set_text(_("No results."));
             }
         }
-    },
+    }
 
     _updateResults(provider, results) {
         let terms = this._terms;
@@ -675,7 +660,7 @@ var SearchResults = new Lang.Class({
             this._maybeSetInitialSelection();
             this._updateSearchProgress();
         });
-    },
+    }
 
     activateDefault() {
         // If we have a search queued up, force the search now.
@@ -684,12 +669,12 @@ var SearchResults = new Lang.Class({
 
         if (this._defaultResult)
             this._defaultResult.activate();
-    },
+    }
 
     highlightDefault(highlight) {
         this._highlightDefault = highlight;
         this._setSelected(this._defaultResult, highlight);
-    },
+    }
 
     popupMenuDefault() {
         // If we have a search queued up, force the search now.
@@ -698,7 +683,7 @@ var SearchResults = new Lang.Class({
 
         if (this._defaultResult)
             this._defaultResult.actor.popup_menu();
-    },
+    }
 
     navigateFocus(direction) {
         let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
@@ -712,7 +697,7 @@ var SearchResults = new Lang.Class({
 
         let from = this._defaultResult ? this._defaultResult.actor : null;
         this.actor.navigate_focus(from, direction, false);
-    },
+    }
 
     _setSelected(result, selected) {
         if (!result)
@@ -724,7 +709,7 @@ var SearchResults = new Lang.Class({
         } else {
             result.actor.remove_style_pseudo_class('selected');
         }
-    },
+    }
 
     highlightTerms(description) {
         if (!description)
@@ -735,7 +720,7 @@ var SearchResults = new Lang.Class({
 
         return description.replace(this._highlightRegex, '<b>$1</b>');
     }
-});
+};
 Signals.addSignalMethods(SearchResults.prototype);
 
 var ProviderInfo = new Lang.Class({
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index e22176415..5a4e20418 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -2,7 +2,6 @@
 
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Signals = imports.signals;
 
@@ -151,40 +150,38 @@ function listModes() {
     Mainloop.run('listModes');
 }
 
-var SessionMode = new Lang.Class({
-    Name: 'SessionMode',
-
-    _init() {
+var SessionMode = class {
+    constructor() {
         _loadModes();
         let isPrimary = (_modes[global.session_mode] &&
                          _modes[global.session_mode].isPrimary);
         let mode = isPrimary ? global.session_mode : 'user';
         this._modeStack = [mode];
         this._sync();
-    },
+    }
 
     pushMode(mode) {
         this._modeStack.push(mode);
         this._sync();
-    },
+    }
 
     popMode(mode) {
         if (this.currentMode != mode || this._modeStack.length === 1)
             throw new Error("Invalid SessionMode.popMode");
         this._modeStack.pop();
         this._sync();
-    },
+    }
 
     switchMode(to) {
         if (this.currentMode == to)
             return;
         this._modeStack[this._modeStack.length - 1] = to;
         this._sync();
-    },
+    }
 
     get currentMode() {
         return this._modeStack[this._modeStack.length - 1];
-    },
+    }
 
     _sync() {
         let params = _modes[this.currentMode];
@@ -205,5 +202,5 @@ var SessionMode = new Lang.Class({
 
         this.emit('updated');
     }
-});
+};
 Signals.addSignalMethods(SessionMode.prototype);
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
index a200a1bdd..5d1b04698 100644
--- a/js/ui/shellDBus.js
+++ b/js/ui/shellDBus.js
@@ -19,10 +19,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
 const GnomeShellIface = loadInterfaceXML('org.gnome.Shell');
 const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver');
 
-var GnomeShell = new Lang.Class({
-    Name: 'GnomeShellDBus',
-
-    _init() {
+var GnomeShell = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
 
@@ -42,7 +40,7 @@ var GnomeShell = new Lang.Class({
                               this._checkOverviewVisibleChanged.bind(this));
         Main.overview.connect('hidden',
                               this._checkOverviewVisibleChanged.bind(this));
-    },
+    }
 
     /**
      * Eval:
@@ -75,11 +73,11 @@ var GnomeShell = new Lang.Class({
             success = false;
         }
         return [success, returnValue];
-    },
+    }
 
     FocusSearch() {
         Main.overview.focusSearch();
-    },
+    }
 
     ShowOSD(params) {
         for (let param in params)
@@ -99,23 +97,23 @@ var GnomeShell = new Lang.Class({
             icon = Gio.Icon.new_for_string(serializedIcon);
 
         Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel);
-    },
+    }
 
     FocusApp(id) {
         this.ShowApplications();
         Main.overview.viewSelector.appDisplay.selectApp(id);
-    },
+    }
 
     ShowApplications() {
         Main.overview.viewSelector.showApps();
-    },
+    }
 
     GrabAcceleratorAsync(params, invocation) {
         let [accel, flags] = params;
         let sender = invocation.get_sender();
         let bindingAction = this._grabAcceleratorForSender(accel, flags, sender);
         return invocation.return_value(GLib.Variant.new('(u)', [bindingAction]));
-    },
+    }
 
     GrabAcceleratorsAsync(params, invocation) {
         let [accels] = params;
@@ -126,7 +124,7 @@ var GnomeShell = new Lang.Class({
             bindingActions.push(this._grabAcceleratorForSender(accel, flags, sender));
         }
         return invocation.return_value(GLib.Variant.new('(au)', [bindingActions]));
-    },
+    }
 
     UngrabAcceleratorAsync(params, invocation) {
         let [action] = params;
@@ -138,7 +136,7 @@ var GnomeShell = new Lang.Class({
         if (ungrabSucceeded)
             this._grabbedAccelerators.delete(action);
         return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
-    },
+    }
 
     _emitAcceleratorActivated(action, deviceid, timestamp) {
         let destination = this._grabbedAccelerators.get(action);
@@ -155,7 +153,7 @@ var GnomeShell = new Lang.Class({
                                info ? info.name : null,
                                'AcceleratorActivated',
                                GLib.Variant.new('(ua{sv})', [action, params]));
-    },
+    }
 
     _grabAcceleratorForSender(accelerator, flags, sender) {
         let bindingAction = global.display.grab_accelerator(accelerator);
@@ -174,13 +172,13 @@ var GnomeShell = new Lang.Class({
         }
 
         return bindingAction;
-    },
+    }
 
     _ungrabAccelerator(action) {
         let ungrabSucceeded = global.display.ungrab_accelerator(action);
         if (ungrabSucceeded)
             this._grabbedAccelerators.delete(action);
-    },
+    }
 
     _onGrabberBusNameVanished(connection, name) {
         let grabs = this._grabbedAccelerators.entries();
@@ -190,61 +188,61 @@ var GnomeShell = new Lang.Class({
         }
         Gio.bus_unwatch_name(this._grabbers.get(name));
         this._grabbers.delete(name);
-    },
+    }
 
     ShowMonitorLabelsAsync(params, invocation) {
         let sender = invocation.get_sender();
         let [dict] = params;
         Main.osdMonitorLabeler.show(sender, dict);
-    },
+    }
 
     ShowMonitorLabels2Async(params, invocation) {
         let sender = invocation.get_sender();
         let [dict] = params;
         Main.osdMonitorLabeler.show2(sender, dict);
-    },
+    }
 
     HideMonitorLabelsAsync(params, invocation) {
         let sender = invocation.get_sender();
         Main.osdMonitorLabeler.hide(sender);
-    },
-
-
-    Mode: global.session_mode,
+    }
 
     _checkOverviewVisibleChanged() {
         if (Main.overview.visible !== this._cachedOverviewVisible) {
             this._cachedOverviewVisible = Main.overview.visible;
             this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', 
this._cachedOverviewVisible));
         }
-    },
+    }
+
+    get Mode() {
+        return global.session_mode;
+    }
 
     get OverviewActive() {
         return this._cachedOverviewVisible;
-    },
+    }
 
     set OverviewActive(visible) {
         if (visible)
             Main.overview.show();
         else
             Main.overview.hide();
-    },
+    }
 
-    ShellVersion: Config.PACKAGE_VERSION
-});
+    get ShellVersion() {
+        return Config.PACKAGE_VERSION;
+    }
+};
 
 const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
 
-var GnomeShellExtensions = new Lang.Class({
-    Name: 'GnomeShellExtensionsDBus',
-
-    _init() {
+var GnomeShellExtensions = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
         ExtensionSystem.connect('extension-state-changed',
                                 this._extensionStateChanged.bind(this));
-    },
-
+    }
 
     ListExtensions() {
         let out = {};
@@ -253,7 +251,7 @@ var GnomeShellExtensions = new Lang.Class({
             out[uuid] = dbusObj;
         }
         return out;
-    },
+    }
 
     GetExtensionInfo(uuid) {
         let extension = ExtensionUtils.extensions[uuid];
@@ -291,7 +289,7 @@ var GnomeShellExtensions = new Lang.Class({
         }
 
         return out;
-    },
+    }
 
     GetExtensionErrors(uuid) {
         let extension = ExtensionUtils.extensions[uuid];
@@ -302,15 +300,15 @@ var GnomeShellExtensions = new Lang.Class({
             return [];
 
         return extension.errors;
-    },
+    }
 
     InstallRemoteExtensionAsync([uuid], invocation) {
         return ExtensionDownloader.installExtension(uuid, invocation);
-    },
+    }
 
     UninstallExtension(uuid) {
         return ExtensionDownloader.uninstallExtension(uuid);
-    },
+    }
 
     LaunchExtensionPrefs(uuid) {
         let appSys = Shell.AppSystem.get_default();
@@ -319,7 +317,7 @@ var GnomeShellExtensions = new Lang.Class({
         let timestamp = global.display.get_current_time_roundtrip();
         info.launch_uris(['extension:///' + uuid],
                          global.create_app_launch_context(timestamp, -1));
-    },
+    }
 
     ReloadExtension(uuid) {
         let extension = ExtensionUtils.extensions[uuid];
@@ -327,26 +325,24 @@ var GnomeShellExtensions = new Lang.Class({
             return;
 
         ExtensionSystem.reloadExtension(extension);
-    },
+    }
 
     CheckForUpdates() {
         ExtensionDownloader.checkForUpdates();
-    },
+    }
 
-    ShellVersion: Config.PACKAGE_VERSION,
+    get ShellVersion() {
+        return Config.PACKAGE_VERSION;
+    }
 
     _extensionStateChanged(_, newState) {
         this._dbusImpl.emit_signal('ExtensionStatusChanged',
                                    GLib.Variant.new('(sis)', [newState.uuid, newState.state, 
newState.error]));
     }
-});
-
-var ScreenSaverDBus = new Lang.Class({
-    Name: 'ScreenSaverDBus',
-
-    _init(screenShield) {
-        this.parent();
+};
 
+var ScreenSaverDBus = class {
+    constructor(screenShield) {
         this._screenShield = screenShield;
         screenShield.connect('active-changed', shield => {
             this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
@@ -359,7 +355,7 @@ var ScreenSaverDBus = new Lang.Class({
         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
 
         Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
-    },
+    }
 
     LockAsync(parameters, invocation) {
         let tmpId = this._screenShield.connect('lock-screen-shown', () => {
@@ -369,18 +365,18 @@ var ScreenSaverDBus = new Lang.Class({
         });
 
         this._screenShield.lock(true);
-    },
+    }
 
     SetActive(active) {
         if (active)
             this._screenShield.activate(true);
         else
             this._screenShield.deactivate(false);
-    },
+    }
 
     GetActive() {
         return this._screenShield.active;
-    },
+    }
 
     GetActiveTime() {
         let started = this._screenShield.activationTime;
@@ -388,5 +384,5 @@ var ScreenSaverDBus = new Lang.Class({
             return Math.floor((GLib.get_monotonic_time() - started) / 1000000);
         else
             return 0;
-    },
-});
+    }
+};
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index 9db5136e6..642762fe2 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -2,7 +2,6 @@
 
 const Clutter = imports.gi.Clutter;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const St = imports.gi.St;
 
 const BoxPointer = imports.ui.boxpointer;
@@ -10,12 +9,9 @@ const Main = imports.ui.main;
 const Params = imports.misc.params;
 const PopupMenu = imports.ui.popupMenu;
 
-var EntryMenu = new Lang.Class({
-    Name: 'ShellEntryMenu',
-    Extends: PopupMenu.PopupMenu,
-
-    _init(entry) {
-        this.parent(entry, 0, St.Side.TOP);
+var EntryMenu = class extends PopupMenu.PopupMenu {
+    constructor(entry) {
+        super(entry, 0, St.Side.TOP);
 
         this._entry = entry;
         this._clipboard = St.Clipboard.get_default();
@@ -36,18 +32,18 @@ var EntryMenu = new Lang.Class({
 
         Main.uiGroup.add_actor(this.actor);
         this.actor.hide();
-    },
+    }
 
     _makePasswordItem() {
         let item = new PopupMenu.PopupMenuItem('');
         item.connect('activate', this._onPasswordActivated.bind(this));
         this.addMenuItem(item);
         this._passwordItem = item;
-    },
+    }
 
     get isPassword() {
         return this._passwordItem != null;
-    },
+    }
 
     set isPassword(v) {
         if (v == this.isPassword)
@@ -61,7 +57,7 @@ var EntryMenu = new Lang.Class({
             this._passwordItem = null;
             this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
         }
-    },
+    }
 
     open(animate) {
         this._updatePasteItem();
@@ -69,26 +65,26 @@ var EntryMenu = new Lang.Class({
         if (this._passwordItem)
             this._updatePasswordItem();
 
-        this.parent(animate);
+        super.open(animate);
         this._entry.add_style_pseudo_class('focus');
 
         let direction = Gtk.DirectionType.TAB_FORWARD;
         if (!this.actor.navigate_focus(null, direction, false))
             this.actor.grab_key_focus();
-    },
+    }
 
     _updateCopyItem() {
         let selection = this._entry.clutter_text.get_selection();
         this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
                                     selection && selection != '');
-    },
+    }
 
     _updatePasteItem() {
         this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
             (clipboard, text) => {
                 this._pasteItem.setSensitive(text && text != '');
             });
-    },
+    }
 
     _updatePasswordItem() {
         let textHidden = (this._entry.clutter_text.password_char);
@@ -96,12 +92,12 @@ var EntryMenu = new Lang.Class({
             this._passwordItem.label.set_text(_("Show Text"));
         else
             this._passwordItem.label.set_text(_("Hide Text"));
-    },
+    }
 
     _onCopyActivated() {
         let selection = this._entry.clutter_text.get_selection();
         this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection);
-    },
+    }
 
     _onPasteActivated() {
         this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
@@ -112,13 +108,13 @@ var EntryMenu = new Lang.Class({
                 let pos = this._entry.clutter_text.get_cursor_position();
                 this._entry.clutter_text.insert_text(text, pos);
             });
-    },
+    }
 
     _onPasswordActivated() {
         let visible = !!(this._entry.clutter_text.password_char);
         this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
     }
-});
+};
 
 function _setMenuAlignment(entry, stageX) {
     let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);
diff --git a/js/ui/shellMountOperation.js b/js/ui/shellMountOperation.js
index 4b03490d5..a49e75a8d 100644
--- a/js/ui/shellMountOperation.js
+++ b/js/ui/shellMountOperation.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const Signals = imports.signals;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
@@ -62,10 +61,8 @@ function _createIcon(gicon) {
 
 /* -------------------------------------------------------- */
 
-var ListItem = new Lang.Class({
-    Name: 'ListItem',
-
-    _init(app) {
+var ListItem = class {
+    constructor(app) {
         this._app = app;
 
         let layout = new St.BoxLayout({ vertical: false});
@@ -90,19 +87,17 @@ var ListItem = new Lang.Class({
         layout.add(labelBin);
 
         this.actor.connect('clicked', this._onClicked.bind(this));
-    },
+    }
 
     _onClicked() {
         this.emit('activate');
         this._app.activate();
     }
-});
+};
 Signals.addSignalMethods(ListItem.prototype);
 
-var ShellMountOperation = new Lang.Class({
-    Name: 'ShellMountOperation',
-
-    _init(source, params) {
+var ShellMountOperation = class {
+    constructor(source, params) {
         params = Params.parse(params, { existingDialog: null });
 
         this._dialog = null;
@@ -124,7 +119,7 @@ var ShellMountOperation = new Lang.Class({
                              this._onShowUnmountProgress.bind(this));
 
         this._gicon = source.get_icon();
-    },
+    }
 
     _closeExistingDialog() {
         if (!this._existingDialog)
@@ -132,7 +127,7 @@ var ShellMountOperation = new Lang.Class({
 
         this._existingDialog.close();
         this._existingDialog = null;
-    },
+    }
 
     _onAskQuestion(op, message, choices) {
         this._closeExistingDialog();
@@ -148,7 +143,7 @@ var ShellMountOperation = new Lang.Class({
 
         this._dialog.update(message, choices);
         this._dialog.open();
-    },
+    }
 
     _onAskPassword(op, message, defaultUser, defaultDomain, flags) {
         if (this._existingDialog) {
@@ -173,7 +168,7 @@ var ShellMountOperation = new Lang.Class({
                 }
             });
         this._dialog.open();
-    },
+    }
 
     close(op) {
         this._closeExistingDialog();
@@ -188,7 +183,7 @@ var ShellMountOperation = new Lang.Class({
             this._notifier.done();
             this._notifier = null;
         }
-    },
+    }
 
     _onShowProcesses2(op) {
         this._closeExistingDialog();
@@ -216,7 +211,7 @@ var ShellMountOperation = new Lang.Class({
         }
 
         this._processesDialog.update(message, processes, choices);
-    },
+    }
 
     _onShowUnmountProgress(op, message, timeLeft, bytesLeft) {
         if (!this._notifier)
@@ -226,7 +221,7 @@ var ShellMountOperation = new Lang.Class({
             this._notifier.done(message);
         else
             this._notifier.show(message);
-    },
+    }
 
     borrowDialog() {
         if (this._dialogId != 0) {
@@ -236,18 +231,15 @@ var ShellMountOperation = new Lang.Class({
 
         return this._dialog;
     }
-});
-
-var ShellUnmountNotifier = new Lang.Class({
-    Name: 'ShellUnmountNotifier',
-    Extends: MessageTray.Source,
+};
 
-    _init() {
-        this.parent('', 'media-removable');
+var ShellUnmountNotifier = class extends MessageTray.Source {
+    constructor() {
+        super('', 'media-removable');
 
         this._notification = null;
         Main.messageTray.add(this);
-    },
+    }
 
     show(message) {
         let [header, text] = message.split('\n', 2);
@@ -261,7 +253,7 @@ var ShellUnmountNotifier = new Lang.Class({
         }
 
         this.notify(this._notification);
-    },
+    }
 
     done(message) {
         if (this._notification) {
@@ -276,35 +268,29 @@ var ShellUnmountNotifier = new Lang.Class({
             this.notify(notification);
         }
     }
-});
-
-var ShellMountQuestionDialog = new Lang.Class({
-    Name: 'ShellMountQuestionDialog',
-    Extends: ModalDialog.ModalDialog,
+};
 
-    _init(icon) {
-        this.parent({ styleClass: 'mount-dialog' });
+var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
+    constructor(icon) {
+        super({ styleClass: 'mount-dialog' });
 
         this._content = new Dialog.MessageDialogContent({ icon });
         this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
-    },
+    }
 
     update(message, choices) {
         _setLabelsForMessage(this._content, message);
         _setButtonsForChoices(this, choices);
     }
-});
+};
 Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
 
-var ShellMountPasswordDialog = new Lang.Class({
-    Name: 'ShellMountPasswordDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(message, icon, flags) {
+var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
+    constructor(message, icon, flags) {
         let strings = message.split('\n');
         let title = strings.shift() || null;
         let body = strings.shift() || null;
-        this.parent({ styleClass: 'prompt-dialog' });
+        super({ styleClass: 'prompt-dialog' });
 
         let content = new Dialog.MessageDialogContent({ icon, title, body });
         this.contentLayout.add_actor(content);
@@ -352,20 +338,20 @@ var ShellMountPasswordDialog = new Lang.Class({
                        }];
 
         this.setButtons(buttons);
-    },
+    }
 
     reaskPassword() {
         this._passwordEntry.set_text('');
         this._errorMessageLabel.show();
-    },
+    }
 
     _onCancelButton() {
         this.emit('response', -1, '', false);
-    },
+    }
 
     _onUnlockButton() {
         this._onEntryActivate();
-    },
+    }
 
     _onEntryActivate() {
         global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
@@ -375,14 +361,11 @@ var ShellMountPasswordDialog = new Lang.Class({
             this._rememberChoice &&
             this._rememberChoice.actor.checked);
     }
-});
-
-var ShellProcessesDialog = new Lang.Class({
-    Name: 'ShellProcessesDialog',
-    Extends: ModalDialog.ModalDialog,
+};
 
-    _init(icon) {
-        this.parent({ styleClass: 'mount-dialog' });
+var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
+    constructor(icon) {
+        super({ styleClass: 'mount-dialog' });
 
         this._content = new Dialog.MessageDialogContent({ icon });
         this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
@@ -407,7 +390,7 @@ var ShellProcessesDialog = new Lang.Class({
             if (this._applicationList.get_n_children() == 0)
                 scrollView.hide();
         });
-    },
+    }
 
     _setAppsForPids(pids) {
         // remove all the items
@@ -428,14 +411,14 @@ var ShellProcessesDialog = new Lang.Class({
                 this.emit('response', -1);
             });
         });
-    },
+    }
 
     update(message, processes, choices) {
         this._setAppsForPids(processes);
         _setLabelsForMessage(this._content, message);
         _setButtonsForChoices(this, choices);
     }
-});
+};
 Signals.addSignalMethods(ShellProcessesDialog.prototype);
 
 const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler');
@@ -447,10 +430,8 @@ var ShellMountOperationType = {
     SHOW_PROCESSES: 3
 };
 
-var GnomeShellMountOpHandler = new Lang.Class({
-    Name: 'GnomeShellMountOpHandler',
-
-    _init() {
+var GnomeShellMountOpHandler = class {
+    constructor() {
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this);
         this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
         Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler',
@@ -460,13 +441,13 @@ var GnomeShellMountOpHandler = new Lang.Class({
         this._volumeMonitor = Gio.VolumeMonitor.get();
 
         this._ensureEmptyRequest();
-    },
+    }
 
     _ensureEmptyRequest() {
         this._currentId = null;
         this._currentInvocation = null;
         this._currentType = ShellMountOperationType.NONE;
-    },
+    }
 
     _clearCurrentRequest(response, details) {
         if (this._currentInvocation) {
@@ -475,7 +456,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
         }
 
         this._ensureEmptyRequest();
-    },
+    }
 
     _setCurrentRequest(invocation, id, type) {
         let oldId = this._currentId;
@@ -492,20 +473,20 @@ var GnomeShellMountOpHandler = new Lang.Class({
             return true;
 
         return false;
-    },
+    }
 
     _closeDialog() {
         if (this._dialog) {
             this._dialog.close();
             this._dialog = null;
         }
-    },
+    }
 
     _createGIcon(iconName) {
         let realIconName = iconName ? iconName : 'drive-harddisk';
         return new Gio.ThemedIcon({ name: realIconName,
                                     use_default_fallbacks: true });
-    },
+    }
 
     /**
      * AskPassword:
@@ -557,7 +538,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
                 this._clearCurrentRequest(response, details);
             });
         this._dialog.open();
-    },
+    }
 
     /**
      * AskQuestion:
@@ -595,7 +576,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
 
         this._dialog.update(message, choices);
         this._dialog.open();
-    },
+    }
 
     /**
      * ShowProcesses:
@@ -643,7 +624,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
 
         this._dialog.update(message, applicationPids, choices);
         this._dialog.open();
-    },
+    }
 
     /**
      * Close:
@@ -655,4 +636,4 @@ var GnomeShellMountOpHandler = new Lang.Class({
         this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {});
         this._closeDialog();
     }
-});
+};
diff --git a/js/ui/slider.js b/js/ui/slider.js
index 65ff8ca8a..bef95e16f 100644
--- a/js/ui/slider.js
+++ b/js/ui/slider.js
@@ -3,7 +3,6 @@
 const Atk = imports.gi.Atk;
 const Cairo = imports.cairo;
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const St = imports.gi.St;
 const Signals = imports.signals;
 
@@ -11,18 +10,15 @@ const BarLevel = imports.ui.barLevel;
 
 var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */
 
-var Slider = new Lang.Class({
-    Name: "Slider",
-    Extends: BarLevel.BarLevel,
-
-    _init(value) {
+var Slider = class extends BarLevel.BarLevel {
+    constructor(value) {
         let params = {
             styleClass: 'slider',
             canFocus: true,
             reactive: true,
             accessibleRole: Atk.Role.SLIDER,
         }
-        this.parent(value, params)
+        super(value, params)
 
         this.actor.connect('button-press-event', this._startDragging.bind(this));
         this.actor.connect('touch-event', this._touchDragging.bind(this));
@@ -33,10 +29,10 @@ var Slider = new Lang.Class({
         this._dragging = false;
 
         this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this));
-    },
+    }
 
     _barLevelRepaint(area) {
-        this.parent(area);
+        super._barLevelRepaint(area);
 
         // Add handle
         let cr = area.get_context();
@@ -64,11 +60,11 @@ var Slider = new Lang.Class({
             cr.stroke();
         }
         cr.$dispose();
-    },
+    }
 
     _startDragging(actor, event) {
         return this.startDragging(event);
-    },
+    }
 
     startDragging(event) {
         if (this._dragging)
@@ -100,7 +96,7 @@ var Slider = new Lang.Class({
         [absX, absY] = event.get_coords();
         this._moveHandle(absX, absY);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _endDragging() {
         if (this._dragging) {
@@ -121,7 +117,7 @@ var Slider = new Lang.Class({
             this.emit('drag-end');
         }
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _touchDragging(actor, event) {
         let device = event.get_device();
@@ -139,7 +135,7 @@ var Slider = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     scroll(event) {
         let direction = event.get_scroll_direction();
@@ -164,18 +160,18 @@ var Slider = new Lang.Class({
         this.actor.queue_repaint();
         this.emit('value-changed', this._value);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onScrollEvent(actor, event) {
         return this.scroll(event);
-    },
+    }
 
     _motionEvent(actor, event) {
         let absX, absY;
         [absX, absY] = event.get_coords();
         this._moveHandle(absX, absY);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     onKeyPressEvent(actor, event) {
         let key = event.get_key_symbol();
@@ -189,7 +185,7 @@ var Slider = new Lang.Class({
             return Clutter.EVENT_STOP;
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _moveHandle(absX, absY) {
         let relX, relY, sliderX, sliderY;
@@ -210,11 +206,10 @@ var Slider = new Lang.Class({
         this._value = newvalue * this._maxValue;
         this.actor.queue_repaint();
         this.emit('value-changed', this._value);
-    },
+    }
 
     _getMinimumIncrement(actor) {
         return 0.1;
-    },
-});
-
+    }
+};
 Signals.addSignalMethods(Slider.prototype);
diff --git a/js/ui/status/bluetooth.js b/js/ui/status/bluetooth.js
index 69347ba38..f41be7250 100644
--- a/js/ui/status/bluetooth.js
+++ b/js/ui/status/bluetooth.js
@@ -2,7 +2,6 @@
 
 const Gio = imports.gi.Gio;
 const GnomeBluetooth = imports.gi.GnomeBluetooth;
-const Lang = imports.lang;
 
 const Main = imports.ui.main;
 const PanelMenu = imports.ui.panelMenu;
@@ -18,12 +17,9 @@ const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface
 
 const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup';
 
-var Indicator = new Lang.Class({
-    Name: 'BTIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._indicator = this._addIndicator();
         this._indicator.icon_name = 'bluetooth-active-symbolic';
@@ -59,7 +55,7 @@ var Indicator = new Lang.Class({
         this._model.connect('row-inserted', this._sync.bind(this));
         Main.sessionMode.connect('updated', this._sync.bind(this));
         this._sync();
-    },
+    }
 
     _getDefaultAdapter() {
         let [ret, iter] = this._model.get_iter_first();
@@ -73,7 +69,7 @@ var Indicator = new Lang.Class({
             ret = this._model.iter_next(iter);
         }
         return null;
-    },
+    }
 
     // nDevices is the number of devices setup for the current default
     // adapter if one exists and is powered. If unpowered or unavailable,
@@ -111,7 +107,7 @@ var Indicator = new Lang.Class({
         }
 
         return [ nDevices, nConnectedDevices];
-    },
+    }
 
     _sync() {
         let [ nDevices, nConnectedDevices ] = this._getNDevices();
@@ -136,5 +132,5 @@ var Indicator = new Lang.Class({
             this._item.label.text = _("On");
 
         this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
-    },
-});
+    }
+};
diff --git a/js/ui/status/brightness.js b/js/ui/status/brightness.js
index a1fb976d8..e45cf67c5 100644
--- a/js/ui/status/brightness.js
+++ b/js/ui/status/brightness.js
@@ -1,6 +1,5 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Gio = imports.gi.Gio;
 const St = imports.gi.St;
 
@@ -16,12 +15,9 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
 const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen');
 const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface);
 
-var Indicator = new Lang.Class({
-    Name: 'BrightnessIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent('display-brightness-symbolic');
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super('display-brightness-symbolic');
         this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
                                           (proxy, error) => {
                                               if (error) {
@@ -51,17 +47,17 @@ var Indicator = new Lang.Class({
             return this._slider.onKeyPressEvent(actor, event);
         });
 
-    },
+    }
 
     _sliderChanged(slider, value) {
         let percent = value * 100;
         this._proxy.Brightness = percent;
-    },
+    }
 
     _sync() {
         let visible = this._proxy.Brightness >= 0;
         this._item.actor.visible = visible;
         if (visible)
             this._slider.setValue(this._proxy.Brightness / 100.0);
-    },
-});
+    }
+};
diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js
index 980019cd4..c6f1dc709 100644
--- a/js/ui/status/keyboard.js
+++ b/js/ui/status/keyboard.js
@@ -22,12 +22,9 @@ const Util = imports.misc.util;
 const INPUT_SOURCE_TYPE_XKB = 'xkb';
 const INPUT_SOURCE_TYPE_IBUS = 'ibus';
 
-var LayoutMenuItem = new Lang.Class({
-    Name: 'LayoutMenuItem',
-    Extends: PopupMenu.PopupBaseMenuItem,
-
-    _init(displayName, shortName) {
-        this.parent();
+var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
+    constructor(displayName, shortName) {
+        super();
 
         this.label = new St.Label({ text: displayName });
         this.indicator = new St.Label({ text: shortName });
@@ -35,12 +32,10 @@ var LayoutMenuItem = new Lang.Class({
         this.actor.add(this.indicator);
         this.actor.label_actor = this.label;
     }
-});
-
-var InputSource = new Lang.Class({
-    Name: 'InputSource',
+};
 
-    _init(type, id, displayName, shortName, index) {
+var InputSource = class {
+    constructor(type, id, displayName, shortName, index) {
         this.type = type;
         this.id = id;
         this.displayName = displayName;
@@ -50,20 +45,20 @@ var InputSource = new Lang.Class({
         this.properties = null;
 
         this.xkbId = this._getXkbId();
-    },
+    }
 
     get shortName() {
         return this._shortName;
-    },
+    }
 
     set shortName(v) {
         this._shortName = v;
         this.emit('changed');
-    },
+    }
 
     activate(interactive) {
         this.emit('activate', !!interactive);
-    },
+    }
 
     _getXkbId() {
         let engineDesc = IBusManager.getIBusManager().getEngineDesc(this.id);
@@ -75,7 +70,7 @@ var InputSource = new Lang.Class({
         else
             return engineDesc.layout;
     }
-});
+};
 Signals.addSignalMethods(InputSource.prototype);
 
 var InputSourcePopup = new Lang.Class({
@@ -139,54 +134,55 @@ var InputSourceSwitcher = new Lang.Class({
     }
 });
 
-var InputSourceSettings = new Lang.Class({
-    Name: 'InputSourceSettings',
-    Abstract: true,
+var InputSourceSettings = class {
+    constructor() {
+        if (new.target === InputSourceSettings)
+            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
+    }
 
     _emitInputSourcesChanged() {
         this.emit('input-sources-changed');
-    },
+    }
 
     _emitKeyboardOptionsChanged() {
         this.emit('keyboard-options-changed');
-    },
+    }
 
     _emitPerWindowChanged() {
         this.emit('per-window-changed');
-    },
+    }
 
     get inputSources() {
         return [];
-    },
+    }
 
     get mruSources() {
         return [];
-    },
+    }
 
     set mruSources(sourcesList) {
         // do nothing
-    },
+    }
 
     get keyboardOptions() {
         return [];
-    },
+    }
 
     get perWindow() {
         return false;
     }
-});
+};
 Signals.addSignalMethods(InputSourceSettings.prototype);
 
-var InputSourceSystemSettings = new Lang.Class({
-    Name: 'InputSourceSystemSettings',
-    Extends: InputSourceSettings,
+var InputSourceSystemSettings = class extends InputSourceSettings {
+    constructor() {
+        super();
 
-    _BUS_NAME: 'org.freedesktop.locale1',
-    _BUS_PATH: '/org/freedesktop/locale1',
-    _BUS_IFACE: 'org.freedesktop.locale1',
-    _BUS_PROPS_IFACE: 'org.freedesktop.DBus.Properties',
+        this._BUS_NAME = 'org.freedesktop.locale1';
+        this._BUS_PATH = '/org/freedesktop/locale1';
+        this._BUS_IFACE = 'org.freedesktop.locale1';
+        this._BUS_PROPS_IFACE = 'org.freedesktop.DBus.Properties';
 
-    _init() {
         this._layouts = '';
         this._variants = '';
         this._options = '';
@@ -200,7 +196,7 @@ var InputSourceSystemSettings = new Lang.Class({
                                          null,
                                          Gio.DBusSignalFlags.NONE,
                                          this._reload.bind(this));
-    },
+    }
 
     _reload() {
         Gio.DBus.system.call(this._BUS_NAME,
@@ -232,7 +228,7 @@ var InputSourceSystemSettings = new Lang.Class({
                                      this._emitKeyboardOptionsChanged();
                                  }
                              });
-    },
+    }
 
     get inputSources() {
         let sourcesList = [];
@@ -246,29 +242,28 @@ var InputSourceSystemSettings = new Lang.Class({
             sourcesList.push({ type: INPUT_SOURCE_TYPE_XKB, id: id });
         }
         return sourcesList;
-    },
+    }
 
     get keyboardOptions() {
         return this._options.split(',');
     }
-});
+};
 
-var InputSourceSessionSettings = new Lang.Class({
-    Name: 'InputSourceSessionSettings',
-    Extends: InputSourceSettings,
+var InputSourceSessionSettings = class extends InputSourceSettings {
+    constructor() {
+        super();
 
-    _DESKTOP_INPUT_SOURCES_SCHEMA: 'org.gnome.desktop.input-sources',
-    _KEY_INPUT_SOURCES: 'sources',
-    _KEY_MRU_SOURCES: 'mru-sources',
-    _KEY_KEYBOARD_OPTIONS: 'xkb-options',
-    _KEY_PER_WINDOW: 'per-window',
+        this._DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
+        this._KEY_INPUT_SOURCES = 'sources';
+        this._KEY_MRU_SOURCES = 'mru-sources';
+        this._KEY_KEYBOARD_OPTIONS = 'xkb-options';
+        this._KEY_PER_WINDOW = 'per-window';
 
-    _init() {
         this._settings = new Gio.Settings({ schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA });
         this._settings.connect('changed::' + this._KEY_INPUT_SOURCES, 
this._emitInputSourcesChanged.bind(this));
         this._settings.connect('changed::' + this._KEY_KEYBOARD_OPTIONS, 
this._emitKeyboardOptionsChanged.bind(this));
         this._settings.connect('changed::' + this._KEY_PER_WINDOW, this._emitPerWindowChanged.bind(this));
-    },
+    }
 
     _getSourcesList(key) {
         let sourcesList = [];
@@ -280,34 +275,32 @@ var InputSourceSessionSettings = new Lang.Class({
             sourcesList.push({ type: type, id: id });
         }
         return sourcesList;
-    },
+    }
 
     get inputSources() {
         return this._getSourcesList(this._KEY_INPUT_SOURCES);
-    },
+    }
 
     get mruSources() {
         return this._getSourcesList(this._KEY_MRU_SOURCES);
-    },
+    }
 
     set mruSources(sourcesList) {
         let sources = GLib.Variant.new('a(ss)', sourcesList);
         this._settings.set_value(this._KEY_MRU_SOURCES, sources);
-    },
+    }
 
     get keyboardOptions() {
         return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS);
-    },
+    }
 
     get perWindow() {
         return this._settings.get_boolean(this._KEY_PER_WINDOW);
     }
-});
-
-var InputSourceManager = new Lang.Class({
-    Name: 'InputSourceManager',
+};
 
-    _init() {
+var InputSourceManager = class {
+    constructor() {
         // All valid input sources currently in the gsettings
         // KEY_INPUT_SOURCES list indexed by their index there
         this._inputSources = {};
@@ -361,14 +354,14 @@ var InputSourceManager = new Lang.Class({
         this._sourcesPerWindowChanged();
         this._disableIBus = false;
         this._reloading = false;
-    },
+    }
 
     reload() {
         this._reloading = true;
         this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
         this._inputSourcesChanged();
         this._reloading = false;
-    },
+    }
 
     _ibusReadyCallback(im, ready) {
         if (this._ibusReady == ready)
@@ -377,7 +370,7 @@ var InputSourceManager = new Lang.Class({
         this._ibusReady = ready;
         this._mruSources = [];
         this._inputSourcesChanged();
-    },
+    }
 
     _modifiersSwitcher() {
         let sourceIndexes = Object.keys(this._inputSources);
@@ -399,7 +392,7 @@ var InputSourceManager = new Lang.Class({
 
         is.activate(true);
         return true;
-    },
+    }
 
     _switchInputSource(display, window, binding) {
         if (this._mruSources.length < 2)
@@ -418,12 +411,12 @@ var InputSourceManager = new Lang.Class({
         let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, 
this._keybindingActionBackward);
         if (!popup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
             popup.fadeAndDestroy();
-    },
+    }
 
     _keyboardOptionsChanged() {
         this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
         this._keyboardManager.reapply();
-    },
+    }
 
     _updateMruSettings() {
         // If IBus is not ready we don't have a full picture of all
@@ -442,7 +435,7 @@ var InputSourceManager = new Lang.Class({
         }
 
         this._settings.mruSources = sourcesList;
-    },
+    }
 
     _currentInputSourceChanged(newSource) {
         let oldSource;
@@ -458,7 +451,7 @@ var InputSourceManager = new Lang.Class({
             }
 
         this._changePerWindowSource();
-    },
+    }
 
     activateInputSource(is, interactive) {
         // The focus changes during holdKeyboard/releaseKeyboard may trick
@@ -492,7 +485,7 @@ var InputSourceManager = new Lang.Class({
 
         if (interactive)
             this._updateMruSettings();
-    },
+    }
 
     _updateMruSources() {
         let sourcesList = [];
@@ -537,7 +530,7 @@ var InputSourceManager = new Lang.Class({
                 }
         }
         this._mruSources = mruSources.concat(sourcesList);
-    },
+    }
 
     _inputSourcesChanged() {
         let sources = this._settings.inputSources;
@@ -622,7 +615,7 @@ var InputSourceManager = new Lang.Class({
         // All ibus engines are preloaded here to reduce the launching time
         // when users switch the input sources.
         this._ibusManager.preloadEngines(Object.keys(this._ibusSources));
-    },
+    }
 
     _makeEngineShortName(engineDesc) {
         let symbol = engineDesc.get_symbol();
@@ -634,7 +627,7 @@ var InputSourceManager = new Lang.Class({
             return langCode.toLowerCase();
 
         return String.fromCharCode(0x2328); // keyboard glyph
-    },
+    }
 
     _ibusPropertiesRegistered(im, engineName, props) {
         let source = this._ibusSources[engineName];
@@ -645,7 +638,7 @@ var InputSourceManager = new Lang.Class({
 
         if (source == this._currentSource)
             this.emit('current-source-changed', null);
-    },
+    }
 
     _ibusPropertyUpdated(im, engineName, prop) {
         let source = this._ibusSources[engineName];
@@ -655,7 +648,7 @@ var InputSourceManager = new Lang.Class({
         if (this._updateSubProperty(source.properties, prop) &&
             source == this._currentSource)
             this.emit('current-source-changed', null);
-    },
+    }
 
     _updateSubProperty(props, prop) {
         if (!props)
@@ -672,7 +665,7 @@ var InputSourceManager = new Lang.Class({
             }
         }
         return false;
-    },
+    }
 
     _ibusSetContentType(im, purpose, hints) {
         if (purpose == IBus.InputPurpose.PASSWORD) {
@@ -689,7 +682,7 @@ var InputSourceManager = new Lang.Class({
             this._disableIBus = false;
         }
         this.reload();
-    },
+    }
 
     _getNewInputSource(current) {
         let sourceIndexes = Object.keys(this._inputSources);
@@ -706,14 +699,14 @@ var InputSourceManager = new Lang.Class({
         }
 
         return this._inputSources[sourceIndexes[0]];
-    },
+    }
 
     _getCurrentWindow() {
         if (Main.overview.visible)
             return Main.overview;
         else
             return global.display.focus_window;
-    },
+    }
 
     _setPerWindowInputSource() {
         let window = this._getCurrentWindow();
@@ -727,7 +720,7 @@ var InputSourceManager = new Lang.Class({
 
         if (window._currentSource)
             window._currentSource.activate(false);
-    },
+    }
 
     _sourcesPerWindowChanged() {
         this._sourcesPerWindow = this._settings.perWindow;
@@ -755,7 +748,7 @@ var InputSourceManager = new Lang.Class({
             delete Main.overview._inputSources;
             delete Main.overview._currentSource;
         }
-    },
+    }
 
     _changePerWindowSource() {
         if (!this._sourcesPerWindow)
@@ -767,16 +760,16 @@ var InputSourceManager = new Lang.Class({
 
         window._inputSources = this._inputSources;
         window._currentSource = this._currentSource;
-    },
+    }
 
     get currentSource() {
         return this._currentSource;
-    },
+    }
 
     get inputSources() {
         return this._inputSources;
-    },
-});
+    }
+};
 Signals.addSignalMethods(InputSourceManager.prototype);
 
 let _inputSourceManager = null;
diff --git a/js/ui/status/location.js b/js/ui/status/location.js
index ed4863eca..9b623f072 100644
--- a/js/ui/status/location.js
+++ b/js/ui/status/location.js
@@ -3,7 +3,6 @@
 const Clutter = imports.gi.Clutter;
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 
 const Dialog = imports.ui.dialog;
 const Main = imports.ui.main;
@@ -47,12 +46,9 @@ const GeoclueManager = Gio.DBusProxy.makeProxyWrapper(GeoclueIface);
 
 var AgentIface = loadInterfaceXML('org.freedesktop.GeoClue2.Agent');
 
-var Indicator = new Lang.Class({
-    Name: 'LocationIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA });
         this._settings.connect('changed::' + ENABLED,
@@ -85,11 +81,11 @@ var Indicator = new Lang.Class({
         this._onMaxAccuracyLevelChanged();
         this._connectToGeoclue();
         this._connectToPermissionStore();
-    },
+    }
 
     get MaxAccuracyLevel() {
         return this._getMaxAccuracyLevel();
-    },
+    }
 
     AuthorizeAppAsync(params, invocation) {
         let [desktopId, reqAccuracyLevel] = params;
@@ -104,7 +100,7 @@ var Indicator = new Lang.Class({
             invocation.return_value(GLib.Variant.new('(bu)',
                                                      [ret, accuracyLevel]));
         });
-    },
+    }
 
     _syncIndicator() {
         if (this._managerProxy == null) {
@@ -116,7 +112,7 @@ var Indicator = new Lang.Class({
         this._indicator.visible = this._managerProxy.InUse;
         this._item.actor.visible = this._indicator.visible;
         this._updateMenuLabels();
-    },
+    }
 
     _connectToGeoclue() {
         if (this._managerProxy != null || this._connecting)
@@ -128,7 +124,7 @@ var Indicator = new Lang.Class({
                            '/org/freedesktop/GeoClue2/Manager',
                            this._onManagerProxyReady.bind(this));
         return true;
-    },
+    }
 
     _onManagerProxyReady(proxy, error) {
         if (error != null) {
@@ -144,7 +140,7 @@ var Indicator = new Lang.Class({
         this._syncIndicator();
 
         this._managerProxy.AddAgentRemote('gnome-shell', this._onAgentRegistered.bind(this));
-    },
+    }
 
     _onAgentRegistered(result, error) {
         this._connecting = false;
@@ -152,7 +148,7 @@ var Indicator = new Lang.Class({
 
         if (error != null)
             log(error.message);
-    },
+    }
 
     _onGeoclueVanished() {
         if (this._propertiesChangedId) {
@@ -162,17 +158,17 @@ var Indicator = new Lang.Class({
         this._managerProxy = null;
 
         this._syncIndicator();
-    },
+    }
 
     _onOnOffAction() {
         let enabled = this._settings.get_boolean(ENABLED);
         this._settings.set_boolean(ENABLED, !enabled);
-    },
+    }
 
     _onSessionUpdated() {
         let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
         this.menu.setSensitive(sensitive);
-    },
+    }
 
     _updateMenuLabels() {
         if (this._settings.get_boolean(ENABLED)) {
@@ -183,7 +179,7 @@ var Indicator = new Lang.Class({
             this._item.label.text = _("Location Disabled");
             this._onOffAction.label.text = _("Enable");
         }
-    },
+    }
 
     _onMaxAccuracyLevelChanged() {
         this._updateMenuLabels();
@@ -192,7 +188,7 @@ var Indicator = new Lang.Class({
         // before we emit the notify for this property change.
         if (!this._connectToGeoclue())
             this._notifyMaxAccuracyLevel();
-    },
+    }
 
     _getMaxAccuracyLevel() {
         if (this._settings.get_boolean(ENABLED)) {
@@ -203,23 +199,23 @@ var Indicator = new Lang.Class({
         } else {
             return GeoclueAccuracyLevel.NONE;
         }
-    },
+    }
 
     _notifyMaxAccuracyLevel() {
         let variant = new GLib.Variant('u', this._getMaxAccuracyLevel());
         this._agent.emit_property_changed('MaxAccuracyLevel', variant);
-    },
+    }
 
     _onGeocluePropsChanged(proxy, properties) {
         let unpacked = properties.deep_unpack();
         if ("InUse" in unpacked)
             this._syncIndicator();
-    },
+    }
 
     _connectToPermissionStore() {
         this._permStoreProxy = null;
         new PermissionStore.PermissionStore(this._onPermStoreProxyReady.bind(this));
-    },
+    }
 
     _onPermStoreProxyReady(proxy, error) {
         if (error != null) {
@@ -228,20 +224,15 @@ var Indicator = new Lang.Class({
         }
 
         this._permStoreProxy = proxy;
-    },
-});
+    }
+};
 
 function clamp(value, min, max) {
     return Math.max(min, Math.min(max, value));
 }
 
-var AppAuthorizer = new Lang.Class({
-    Name: 'LocationAppAuthorizer',
-
-    _init(desktopId,
-                    reqAccuracyLevel,
-                    permStoreProxy,
-                    maxAccuracyLevel) {
+var AppAuthorizer = class {
+    constructor(desktopId, reqAccuracyLevel, permStoreProxy, maxAccuracyLevel) {
         this.desktopId = desktopId;
         this.reqAccuracyLevel = reqAccuracyLevel;
         this._permStoreProxy = permStoreProxy;
@@ -249,7 +240,7 @@ var AppAuthorizer = new Lang.Class({
         this._permissions = {};
 
         this._accuracyLevel = GeoclueAccuracyLevel.NONE;
-    },
+    }
 
     authorize(onAuthDone) {
         this._onAuthDone = onAuthDone;
@@ -265,7 +256,7 @@ var AppAuthorizer = new Lang.Class({
         this._permStoreProxy.LookupRemote(APP_PERMISSIONS_TABLE,
                                           APP_PERMISSIONS_ID,
                                           this._onPermLookupDone.bind(this));
-    },
+    }
 
     _onPermLookupDone(result, error) {
         if (error != null) {
@@ -298,7 +289,7 @@ var AppAuthorizer = new Lang.Class({
                                   GeoclueAccuracyLevel.NONE;
             this._completeAuth();
         }
-    },
+    }
 
     _userAuthorizeApp() {
         let name = this._app.get_name();
@@ -306,7 +297,7 @@ var AppAuthorizer = new Lang.Class({
         let reason = appInfo.get_locale_string("X-Geoclue-Reason");
 
         this._showAppAuthDialog(name, reason);
-    },
+    }
 
     _showAppAuthDialog(name, reason) {
         this._dialog = new GeolocationDialog(name,
@@ -320,7 +311,7 @@ var AppAuthorizer = new Lang.Class({
         });
 
         this._dialog.open();
-    },
+    }
 
     _completeAuth() {
         if (this._accuracyLevel != GeoclueAccuracyLevel.NONE) {
@@ -331,7 +322,7 @@ var AppAuthorizer = new Lang.Class({
         this._saveToPermissionStore();
 
         this._onAuthDone(this._accuracyLevel);
-    },
+    }
 
     _saveToPermissionStore() {
         if (this._permStoreProxy == null)
@@ -352,15 +343,12 @@ var AppAuthorizer = new Lang.Class({
             if (error != null)
                 log(error.message);
         });
-    },
-});
-
-var GeolocationDialog = new Lang.Class({
-    Name: 'GeolocationDialog',
-    Extends: ModalDialog.ModalDialog,
+    }
+};
 
-    _init(name, subtitle, reqAccuracyLevel) {
-        this.parent({ styleClass: 'geolocation-dialog' });
+var GeolocationDialog = class extends ModalDialog.ModalDialog {
+    constructor(name, subtitle, reqAccuracyLevel) {
+        super({ styleClass: 'geolocation-dialog' });
         this.reqAccuracyLevel = reqAccuracyLevel;
 
         let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' });
@@ -380,16 +368,16 @@ var GeolocationDialog = new Lang.Class({
                          action: this._onGrantClicked.bind(this) });
 
         this.setInitialKeyFocus(button);
-    },
+    }
 
     _onGrantClicked() {
         this.emit('response', this.reqAccuracyLevel);
         this.close();
-    },
+    }
 
     _onDenyClicked() {
         this.emit('response', GeoclueAccuracyLevel.NONE);
         this.close();
     }
-});
+};
 Signals.addSignalMethods(GeolocationDialog.prototype);
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 92a00301b..a2388bd8b 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -4,7 +4,6 @@ const GLib = imports.gi.GLib;
 const GObject = imports.gi.GObject;
 const Gio = imports.gi.Gio;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const NM = imports.gi.NM;
 const Signals = imports.signals;
@@ -83,10 +82,8 @@ function ensureActiveConnectionProps(active, client) {
     }
 }
 
-var NMConnectionItem = new Lang.Class({
-    Name: 'NMConnectionItem',
-
-    _init(section, connection) {
+var NMConnectionItem = class {
+    constructor(section, connection) {
         this._section = section;
         this._connection = connection;
         this._activeConnection = null;
@@ -94,7 +91,7 @@ var NMConnectionItem = new Lang.Class({
 
         this._buildUI();
         this._sync();
-    },
+    }
 
     _buildUI() {
         this.labelItem = new PopupMenu.PopupMenuItem('');
@@ -102,12 +99,12 @@ var NMConnectionItem = new Lang.Class({
 
         this.radioItem = new PopupMenu.PopupMenuItem(this._connection.get_id(), false);
         this.radioItem.connect('activate', this._activate.bind(this));
-    },
+    }
 
     destroy() {
         this.labelItem.destroy();
         this.radioItem.destroy();
-    },
+    }
 
     updateForConnection(connection) {
         // connection should always be the same object
@@ -120,25 +117,25 @@ var NMConnectionItem = new Lang.Class({
         this.radioItem.label.text = connection.get_id();
         this._sync();
         this.emit('name-changed');
-    },
+    }
 
     getName() {
         return this._connection.get_id();
-    },
+    }
 
     isActive() {
         if (this._activeConnection == null)
             return false;
 
         return this._activeConnection.state <= NM.ActiveConnectionState.ACTIVATED;
-    },
+    }
 
     _sync() {
         let isActive = this.isActive();
         this.labelItem.label.text = isActive ? _("Turn Off") : this._section.getConnectLabel();
         this.radioItem.setOrnament(isActive ? PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE);
         this.emit('icon-changed');
-    },
+    }
 
     _toggle() {
         if (this._activeConnection == null)
@@ -147,18 +144,18 @@ var NMConnectionItem = new Lang.Class({
             this._section.deactivateConnection(this._activeConnection);
 
         this._sync();
-    },
+    }
 
     _activate() {
         if (this._activeConnection == null)
             this._section.activateConnection(this._connection);
 
         this._sync();
-    },
+    }
 
     _connectionStateChanged(ac, newstate, reason) {
         this._sync();
-    },
+    }
 
     setActiveConnection(activeConnection) {
         if (this._activeConnectionChangedId > 0) {
@@ -173,15 +170,15 @@ var NMConnectionItem = new Lang.Class({
                                                                              
this._connectionStateChanged.bind(this));
 
         this._sync();
-    },
-});
+    }
+};
 Signals.addSignalMethods(NMConnectionItem.prototype);
 
-var NMConnectionSection = new Lang.Class({
-    Name: 'NMConnectionSection',
-    Abstract: true,
+var NMConnectionSection = class {
+    constructor(client) {
+        if (new.target === NMConnectionSection)
+            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 
-    _init(client) {
         this._client = client;
 
         this._connectionItems = new Map();
@@ -195,7 +192,7 @@ var NMConnectionSection = new Lang.Class({
         this.item.menu.addMenuItem(this._radioSection);
 
         this._notifyConnectivityId = this._client.connect('notify::connectivity', 
this._iconChanged.bind(this));
-    },
+    }
 
     destroy() {
         if (this._notifyConnectivityId != 0) {
@@ -204,12 +201,12 @@ var NMConnectionSection = new Lang.Class({
         }
 
         this.item.destroy();
-    },
+    }
 
     _iconChanged() {
         this._sync();
         this.emit('icon-changed');
-    },
+    }
 
     _sync() {
         let nItems = this._connectionItems.size;
@@ -219,27 +216,27 @@ var NMConnectionSection = new Lang.Class({
 
         this.item.label.text = this._getStatus();
         this.item.icon.icon_name = this._getMenuIcon();
-    },
+    }
 
     _getMenuIcon() {
         return this.getIndicatorIcon();
-    },
+    }
 
     getConnectLabel() {
         return _("Connect");
-    },
+    }
 
     _connectionValid(connection) {
         return true;
-    },
+    }
 
     _connectionSortFunction(one, two) {
         return GLib.utf8_collate(one.get_id(), two.get_id());
-    },
+    }
 
     _makeConnectionItem(connection) {
         return new NMConnectionItem(this, connection);
-    },
+    }
 
     checkConnection(connection) {
         if (!this._connectionValid(connection))
@@ -259,7 +256,7 @@ var NMConnectionSection = new Lang.Class({
             this._updateForConnection(item, connection);
         else
             this._addConnection(connection);
-    },
+    }
 
     _updateForConnection(item, connection) {
         let pos = this._connections.indexOf(connection);
@@ -270,7 +267,7 @@ var NMConnectionSection = new Lang.Class({
         this._radioSection.moveMenuItem(item.radioItem, pos);
 
         item.updateForConnection(connection);
-    },
+    }
 
     _addConnection(connection) {
         let item = this._makeConnectionItem(connection);
@@ -288,7 +285,7 @@ var NMConnectionSection = new Lang.Class({
         this._radioSection.addMenuItem(item.radioItem, pos);
         this._connectionItems.set(connection.get_uuid(), item);
         this._sync();
-    },
+    }
 
     removeConnection(connection) {
         let uuid = connection.get_uuid();
@@ -303,17 +300,16 @@ var NMConnectionSection = new Lang.Class({
         this._connections.splice(pos, 1);
 
         this._sync();
-    },
-});
+    }
+};
 Signals.addSignalMethods(NMConnectionSection.prototype);
 
-var NMConnectionDevice = new Lang.Class({
-    Name: 'NMConnectionDevice',
-    Extends: NMConnectionSection,
-    Abstract: true,
+var NMConnectionDevice = class extends NMConnectionSection {
+    constructor(client, device) {
+        if (new.target === NMConnectionDevice)
+            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 
-    _init(client, device) {
-        this.parent(client);
+        super(client);
         this._device = device;
         this._description = '';
 
@@ -322,19 +318,19 @@ var NMConnectionDevice = new Lang.Class({
 
         this._stateChangedId = this._device.connect('state-changed', this._deviceStateChanged.bind(this));
         this._activeConnectionChangedId = this._device.connect('notify::active-connection', 
this._activeConnectionChanged.bind(this));
-    },
+    }
 
     _canReachInternet() {
         if (this._client.primary_connection != this._device.active_connection)
             return true;
 
         return this._client.connectivity == NM.ConnectivityState.FULL;
-    },
+    }
 
     _autoConnect() {
         let connection = new NM.SimpleConnection();
         this._client.add_and_activate_connection_async(connection, this._device, null, null, null);
-    },
+    }
 
     destroy() {
         if (this._stateChangedId) {
@@ -346,8 +342,8 @@ var NMConnectionDevice = new Lang.Class({
             this._activeConnectionChangedId = 0;
         }
 
-        this.parent();
-    },
+        super.destroy();
+    }
 
     _activeConnectionChanged() {
         if (this._activeConnection) {
@@ -357,7 +353,7 @@ var NMConnectionDevice = new Lang.Class({
         }
 
         this._sync();
-    },
+    }
 
     _deviceStateChanged(device, newstate, oldstate, reason) {
         if (newstate == oldstate) {
@@ -374,28 +370,28 @@ var NMConnectionDevice = new Lang.Class({
         }
 
         this._sync();
-    },
+    }
 
     _connectionValid(connection) {
         return this._device.connection_valid(connection);
-    },
+    }
 
     activateConnection(connection) {
         this._client.activate_connection_async(connection, this._device, null, null, null);
-    },
+    }
 
     deactivateConnection(activeConnection) {
         this._device.disconnect(null);
-    },
+    }
 
     setDeviceDescription(desc) {
         this._description = desc;
         this._sync();
-    },
+    }
 
     _getDescription() {
         return this._description;
-    },
+    }
 
     _sync() {
         let nItems = this._connectionItems.size;
@@ -414,8 +410,8 @@ var NMConnectionDevice = new Lang.Class({
             }
         }
 
-        this.parent();
-    },
+        super._sync();
+    }
 
     _getStatus() {
         if (!this._device)
@@ -465,31 +461,31 @@ var NMConnectionDevice = new Lang.Class({
             log('Device state invalid, is %d'.format(this._device.state));
             return 'invalid';
         }
-    },
-});
-
-var NMDeviceWired = new Lang.Class({
-    Name: 'NMDeviceWired',
-    Extends: NMConnectionDevice,
-    category: NMConnectionCategory.WIRED,
+    }
+};
 
-    _init(client, device) {
-        this.parent(client, device);
+var NMDeviceWired = class extends NMConnectionDevice {
+    constructor(client, device) {
+        super(client, device);
 
         this.item.menu.addSettingsAction(_("Wired Settings"), 'gnome-network-panel.desktop');
-    },
+    }
+
+    get category() {
+        return NMConnectionCategory.WIRED;
+    }
 
     _hasCarrier() {
         if (this._device instanceof NM.DeviceEthernet)
             return this._device.carrier;
         else
             return true;
-    },
+    }
 
     _sync() {
         this.item.actor.visible = this._hasCarrier();
-        this.parent();
-    },
+        super._sync();
+    }
 
     getIndicatorIcon() {
         if (this._device.active_connection) {
@@ -508,15 +504,11 @@ var NMDeviceWired = new Lang.Class({
         } else
             return 'network-wired-disconnected-symbolic';
     }
-});
-
-var NMDeviceModem = new Lang.Class({
-    Name: 'NMDeviceModem',
-    Extends: NMConnectionDevice,
-    category: NMConnectionCategory.WWAN,
+};
 
-    _init(client, device) {
-        this.parent(client, device);
+var NMDeviceModem = class extends NMConnectionDevice {
+    constructor(client, device) {
+        super(client, device);
 
         this.item.menu.addSettingsAction(_("Mobile Broadband Settings"), 'gnome-network-panel.desktop');
 
@@ -538,12 +530,16 @@ var NMDeviceModem = new Lang.Class({
                 this._iconChanged();
             });
         }
-    },
+    }
+
+    get category() {
+        return NMConnectionCategory.WWAN;
+    }
 
     _autoConnect() {
         Util.spawn(['gnome-control-center', 'network',
                     'connect-3g', this._device.get_path()]);
-    },
+    }
 
     destroy() {
         if (this._operatorNameId) {
@@ -555,8 +551,8 @@ var NMDeviceModem = new Lang.Class({
             this._signalQualityId = 0;
         }
 
-        this.parent();
-    },
+        super.destroy();
+    }
 
     _getStatus() {
         if (!this._client.wwan_hardware_enabled)
@@ -570,8 +566,8 @@ var NMDeviceModem = new Lang.Class({
                  this._mobileDevice && this._mobileDevice.operator_name)
             return this._mobileDevice.operator_name;
         else
-            return this.parent();
-    },
+            return super._getStatus();
+    }
 
     getIndicatorIcon() {
         if (this._device.active_connection) {
@@ -582,31 +578,31 @@ var NMDeviceModem = new Lang.Class({
         } else {
             return 'network-cellular-signal-none-symbolic';
         }
-    },
+    }
 
     _getSignalIcon() {
         return 'network-cellular-signal-' + signalToIcon(this._mobileDevice.signal_quality) + '-symbolic';
-    },
-});
-
-var NMDeviceBluetooth = new Lang.Class({
-    Name: 'NMDeviceBluetooth',
-    Extends: NMConnectionDevice,
-    category: NMConnectionCategory.WWAN,
+    }
+};
 
-    _init(client, device) {
-        this.parent(client, device);
+var NMDeviceBluetooth = class extends NMConnectionDevice {
+    constructor(client, device) {
+        super(client, device);
 
         this.item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-network-panel.desktop');
-    },
+    }
+
+    get category() {
+        return NMConnectionCategory.WWAN;
+    }
 
     _getDescription() {
         return this._device.name;
-    },
+    }
 
     getConnectLabel() {
         return _("Connect to Internet");
-    },
+    }
 
     getIndicatorIcon() {
         if (this._device.active_connection) {
@@ -621,12 +617,10 @@ var NMDeviceBluetooth = new Lang.Class({
             return 'network-cellular-signal-none-symbolic';
         }
     }
-});
-
-var NMWirelessDialogItem = new Lang.Class({
-    Name: 'NMWirelessDialogItem',
+};
 
-    _init(network) {
+var NMWirelessDialogItem = class {
+    constructor(network) {
         this._network = network;
         this._ap = network.accessPoints[0];
 
@@ -660,20 +654,20 @@ var NMWirelessDialogItem = new Lang.Class({
         this._icons.add_actor(this._signalIcon);
 
         this._sync();
-    },
+    }
 
     _sync() {
         this._signalIcon.icon_name = this._getSignalIcon();
-    },
+    }
 
     updateBestAP(ap) {
         this._ap = ap;
         this._sync();
-    },
+    }
 
     setActive(isActive) {
         this._selectedIcon.opacity = isActive ? 255 : 0;
-    },
+    }
 
     _getSignalIcon() {
         if (this._ap.mode == NM80211Mode.ADHOC)
@@ -681,15 +675,12 @@ var NMWirelessDialogItem = new Lang.Class({
         else
             return 'network-wireless-signal-' + signalToIcon(this._ap.strength) + '-symbolic';
     }
-});
+};
 Signals.addSignalMethods(NMWirelessDialogItem.prototype);
 
-var NMWirelessDialog = new Lang.Class({
-    Name: 'NMWirelessDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(client, device) {
-        this.parent({ styleClass: 'nm-dialog' });
+var NMWirelessDialog = class extends ModalDialog.ModalDialog {
+    constructor(client, device) {
+        super({ styleClass: 'nm-dialog' });
 
         this._client = client;
         this._device = device;
@@ -735,7 +726,7 @@ var NMWirelessDialog = new Lang.Class({
             Main.sessionMode.disconnect(id);
             this.close();
         });
-    },
+    }
 
     destroy() {
         if (this._apAddedId) {
@@ -764,13 +755,13 @@ var NMWirelessDialog = new Lang.Class({
             this._scanTimeoutId = 0;
         }
 
-        this.parent();
-    },
+        super.destroy();
+    }
 
     _onScanTimeout() {
         this._device.request_scan_async(null, null);
         return GLib.SOURCE_CONTINUE;
-    },
+    }
 
     _activeApChanged() {
         if (this._activeNetwork)
@@ -786,13 +777,13 @@ var NMWirelessDialog = new Lang.Class({
         if (this._activeNetwork)
             this._activeNetwork.item.setActive(true);
         this._updateSensitivity();
-    },
+    }
 
     _updateSensitivity() {
         let connectSensitive = this._client.wireless_enabled && this._selectedNetwork && 
(this._selectedNetwork != this._activeNetwork);
         this._connectButton.reactive = connectSensitive;
         this._connectButton.can_focus = connectSensitive;
-    },
+    }
 
     _syncView() {
         if (this._rfkill.airplaneMode) {
@@ -827,7 +818,7 @@ var NMWirelessDialog = new Lang.Class({
             this._noNetworksSpinner.play();
         else
             this._noNetworksSpinner.stop();
-    },
+    }
 
     _buildLayout() {
         let headline = new St.BoxLayout({ style_class: 'nm-dialog-header-hbox' });
@@ -906,7 +897,7 @@ var NMWirelessDialog = new Lang.Class({
         this._connectButton = this.addButton({ action: this._connect.bind(this),
                                                label: _("Connect"),
                                                key: Clutter.Return });
-    },
+    }
 
     _connect() {
         let network = this._selectedNetwork;
@@ -928,7 +919,7 @@ var NMWirelessDialog = new Lang.Class({
         }
 
         this.close();
-    },
+    }
 
     _notifySsidCb(accessPoint) {
         if (accessPoint.get_ssid() != null) {
@@ -936,7 +927,7 @@ var NMWirelessDialog = new Lang.Class({
             accessPoint._notifySsidId = 0;
             this._accessPointAdded(this._device, accessPoint);
         }
-    },
+    }
 
     _getApSecurityType(accessPoint) {
         if (accessPoint._secType)
@@ -967,7 +958,7 @@ var NMWirelessDialog = new Lang.Class({
         // cache the found value to avoid checking flags all the time
         accessPoint._secType = type;
         return type;
-    },
+    }
 
     _networkSortFunction(one, two) {
         let oneHasConnection = one.connections.length != 0;
@@ -1008,7 +999,7 @@ var NMWirelessDialog = new Lang.Class({
 
         // sort alphabetically
         return GLib.utf8_collate(one.ssidText, two.ssidText);
-    },
+    }
 
     _networkCompare(network, accessPoint) {
         if (!network.ssid.equal (accessPoint.get_ssid()))
@@ -1019,7 +1010,7 @@ var NMWirelessDialog = new Lang.Class({
             return false;
 
         return true;
-    },
+    }
 
     _findExistingNetwork(accessPoint) {
         for (let i = 0; i < this._networks.length; i++) {
@@ -1031,7 +1022,7 @@ var NMWirelessDialog = new Lang.Class({
         }
 
         return null;
-    },
+    }
 
     _findNetwork(accessPoint) {
         if (accessPoint.get_ssid() == null)
@@ -1042,7 +1033,7 @@ var NMWirelessDialog = new Lang.Class({
                 return i;
         }
         return -1;
-    },
+    }
 
     _checkConnections(network, accessPoint) {
         this._connections.forEach(connection => {
@@ -1051,7 +1042,7 @@ var NMWirelessDialog = new Lang.Class({
                 network.connections.push(connection);
             }
         });
-    },
+    }
 
     _accessPointAdded(device, accessPoint) {
         if (accessPoint.get_ssid() == null) {
@@ -1095,7 +1086,7 @@ var NMWirelessDialog = new Lang.Class({
         }
 
         this._syncView();
-    },
+    }
 
     _accessPointRemoved(device, accessPoint) {
         let res = this._findExistingNetwork(accessPoint);
@@ -1117,7 +1108,7 @@ var NMWirelessDialog = new Lang.Class({
         }
 
         this._syncView();
-    },
+    }
 
     _resortItems() {
         let adjustment = this._scrollView.vscroll.adjustment;
@@ -1129,7 +1120,7 @@ var NMWirelessDialog = new Lang.Class({
         });
 
         adjustment.value = scrollValue;
-    },
+    }
 
     _selectNetwork(network) {
         if (this._selectedNetwork)
@@ -1140,7 +1131,7 @@ var NMWirelessDialog = new Lang.Class({
 
         if (this._selectedNetwork)
             this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
-    },
+    }
 
     _createNetworkItem(network) {
         network.item = new NMWirelessDialogItem(network);
@@ -1154,14 +1145,11 @@ var NMWirelessDialog = new Lang.Class({
             if (keyFocus && keyFocus.contains(network.item.actor))
                 this._itemBox.grab_key_focus();
         });
-    },
-});
-
-var NMDeviceWireless = new Lang.Class({
-    Name: 'NMDeviceWireless',
-    category: NMConnectionCategory.WIRELESS,
+    }
+};
 
-    _init(client, device) {
+var NMDeviceWireless = class {
+    constructor(client, device) {
         this._client = client;
         this._device = device;
 
@@ -1183,12 +1171,16 @@ var NMDeviceWireless = new Lang.Class({
         this._notifyConnectivityId = this._client.connect('notify::connectivity', 
this._iconChanged.bind(this));
 
         this._sync();
-    },
+    }
+
+    get category() {
+        return NMConnectionCategory.WIRELESS;
+    }
 
     _iconChanged() {
         this._sync();
         this.emit('icon-changed');
-    },
+    }
 
     destroy() {
         if (this._activeApChangedId) {
@@ -1221,7 +1213,7 @@ var NMDeviceWireless = new Lang.Class({
         }
 
         this.item.destroy();
-    },
+    }
 
     _deviceStateChanged(device, newstate, oldstate, reason) {
         if (newstate == oldstate) {
@@ -1238,26 +1230,26 @@ var NMDeviceWireless = new Lang.Class({
         }
 
         this._sync();
-    },
+    }
 
     _toggleWifi() {
         this._client.wireless_enabled = !this._client.wireless_enabled;
-    },
+    }
 
     _showDialog() {
         this._dialog = new NMWirelessDialog(this._client, this._device);
         this._dialog.connect('closed', this._dialogClosed.bind(this));
         this._dialog.open();
-    },
+    }
 
     _dialogClosed() {
         this._dialog.destroy();
         this._dialog = null;
-    },
+    }
 
     _strengthChanged() {
         this._iconChanged();
-    },
+    }
 
     _activeApChanged() {
         if (this._activeAccessPoint) {
@@ -1273,7 +1265,7 @@ var NMDeviceWireless = new Lang.Class({
         }
 
         this._sync();
-    },
+    }
 
     _sync() {
         this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
@@ -1281,12 +1273,12 @@ var NMDeviceWireless = new Lang.Class({
 
         this.item.icon.icon_name = this._getMenuIcon();
         this.item.label.text = this._getStatus();
-    },
+    }
 
     setDeviceDescription(desc) {
         this._description = desc;
         this._sync();
-    },
+    }
 
     _getStatus() {
         let ap = this._device.active_access_point;
@@ -1311,21 +1303,21 @@ var NMDeviceWireless = new Lang.Class({
             return _("%s Not Connected").format(this._description);
         else
             return '';
-    },
+    }
 
     _getMenuIcon() {
         if (this._device.active_connection)
             return this.getIndicatorIcon();
         else
             return 'network-wireless-signal-none-symbolic';
-    },
+    }
 
     _canReachInternet() {
         if (this._client.primary_connection != this._device.active_connection)
             return true;
 
         return this._client.connectivity == NM.ConnectivityState.FULL;
-    },
+    }
 
     _isHotSpotMaster() {
         if (!this._device.active_connection)
@@ -1340,7 +1332,7 @@ var NMDeviceWireless = new Lang.Class({
             return false;
 
         return ip4config.get_method() == NM.SETTING_IP4_CONFIG_METHOD_SHARED;
-    },
+    }
 
     getIndicatorIcon() {
         if (this._device.state < NM.DeviceState.PREPARE)
@@ -1366,20 +1358,17 @@ var NMDeviceWireless = new Lang.Class({
             return 'network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic';
         else
             return 'network-wireless-no-route-symbolic';
-    },
-});
+    }
+};
 Signals.addSignalMethods(NMDeviceWireless.prototype);
 
-var NMVpnConnectionItem = new Lang.Class({
-    Name: 'NMVpnConnectionItem',
-    Extends: NMConnectionItem,
-
+var NMVpnConnectionItem = class extends NMConnectionItem {
     isActive() {
         if (this._activeConnection == null)
             return false;
 
         return this._activeConnection.vpn_state != NM.VpnConnectionState.DISCONNECTED;
-    },
+    }
 
     _buildUI() {
         this.labelItem = new PopupMenu.PopupMenuItem('');
@@ -1387,7 +1376,7 @@ var NMVpnConnectionItem = new Lang.Class({
 
         this.radioItem = new PopupMenu.PopupSwitchMenuItem(this._connection.get_id(), false);
         this.radioItem.connect('toggled', this._toggle.bind(this));
-    },
+    }
 
     _sync() {
         let isActive = this.isActive();
@@ -1395,7 +1384,7 @@ var NMVpnConnectionItem = new Lang.Class({
         this.radioItem.setToggleState(isActive);
         this.radioItem.setStatus(this._getStatus());
         this.emit('icon-changed');
-    },
+    }
 
     _getStatus() {
         if (this._activeConnection == null)
@@ -1417,7 +1406,7 @@ var NMVpnConnectionItem = new Lang.Class({
         default:
             return 'invalid';
         }
-    },
+    }
 
     _connectionStateChanged(ac, newstate, reason) {
         if (newstate == NM.VpnConnectionState.FAILED &&
@@ -1429,8 +1418,8 @@ var NMVpnConnectionItem = new Lang.Class({
         }
 
         this.emit('icon-changed');
-        this.parent();
-    },
+        super._connectionStateChanged();
+    }
 
     setActiveConnection(activeConnection) {
         if (this._activeConnectionChangedId > 0) {
@@ -1445,7 +1434,7 @@ var NMVpnConnectionItem = new Lang.Class({
                                                                              
this._connectionStateChanged.bind(this));
 
         this._sync();
-    },
+    }
 
     getIndicatorIcon() {
         if (this._activeConnection) {
@@ -1456,32 +1445,32 @@ var NMVpnConnectionItem = new Lang.Class({
         } else {
             return '';
         }
-    },
-});
-
-var NMVpnSection = new Lang.Class({
-    Name: 'NMVpnSection',
-    Extends: NMConnectionSection,
-    category: NMConnectionCategory.VPN,
+    }
+};
 
-    _init(client) {
-        this.parent(client);
+var NMVpnSection = class extends NMConnectionSection {
+    constructor(client) {
+        super(client);
 
         this.item.menu.addSettingsAction(_("VPN Settings"), 'gnome-network-panel.desktop');
 
         this._sync();
-    },
+    }
 
     _sync() {
         let nItems = this._connectionItems.size;
         this.item.actor.visible = (nItems > 0);
 
-        this.parent();
-    },
+        super._sync();
+    }
+
+    get category() {
+        return NMConnectionCategory.VPN;
+    }
 
     _getDescription() {
         return _("VPN");
-    },
+    }
 
     _getStatus() {
         let values = this._connectionItems.values();
@@ -1491,19 +1480,19 @@ var NMVpnSection = new Lang.Class({
         }
 
         return _("VPN Off");
-    },
+    }
 
     _getMenuIcon() {
         return this.getIndicatorIcon() || 'network-vpn-symbolic';
-    },
+    }
 
     activateConnection(connection) {
         this._client.activate_connection_async(connection, null, null, null, null);
-    },
+    }
 
     deactivateConnection(activeConnection) {
         this._client.deactivate_connection(activeConnection, null);
-    },
+    }
 
     setActiveConnections(vpnConnections) {
         let connections = this._connectionItems.values();
@@ -1516,11 +1505,11 @@ var NMVpnSection = new Lang.Class({
                 item.setActiveConnection(a);
             }
         });
-    },
+    }
 
     _makeConnectionItem(connection) {
         return new NMVpnConnectionItem(this, connection);
-    },
+    }
 
     getIndicatorIcon() {
         let items = this._connectionItems.values();
@@ -1530,16 +1519,13 @@ var NMVpnSection = new Lang.Class({
                 return icon;
         }
         return '';
-    },
-});
+    }
+};
 Signals.addSignalMethods(NMVpnSection.prototype);
 
-var DeviceCategory = new Lang.Class({
-    Name: 'DeviceCategory',
-    Extends: PopupMenu.PopupMenuSection,
-
-    _init(category) {
-        this.parent();
+var DeviceCategory = class extends PopupMenu.PopupMenuSection {
+    constructor(category) {
+        super();
 
         this._category = category;
 
@@ -1558,7 +1544,7 @@ var DeviceCategory = new Lang.Class({
                                                  'gnome-network-panel.desktop');
         this._summaryItem.actor.hide();
 
-    },
+    }
 
     _sync() {
         let nDevices = this.section.box.get_children().reduce(
@@ -1567,7 +1553,7 @@ var DeviceCategory = new Lang.Class({
         let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
         this._summaryItem.actor.visible = shouldSummarize;
         this.section.actor.visible = !shouldSummarize;
-    },
+    }
 
     _getSummaryIcon() {
         switch(this._category) {
@@ -1578,7 +1564,7 @@ var DeviceCategory = new Lang.Class({
                 return 'network-wireless-symbolic';
         }
         return '';
-    },
+    }
 
     _getSummaryLabel(nDevices) {
         switch(this._category) {
@@ -1597,14 +1583,11 @@ var DeviceCategory = new Lang.Class({
         }
         return '';
     }
-});
-
-var NMApplet = new Lang.Class({
-    Name: 'NMApplet',
-    Extends: PanelMenu.SystemIndicator,
+};
 
-    _init() {
-        this.parent();
+var NMApplet = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._primaryIndicator = this._addIndicator();
         this._vpnIndicator = this._addIndicator();
@@ -1626,7 +1609,7 @@ var NMApplet = new Lang.Class({
         this._ctypes[NM.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
 
         NM.Client.new_async(null, this._clientGot.bind(this));
-    },
+    }
 
     _clientGot(obj, result) {
         this._client = NM.Client.new_finish(result);
@@ -1677,12 +1660,12 @@ var NMApplet = new Lang.Class({
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _sessionUpdated() {
         let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
         this.menu.setSensitive(sensitive);
-    },
+    }
 
     _ensureSource() {
         if (!this._source) {
@@ -1693,7 +1676,7 @@ var NMApplet = new Lang.Class({
             this._source.connect('destroy', () => { this._source = null; });
             Main.messageTray.add(this._source);
         }
-    },
+    }
 
     _readDevices() {
         let devices = this._client.get_devices() || [ ];
@@ -1701,7 +1684,7 @@ var NMApplet = new Lang.Class({
             this._deviceAdded(this._client, devices[i], true);
         }
         this._syncDeviceNames();
-    },
+    }
 
     _notify(iconName, title, text, urgency) {
         if (this._notification)
@@ -1717,7 +1700,7 @@ var NMApplet = new Lang.Class({
             this._notification = null;
         });
         this._source.notify(this._notification);
-    },
+    }
 
     _onActivationFailed(device, reason) {
         // XXX: nm-applet has no special text depending on reason
@@ -1726,7 +1709,7 @@ var NMApplet = new Lang.Class({
                      _("Connection failed"),
                      _("Activation of network connection failed"),
                      MessageTray.Urgency.HIGH);
-    },
+    }
 
     _syncDeviceNames() {
         let names = NM.Device.disambiguate_names(this._nmDevices);
@@ -1736,7 +1719,7 @@ var NMApplet = new Lang.Class({
             if (device._delegate)
                 device._delegate.setDeviceDescription(description);
         }
-    },
+    }
 
     _deviceAdded(client, device, skipSyncDeviceNames) {
         if (device._delegate) {
@@ -1760,7 +1743,7 @@ var NMApplet = new Lang.Class({
                 });
             }
         }
-    },
+    }
 
     _addDeviceWrapper(wrapper) {
         wrapper._activationFailedId = wrapper.connect('activation-failed',
@@ -1771,7 +1754,7 @@ var NMApplet = new Lang.Class({
 
         let devices = this._devices[wrapper.category].devices;
         devices.push(wrapper);
-    },
+    }
 
     _deviceRemoved(client, device) {
         let pos = this._nmDevices.indexOf(device);
@@ -1787,7 +1770,7 @@ var NMApplet = new Lang.Class({
         }
 
         this._removeDeviceWrapper(wrapper);
-    },
+    }
 
     _removeDeviceWrapper(wrapper) {
         wrapper.disconnect(wrapper._activationFailedId);
@@ -1796,7 +1779,7 @@ var NMApplet = new Lang.Class({
         let devices = this._devices[wrapper.category].devices;
         let pos = devices.indexOf(wrapper);
         devices.splice(pos, 1);
-    },
+    }
 
     _getMainConnection() {
         let connection;
@@ -1814,7 +1797,7 @@ var NMApplet = new Lang.Class({
         }
 
         return null;
-    },
+    }
 
     _syncMainConnection() {
         if (this._mainConnectionIconChangedId > 0) {
@@ -1838,7 +1821,7 @@ var NMApplet = new Lang.Class({
 
         this._updateIcon();
         this._syncConnectivity();
-    },
+    }
 
     _syncVpnConnections() {
         let activeConnections = this._client.get_active_connections() || [];
@@ -1851,12 +1834,12 @@ var NMApplet = new Lang.Class({
         this._vpnSection.setActiveConnections(vpnConnections);
 
         this._updateIcon();
-    },
+    }
 
     _mainConnectionStateChanged() {
         if (this._mainConnection.state == NM.ActiveConnectionState.ACTIVATED && this._notification)
             this._notification.destroy();
-    },
+    }
 
     _ignoreConnection(connection) {
         let setting = connection.get_setting_connection();
@@ -1868,7 +1851,7 @@ var NMApplet = new Lang.Class({
             return true;
 
         return false;
-    },
+    }
 
     _addConnection(connection) {
         if (this._ignoreConnection(connection))
@@ -1882,16 +1865,16 @@ var NMApplet = new Lang.Class({
 
         this._updateConnection(connection);
         this._connections.push(connection);
-    },
+    }
 
     _readConnections() {
         let connections = this._client.get_connections();
         connections.forEach(this._addConnection.bind(this));
-    },
+    }
 
     _connectionAdded(client, connection) {
         this._addConnection(connection);
-    },
+    }
 
     _connectionRemoved(client, connection) {
         let pos = this._connections.indexOf(connection);
@@ -1915,7 +1898,7 @@ var NMApplet = new Lang.Class({
 
         connection.disconnect(connection._updatedId);
         connection._updatedId = 0;
-    },
+    }
 
     _updateConnection(connection) {
         let connectionSettings = connection.get_setting_by_name(NM.SETTING_CONNECTION_SETTING_NAME);
@@ -1936,7 +1919,7 @@ var NMApplet = new Lang.Class({
                     wrapper.checkConnection(connection);
             });
         }
-    },
+    }
 
     _syncNMState() {
         this.indicators.visible = this._client.nm_running;
@@ -1944,7 +1927,7 @@ var NMApplet = new Lang.Class({
 
         this._updateIcon();
         this._syncConnectivity();
-    },
+    }
 
     _flushConnectivityQueue() {
         if (this._portalHelperProxy) {
@@ -1953,7 +1936,7 @@ var NMApplet = new Lang.Class({
         }
 
         this._connectivityQueue = [];
-    },
+    }
 
     _closeConnectivityCheck(path) {
         let index = this._connectivityQueue.indexOf(path);
@@ -1964,7 +1947,7 @@ var NMApplet = new Lang.Class({
 
             this._connectivityQueue.splice(index, 1);
         }
-    },
+    }
 
     _portalHelperDone(proxy, emitter, parameters) {
         let [path, result] = parameters;
@@ -1988,7 +1971,7 @@ var NMApplet = new Lang.Class({
         } else {
             log('Invalid result from portal helper: ' + result);
         }
-    },
+    }
 
     _syncConnectivity() {
         if (this._mainConnection == null ||
@@ -2033,7 +2016,7 @@ var NMApplet = new Lang.Class({
         }
 
         this._connectivityQueue.push(path);
-    },
+    }
 
     _updateIcon() {
         if (!this._client.networking_enabled) {
@@ -2059,4 +2042,4 @@ var NMApplet = new Lang.Class({
         this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();
         this._vpnIndicator.visible = (this._vpnIndicator.icon_name != '');
     }
-});
+};
diff --git a/js/ui/status/nightLight.js b/js/ui/status/nightLight.js
index d4a2fef93..353db92c3 100644
--- a/js/ui/status/nightLight.js
+++ b/js/ui/status/nightLight.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 
 const Main = imports.ui.main;
 const PanelMenu = imports.ui.panelMenu;
@@ -15,12 +14,9 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Color';
 const ColorInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Color');
 const ColorProxy = Gio.DBusProxy.makeProxyWrapper(ColorInterface);
 
-var Indicator = new Lang.Class({
-    Name: 'NightLightIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._indicator = this._addIndicator();
         this._indicator.icon_name = 'night-light-symbolic';
@@ -50,12 +46,12 @@ var Indicator = new Lang.Class({
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
         this._sync();
-    },
+    }
 
     _sessionUpdated() {
         let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
         this.menu.setSensitive(sensitive);
-    },
+    }
 
     _sync() {
         let visible = this._proxy.NightLightActive;
@@ -67,4 +63,4 @@ var Indicator = new Lang.Class({
                                                 : _("Disable Until Tomorrow");
         this._item.actor.visible = this._indicator.visible = visible;
     }
-});
+};
diff --git a/js/ui/status/power.js b/js/ui/status/power.js
index 4a6ce2c24..6ffd24e04 100644
--- a/js/ui/status/power.js
+++ b/js/ui/status/power.js
@@ -3,7 +3,6 @@
 const Gio = imports.gi.Gio;
 const Clutter = imports.gi.Clutter;
 const St = imports.gi.St;
-const Lang = imports.lang;
 const UPower = imports.gi.UPowerGlib;
 
 const Main = imports.ui.main;
@@ -20,12 +19,9 @@ const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(DisplayDeviceInterface)
 
 const SHOW_BATTERY_PERCENTAGE       = 'show-battery-percentage';
 
-var Indicator = new Lang.Class({
-    Name: 'PowerIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
         this._desktopSettings.connect('changed::' + SHOW_BATTERY_PERCENTAGE,
@@ -54,12 +50,12 @@ var Indicator = new Lang.Class({
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _sessionUpdated() {
         let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
         this.menu.setSensitive(sensitive);
-    },
+    }
 
     _getStatus() {
         let seconds = 0;
@@ -97,7 +93,7 @@ var Indicator = new Lang.Class({
         }
 
         return null;
-    },
+    }
 
     _sync() {
         // Do we have batteries or a UPS?
@@ -128,5 +124,5 @@ var Indicator = new Lang.Class({
 
         // The status label
         this._item.label.text = this._getStatus();
-    },
-});
+    }
+};
diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js
index db94d130d..ab0b55f28 100644
--- a/js/ui/status/remoteAccess.js
+++ b/js/ui/status/remoteAccess.js
@@ -1,17 +1,13 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 
 const PanelMenu = imports.ui.panelMenu;
 const PopupMenu = imports.ui.popupMenu;
 
-var RemoteAccessApplet = new Lang.Class({
-    Name: 'RemoteAccessApplet',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         let backend = Meta.get_backend();
         let controller = backend.get_remote_access_controller();
@@ -33,7 +29,7 @@ var RemoteAccessApplet = new Lang.Class({
         controller.connect('new-handle', (controller, handle) => {
             this._onNewHandle(handle);
         });
-    },
+    }
 
     _ensureControls() {
         if (this._indicator)
@@ -52,7 +48,7 @@ var RemoteAccessApplet = new Lang.Class({
                                   });
         this._item.icon.icon_name = 'screen-shared-symbolic';
         this.menu.addMenuItem(this._item);
-    },
+    }
 
     _sync() {
         if (this._handles.size == 0) {
@@ -62,12 +58,12 @@ var RemoteAccessApplet = new Lang.Class({
             this._indicator.visible = true;
             this._item.actor.visible = true;
         }
-    },
+    }
 
     _onStopped(handle) {
         this._handles.delete(handle);
         this._sync();
-    },
+    }
 
     _onNewHandle(handle) {
         this._handles.add(handle);
@@ -77,5 +73,5 @@ var RemoteAccessApplet = new Lang.Class({
             this._ensureControls();
             this._sync();
         }
-    },
-});
+    }
+};
diff --git a/js/ui/status/rfkill.js b/js/ui/status/rfkill.js
index 8022fb94b..e818e8788 100644
--- a/js/ui/status/rfkill.js
+++ b/js/ui/status/rfkill.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Gio = imports.gi.Gio;
-const Lang = imports.lang;
 const Signals = imports.signals;
 
 const Main = imports.ui.main;
@@ -16,10 +15,8 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
 const RfkillManagerInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Rfkill');
 const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface);
 
-var RfkillManager = new Lang.Class({
-    Name: 'RfkillManager',
-
-    _init() {
+var RfkillManager = class {
+    constructor() {
         this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
                                              (proxy, error) => {
                                                  if (error) {
@@ -30,28 +27,28 @@ var RfkillManager = new Lang.Class({
                                                                      this._changed.bind(this));
                                                  this._changed();
                                              });
-    },
+    }
 
     get airplaneMode() {
         return this._proxy.AirplaneMode;
-    },
+    }
 
     set airplaneMode(v) {
         this._proxy.AirplaneMode = v;
-    },
+    }
 
     get hwAirplaneMode() {
         return this._proxy.HardwareAirplaneMode;
-    },
+    }
 
     get shouldShowAirplaneMode() {
         return this._proxy.ShouldShowAirplaneMode;
-    },
+    }
 
     _changed() {
         this.emit('airplane-mode-changed');
     }
-});
+};
 Signals.addSignalMethods(RfkillManager.prototype);
 
 var _manager;
@@ -63,12 +60,9 @@ function getRfkillManager() {
     return _manager;
 }
 
-var Indicator = new Lang.Class({
-    Name: 'RfkillIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._manager = getRfkillManager();
         this._manager.connect('airplane-mode-changed', this._sync.bind(this));
@@ -90,12 +84,12 @@ var Indicator = new Lang.Class({
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _sessionUpdated() {
         let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
         this.menu.setSensitive(sensitive);
-    },
+    }
 
     _sync() {
         let airplaneMode = this._manager.airplaneMode;
@@ -110,5 +104,5 @@ var Indicator = new Lang.Class({
             this._offItem.label.text = _("Use hardware switch to turn off");
         else
             this._offItem.label.text = _("Turn Off");
-    },
-});
+    }
+};
diff --git a/js/ui/status/screencast.js b/js/ui/status/screencast.js
index a084f1a96..4f147e0ea 100644
--- a/js/ui/status/screencast.js
+++ b/js/ui/status/screencast.js
@@ -1,16 +1,11 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
-
 const Main = imports.ui.main;
 const PanelMenu = imports.ui.panelMenu;
 
-var Indicator = new Lang.Class({
-    Name: 'ScreencastIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._indicator = this._addIndicator();
         this._indicator.icon_name = 'media-record-symbolic';
@@ -18,9 +13,9 @@ var Indicator = new Lang.Class({
         this._sync();
 
         Main.screencastService.connect('updated', this._sync.bind(this));
-    },
+    }
 
     _sync() {
         this._indicator.visible = Main.screencastService.isRecording;
-    },
-});
+    }
+};
diff --git a/js/ui/status/system.js b/js/ui/status/system.js
index 41bcacd94..bbbc44ea1 100644
--- a/js/ui/status/system.js
+++ b/js/ui/status/system.js
@@ -4,7 +4,6 @@ const AccountsService = imports.gi.AccountsService;
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
 const GObject = imports.gi.GObject;
@@ -16,10 +15,8 @@ const PanelMenu = imports.ui.panelMenu;
 const PopupMenu = imports.ui.popupMenu;
 
 
-var AltSwitcher = new Lang.Class({
-    Name: 'AltSwitcher',
-
-    _init(standard, alternate) {
+var AltSwitcher = class {
+    constructor(standard, alternate) {
         this._standard = standard;
         this._standard.connect('notify::visible', this._sync.bind(this));
         if (this._standard instanceof St.Button)
@@ -42,7 +39,7 @@ var AltSwitcher = new Lang.Class({
         this.actor = new St.Bin();
         this.actor.connect('destroy', this._onDestroy.bind(this));
         this.actor.connect('notify::mapped', () => { this._flipped = false; });
-    },
+    }
 
     _sync() {
         let childToShow = null;
@@ -83,14 +80,14 @@ var AltSwitcher = new Lang.Class({
         }
 
         this.actor.show();
-    },
+    }
 
     _onDestroy() {
         if (this._capturedEventId > 0) {
             global.stage.disconnect(this._capturedEventId);
             this._capturedEventId = 0;
         }
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         let type = event.type();
@@ -101,7 +98,7 @@ var AltSwitcher = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onLongPress(action, actor, state) {
         if (state == Clutter.LongPressState.QUERY ||
@@ -112,14 +109,11 @@ var AltSwitcher = new Lang.Class({
         this._sync();
         return true;
     }
-});
-
-var Indicator = new Lang.Class({
-    Name: 'SystemIndicator',
-    Extends: PanelMenu.SystemIndicator,
+};
 
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         let userManager = AccountsService.UserManager.get_default();
         this._user = userManager.get_user(GLib.get_user_name());
@@ -146,7 +140,7 @@ var Indicator = new Lang.Class({
 
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
         this._sessionUpdated();
-    },
+    }
 
     _updateActionsVisibility() {
         let visible = (this._settingsAction.visible ||
@@ -155,18 +149,18 @@ var Indicator = new Lang.Class({
                        this._altSwitcher.actor.visible);
 
         this._actionsItem.actor.visible = visible;
-    },
+    }
 
     _sessionUpdated() {
         this._settingsAction.visible = Main.sessionMode.allowSettings;
-    },
+    }
 
     _updateMultiUser() {
         let hasSwitchUser = this._loginScreenItem.actor.visible;
         let hasLogout = this._logoutItem.actor.visible;
 
         this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
-    },
+    }
 
     _updateSwitchUserSubMenu() {
         this._switchUserSubMenu.label.text = this._user.get_real_name();
@@ -199,7 +193,7 @@ var Indicator = new Lang.Class({
             this._switchUserSubMenu.icon.add_style_class_name('default-icon');
             this._switchUserSubMenu.icon.remove_style_class_name('user-icon');
         }
-    },
+    }
 
     _createActionButton(iconName, accessibleName) {
         let icon = new St.Button({ reactive: true,
@@ -209,7 +203,7 @@ var Indicator = new Lang.Class({
                                    style_class: 'system-menu-action' });
         icon.child = new St.Icon({ icon_name: iconName });
         return icon;
-    },
+    }
 
     _createSubMenu() {
         let bindFlags = GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE;
@@ -340,11 +334,11 @@ var Indicator = new Lang.Class({
                                        () => { this._updateActionsVisibility(); });
         this._altSwitcher.actor.connect('notify::visible',
                                         () => { this._updateActionsVisibility(); });
-    },
+    }
 
     _onSettingsClicked() {
         this.menu.itemActivated();
         Main.overview.hide();
         this._settingsApp.activate();
     }
-});
+};
diff --git a/js/ui/status/thunderbolt.js b/js/ui/status/thunderbolt.js
index 1f873c166..8362b5d73 100644
--- a/js/ui/status/thunderbolt.js
+++ b/js/ui/status/thunderbolt.js
@@ -4,7 +4,6 @@
 
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
-const Lang = imports.lang;
 const Polkit = imports.gi.Polkit;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
@@ -52,11 +51,8 @@ const BOLT_DBUS_CLIENT_IFACE = 'org.freedesktop.bolt1.Manager';
 const BOLT_DBUS_NAME = 'org.freedesktop.bolt';
 const BOLT_DBUS_PATH = '/org/freedesktop/bolt';
 
-var Client = new Lang.Class({
-    Name: 'BoltClient',
-
-    _init() {
-
+var Client = class {
+    constructor() {
        this._proxy = null;
         let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface);
         Gio.DBusProxy.new(Gio.DBus.system,
@@ -69,7 +65,7 @@ var Client = new Lang.Class({
                           this._onProxyReady.bind(this));
 
        this.probing = false;
-    },
+    }
 
     _onProxyReady(o, res) {
         try {
@@ -85,7 +81,7 @@ var Client = new Lang.Class({
        if (this.probing)
            this.emit('probing-changed', this.probing);
 
-    },
+    }
 
     _onPropertiesChanged(proxy, properties) {
         let unpacked = properties.deep_unpack();
@@ -94,7 +90,7 @@ var Client = new Lang.Class({
 
        this.probing = this._proxy.Probing;
        this.emit('probing-changed', this.probing);
-    },
+    }
 
     _onDeviceAdded(proxy, emitter, params) {
        let [path] = params;
@@ -102,7 +98,7 @@ var Client = new Lang.Class({
                                         BOLT_DBUS_NAME,
                                         path);
        this.emit('device-added', device);
-    },
+    }
 
     /* public methods */
     close() {
@@ -112,7 +108,7 @@ var Client = new Lang.Class({
        this._proxy.disconnectSignal(this._deviceAddedId);
        this._proxy.disconnect(this._propsChangedId);
        this._proxy = null;
-    },
+    }
 
     enrollDevice(id, policy, callback) {
        this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE,
@@ -129,34 +125,29 @@ var Client = new Lang.Class({
                                             path);
            callback(device, null);
        });
-    },
+    }
 
     get authMode () {
         return this._proxy.AuthMode;
     }
-
-});
-
+};
 Signals.addSignalMethods(Client.prototype);
 
 /* helper class to automatically authorize new devices */
-var AuthRobot = new Lang.Class({
-    Name: 'BoltAuthRobot',
-
-    _init(client) {
-
+var AuthRobot = class {
+    constructor(client) {
        this._client = client;
 
        this._devicesToEnroll = [];
        this._enrolling = false;
 
        this._client.connect('device-added', this._onDeviceAdded.bind(this));
-    },
+    }
 
     close() {
        this.disconnectAll();
        this._client = null;
-    },
+    }
 
     /* the "device-added" signal will be emitted by boltd for every
      * device that is not currently stored in the database. We are
@@ -184,7 +175,7 @@ var AuthRobot = new Lang.Class({
         * of the list  */
        this._devicesToEnroll.push(dev);
        this._enrollDevices();
-    },
+    }
 
     /* The enrollment queue:
      *   - new devices will be added to the end of the array.
@@ -199,7 +190,7 @@ var AuthRobot = new Lang.Class({
        this._enrolling = true;
        GLib.idle_add(GLib.PRIORITY_DEFAULT,
                      this._enrollDevicesIdle.bind(this));
-    },
+    }
 
     _onEnrollDone(device, error) {
        if (error)
@@ -214,7 +205,7 @@ var AuthRobot = new Lang.Class({
        if (this._enrolling)
            GLib.idle_add(GLib.PRIORITY_DEFAULT,
                          this._enrollDevicesIdle.bind(this));
-    },
+    }
 
     _enrollDevicesIdle() {
        let devices = this._devicesToEnroll;
@@ -228,19 +219,14 @@ var AuthRobot = new Lang.Class({
                                  this._onEnrollDone.bind(this));
        return GLib.SOURCE_REMOVE;
     }
-
-});
-
+};
 Signals.addSignalMethods(AuthRobot.prototype);
 
 /* eof client.js  */
 
-var Indicator = new Lang.Class({
-    Name: 'ThunderboltIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
        this._indicator = this._addIndicator();
         this._indicator.icon_name = 'thunderbolt-symbolic';
@@ -266,12 +252,12 @@ var Indicator = new Lang.Class({
                 log('Failed to get PolKit permission: %s'.format(e.toString()));
             }
         });
-    },
+    }
 
     _onDestroy() {
         this._robot.close();
        this._client.close();
-    },
+    }
 
     _ensureSource() {
         if (!this._source) {
@@ -283,7 +269,7 @@ var Indicator = new Lang.Class({
         }
 
         return this._source;
-    },
+    }
 
     _notify(title, body) {
         if (this._notification)
@@ -302,14 +288,13 @@ var Indicator = new Lang.Class({
                 app.activate();
         });
         this._source.notify(this._notification);
-    },
+    }
 
     /* Session callbacks */
     _sync() {
         let active = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
        this._indicator.visible = active && this._client.probing;
-    },
-
+    }
 
     /* Bolt.Client callbacks */
     _onProbing(cli, probing) {
@@ -319,8 +304,7 @@ var Indicator = new Lang.Class({
            this._indicator.icon_name = 'thunderbolt-symbolic';
 
         this._sync();
-    },
-
+    }
 
     /* AuthRobot callbacks */
     _onEnrollDevice(obj, device, policy) {
@@ -346,12 +330,11 @@ var Indicator = new Lang.Class({
            const body = _("New device has been detected and needs to be authorized by an administrator.");
            this._notify(title, body);
         }
-    },
+    }
 
     _onEnrollFailed(obj, device, error) {
        const title = _("Thunderbolt authorization error");
        const body = _("Could not authorize the Thunderbolt device: %s".format(error.message));
        this._notify(title, body);
     }
-
-});
+};
diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js
index 019030570..365ec4123 100644
--- a/js/ui/status/volume.js
+++ b/js/ui/status/volume.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const Gio = imports.gi.Gio;
 const Gvc = imports.gi.Gvc;
 const St = imports.gi.St;
@@ -29,10 +28,8 @@ function getMixerControl() {
     return _mixerControl;
 }
 
-var StreamSlider = new Lang.Class({
-    Name: 'StreamSlider',
-
-    _init(control) {
+var StreamSlider = class {
+    constructor(control) {
         this._control = control;
 
         this.item = new PopupMenu.PopupBaseMenuItem({ activate: false });
@@ -58,11 +55,11 @@ var StreamSlider = new Lang.Class({
 
         this._stream = null;
         this._volumeCancellable = null;
-    },
+    }
 
     get stream() {
         return this._stream;
-    },
+    }
 
     set stream(stream) {
         if (this._stream) {
@@ -79,37 +76,37 @@ var StreamSlider = new Lang.Class({
         }
 
         this._updateVisibility();
-    },
+    }
 
     _disconnectStream(stream) {
         stream.disconnect(this._mutedChangedId);
         this._mutedChangedId = 0;
         stream.disconnect(this._volumeChangedId);
         this._volumeChangedId = 0;
-    },
+    }
 
     _connectStream(stream) {
         this._mutedChangedId = stream.connect('notify::is-muted', this._updateVolume.bind(this));
         this._volumeChangedId = stream.connect('notify::volume', this._updateVolume.bind(this));
-    },
+    }
 
     _shouldBeVisible() {
         return this._stream != null;
-    },
+    }
 
     _updateVisibility() {
         let visible = this._shouldBeVisible();
         this.item.actor.visible = visible;
-    },
+    }
 
     scroll(event) {
         return this._slider.scroll(event);
-    },
+    }
 
     setValue(value) {
         // piggy-back off of sliderChanged
         this._slider.setValue(value);
-    },
+    }
 
     _sliderChanged(slider, value, property) {
         if (!this._stream)
@@ -127,7 +124,7 @@ var StreamSlider = new Lang.Class({
                 this._stream.change_is_muted(false);
         }
         this._stream.push_volume();
-    },
+    }
 
     _notifyVolumeChange() {
         if (this._volumeCancellable)
@@ -138,13 +135,13 @@ var StreamSlider = new Lang.Class({
         player.play_from_theme('audio-volume-change',
                                _("Volume changed"),
                                this._volumeCancellable);
-    },
+    }
 
     _updateVolume() {
         let muted = this._stream.is_muted;
         this._slider.setValue(muted ? 0 : (this._stream.volume / this._control.get_vol_max_norm()));
         this.emit('stream-updated');
-    },
+    }
 
     _amplifySettingsChanged() {
         this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY);
@@ -156,7 +153,7 @@ var StreamSlider = new Lang.Class({
 
         if (this._stream)
             this._updateVolume();
-    },
+    }
 
     getIcon() {
         if (!this._stream)
@@ -180,14 +177,14 @@ var StreamSlider = new Lang.Class({
                 n = 4;
         }
         return icons[n];
-    },
+    }
 
     getLevel() {
         if (!this._stream)
             return null;
 
         return 100 * this._stream.volume / this._control.get_vol_max_norm();
-    },
+    }
 
     getMaxLevel() {
         let maxVolume = this._control.get_vol_max_norm();
@@ -196,23 +193,20 @@ var StreamSlider = new Lang.Class({
 
         return 100 * maxVolume / this._control.get_vol_max_norm();
     }
-});
+};
 Signals.addSignalMethods(StreamSlider.prototype);
 
-var OutputStreamSlider = new Lang.Class({
-    Name: 'OutputStreamSlider',
-    Extends: StreamSlider,
-
-    _init(control) {
-        this.parent(control);
+var OutputStreamSlider = class extends StreamSlider {
+    constructor(control) {
+        super(control);
         this._slider.actor.accessible_name = _("Volume");
-    },
+    }
 
     _connectStream(stream) {
-        this.parent(stream);
+        super._connectStream(stream);
         this._portChangedId = stream.connect('notify::port', this._portChanged.bind(this));
         this._portChanged();
-    },
+    }
 
     _findHeadphones(sink) {
         // This only works for external headphones (e.g. bluetooth)
@@ -227,19 +221,19 @@ var OutputStreamSlider = new Lang.Class({
             return sink.get_port().port.indexOf('headphone') >= 0;
 
         return false;
-    },
+    }
 
     _disconnectStream(stream) {
-        this.parent(stream);
+        super._disconnectStream(stream);
         stream.disconnect(this._portChangedId);
         this._portChangedId = 0;
-    },
+    }
 
     _updateSliderIcon() {
         this._icon.icon_name = (this._hasHeadphones ?
                                 'audio-headphones-symbolic' :
                                 'audio-speakers-symbolic');
-    },
+    }
 
     _portChanged() {
         let hasHeadphones = this._findHeadphones(this._stream);
@@ -248,24 +242,21 @@ var OutputStreamSlider = new Lang.Class({
             this._updateSliderIcon();
         }
     }
-});
-
-var InputStreamSlider = new Lang.Class({
-    Name: 'InputStreamSlider',
-    Extends: StreamSlider,
+};
 
-    _init(control) {
-        this.parent(control);
+var InputStreamSlider = class extends StreamSlider {
+    constructor(control) {
+        super(control);
         this._slider.actor.accessible_name = _("Microphone");
         this._control.connect('stream-added', this._maybeShowInput.bind(this));
         this._control.connect('stream-removed', this._maybeShowInput.bind(this));
         this._icon.icon_name = 'audio-input-microphone-symbolic';
-    },
+    }
 
     _connectStream(stream) {
-        this.parent(stream);
+        super._connectStream(stream);
         this._maybeShowInput();
-    },
+    }
 
     _maybeShowInput() {
         // only show input widgets if any application is recording audio
@@ -286,19 +277,16 @@ var InputStreamSlider = new Lang.Class({
 
         this._showInput = showInput;
         this._updateVisibility();
-    },
+    }
 
     _shouldBeVisible() {
-        return this.parent() && this._showInput;
+        return super._shouldBeVisible() && this._showInput;
     }
-});
-
-var VolumeMenu = new Lang.Class({
-    Name: 'VolumeMenu',
-    Extends: PopupMenu.PopupMenuSection,
+};
 
-    _init(control) {
-        this.parent();
+var VolumeMenu = class extends PopupMenu.PopupMenuSection {
+    constructor(control) {
+        super();
 
         this.hasHeadphones = false;
 
@@ -319,11 +307,11 @@ var VolumeMenu = new Lang.Class({
         this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
 
         this._onControlStateChanged();
-    },
+    }
 
     scroll(event) {
         return this._output.scroll(event);
-    },
+    }
 
     _onControlStateChanged() {
         if (this._control.get_state() == Gvc.MixerControlState.READY) {
@@ -332,35 +320,32 @@ var VolumeMenu = new Lang.Class({
         } else {
             this.emit('icon-changed');
         }
-    },
+    }
 
     _readOutput() {
         this._output.stream = this._control.get_default_sink();
-    },
+    }
 
     _readInput() {
         this._input.stream = this._control.get_default_source();
-    },
+    }
 
     getIcon() {
         return this._output.getIcon();
-    },
+    }
 
     getLevel() {
         return this._output.getLevel();
-    },
+    }
 
     getMaxLevel() {
         return this._output.getMaxLevel();
     }
-});
+};
 
-var Indicator = new Lang.Class({
-    Name: 'VolumeIndicator',
-    Extends: PanelMenu.SystemIndicator,
-
-    _init() {
-        this.parent();
+var Indicator = class extends PanelMenu.SystemIndicator {
+    constructor() {
+        super();
 
         this._primaryIndicator = this._addIndicator();
 
@@ -380,7 +365,7 @@ var Indicator = new Lang.Class({
         this.menu.addMenuItem(this._volumeMenu);
 
         this.indicators.connect('scroll-event', this._onScrollEvent.bind(this));
-    },
+    }
 
     _onScrollEvent(actor, event) {
         let result = this._volumeMenu.scroll(event);
@@ -393,4 +378,4 @@ var Indicator = new Lang.Class({
         Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
         return result;
     }
-});
+};
diff --git a/js/ui/tweener.js b/js/ui/tweener.js
index 1a85e2fb1..6c9869c47 100644
--- a/js/ui/tweener.js
+++ b/js/ui/tweener.js
@@ -3,7 +3,6 @@
 const Clutter = imports.gi.Clutter;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -162,12 +161,8 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
 // time updates; even better is to pay attention to the vertical
 // vblank and sync to that when possible.)
 //
-var ClutterFrameTicker = new Lang.Class({
-    Name: 'ClutterFrameTicker',
-
-    FRAME_RATE : 60,
-
-    _init() {
+var ClutterFrameTicker = class {
+    constructor() {
         // We don't have a finite duration; tweener will tell us to stop
         // when we need to stop, so use 1000 seconds as "infinity", and
         // set the timeline to loop. Doing this means we have to track
@@ -189,7 +184,11 @@ var ClutterFrameTicker = new Lang.Class({
         perf_log.define_event("tweener.framePrepareDone",
                               "Finished preparing frame",
                               "");
-    },
+    }
+
+    get FRAME_RATE() {
+        return 60;
+    }
 
     _onNewFrame(frame) {
         // If there is a lot of setup to start the animation, then
@@ -206,18 +205,18 @@ var ClutterFrameTicker = new Lang.Class({
         perf_log.event("tweener.framePrepareStart");
         this.emit('prepare-frame');
         perf_log.event("tweener.framePrepareDone");
-    },
+    }
 
     getTime() {
         return this._currentTime;
-    },
+    }
 
     start() {
         if (St.get_slow_down_factor() > 0)
             Tweener.setTimeScale(1 / St.get_slow_down_factor());
         this._timeline.start();
         global.begin_work();
-    },
+    }
 
     stop() {
         this._timeline.stop();
@@ -225,6 +224,5 @@ var ClutterFrameTicker = new Lang.Class({
         this._currentTime = -1;
         global.end_work();
     }
-});
-
+};
 Signals.addSignalMethods(ClutterFrameTicker.prototype);
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
index 1adaf417e..cf48cd1f1 100644
--- a/js/ui/unlockDialog.js
+++ b/js/ui/unlockDialog.js
@@ -8,7 +8,6 @@ const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const GnomeDesktop = imports.gi.GnomeDesktop;
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
@@ -28,10 +27,8 @@ const LoginDialog = imports.gdm.loginDialog;
 // The timeout before going back automatically to the lock screen (in seconds)
 const IDLE_TIMEOUT = 2 * 60;
 
-var UnlockDialog = new Lang.Class({
-    Name: 'UnlockDialog',
-
-    _init(parentActor) {
+var UnlockDialog = class {
+    constructor(parentActor) {
         this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
                                      style_class: 'login-dialog',
                                      layout_manager: new Clutter.BoxLayout(),
@@ -85,7 +82,7 @@ var UnlockDialog = new Lang.Class({
 
         this._idleMonitor = Meta.IdleMonitor.get_core();
         this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, this._escape.bind(this));
-    },
+    }
 
     _updateSensitivity(sensitive) {
         this._authPrompt.updateSensitivity(sensitive);
@@ -94,11 +91,11 @@ var UnlockDialog = new Lang.Class({
             this._otherUserButton.reactive = sensitive;
             this._otherUserButton.can_focus = sensitive;
         }
-    },
+    }
 
     _fail() {
         this.emit('failed');
-    },
+    }
 
     _onReset(authPrompt, beginRequest) {
         let userName;
@@ -110,18 +107,18 @@ var UnlockDialog = new Lang.Class({
         }
 
         this._authPrompt.begin({ userName: userName });
-    },
+    }
 
     _escape() {
         if (this.allowCancel)
             this._authPrompt.cancel();
-    },
+    }
 
     _otherUserClicked(button, event) {
         Gdm.goto_login_session_sync(null);
 
         this._authPrompt.cancel();
-    },
+    }
 
     destroy() {
         this.popModal();
@@ -131,21 +128,21 @@ var UnlockDialog = new Lang.Class({
             this._idleMonitor.remove_watch(this._idleWatchId);
             this._idleWatchId = 0;
         }
-    },
+    }
 
     cancel() {
         this._authPrompt.cancel();
 
         this.destroy();
-    },
+    }
 
     addCharacter(unichar) {
         this._authPrompt.addCharacter(unichar);
-    },
+    }
 
     finish(onComplete) {
         this._authPrompt.finish(onComplete);
-    },
+    }
 
     open(timestamp) {
         this.actor.show();
@@ -160,7 +157,7 @@ var UnlockDialog = new Lang.Class({
         this._isModal = true;
 
         return true;
-    },
+    }
 
     popModal(timestamp) {
         if (this._isModal) {
@@ -168,5 +165,5 @@ var UnlockDialog = new Lang.Class({
             this._isModal = false;
         }
     }
-});
+};
 Signals.addSignalMethods(UnlockDialog.prototype);
diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js
index 4e1ce25e9..9730b73af 100644
--- a/js/ui/userWidget.js
+++ b/js/ui/userWidget.js
@@ -19,10 +19,8 @@ var AVATAR_ICON_SIZE = 64;
 // Copyright (C) 2004-2005 James M. Cape <jcape ignore-your tv>.
 // Copyright (C) 2008,2009 Red Hat, Inc.
 
-var Avatar = new Lang.Class({
-    Name: 'Avatar',
-
-    _init(user, params) {
+var Avatar = class {
+    constructor(user, params) {
         this._user = user;
         params = Params.parse(params, { reactive: false,
                                         iconSize: AVATAR_ICON_SIZE,
@@ -39,12 +37,12 @@ var Avatar = new Lang.Class({
         // Monitor the scaling factor to make sure we recreate the avatar when needed.
         let themeContext = St.ThemeContext.get_for_stage(global.stage);
         themeContext.connect('notify::scale-factor', this.update.bind(this));
-    },
+    }
 
     setSensitive(sensitive) {
         this.actor.can_focus = sensitive;
         this.actor.reactive = sensitive;
-    },
+    }
 
     update() {
         let iconFile = this._user.get_icon_file();
@@ -64,7 +62,7 @@ var Avatar = new Lang.Class({
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
         this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor);
     }
-});
+};
 
 var UserWidgetLabel = new Lang.Class({
     Name: 'UserWidgetLabel',
@@ -151,10 +149,8 @@ var UserWidgetLabel = new Lang.Class({
     },
 });
 
-var UserWidget = new Lang.Class({
-    Name: 'UserWidget',
-
-    _init(user) {
+var UserWidget = class {
+    constructor(user) {
         this._user = user;
 
         this.actor = new St.BoxLayout({ style_class: 'user-widget',
@@ -173,7 +169,7 @@ var UserWidget = new Lang.Class({
         this._userLoadedId = this._user.connect('notify::is-loaded', this._updateUser.bind(this));
         this._userChangedId = this._user.connect('changed', this._updateUser.bind(this));
         this._updateUser();
-    },
+    }
 
     _onDestroy() {
         if (this._userLoadedId != 0) {
@@ -185,9 +181,9 @@ var UserWidget = new Lang.Class({
             this._user.disconnect(this._userChangedId);
             this._userChangedId = 0;
         }
-    },
+    }
 
     _updateUser() {
         this._avatar.update();
     }
-});
+};
diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js
index 6a235eccd..8cd5454b3 100644
--- a/js/ui/viewSelector.js
+++ b/js/ui/viewSelector.js
@@ -53,12 +53,10 @@ function getTermsForSearchString(searchString) {
     return terms;
 }
 
-var TouchpadShowOverviewAction = new Lang.Class({
-    Name: 'TouchpadShowOverviewAction',
-
-    _init(actor) {
+var TouchpadShowOverviewAction = class {
+    constructor(actor) {
         actor.connect('captured-event', this._handleEvent.bind(this));
-    },
+    }
 
     _handleEvent(actor, event) {
         if (event.type() != Clutter.EventType.TOUCHPAD_PINCH)
@@ -72,7 +70,7 @@ var TouchpadShowOverviewAction = new Lang.Class({
 
         return Clutter.EVENT_STOP;
     }
-});
+};
 Signals.addSignalMethods(TouchpadShowOverviewAction.prototype);
 
 var ShowOverviewAction = new Lang.Class({
@@ -138,10 +136,8 @@ var ShowOverviewAction = new Lang.Class({
     }
 });
 
-var ViewSelector = new Lang.Class({
-    Name: 'ViewSelector',
-
-    _init(searchEntry, showAppsButton) {
+var ViewSelector = class {
+    constructor(searchEntry, showAppsButton) {
         this.actor = new Shell.Stack({ name: 'viewSelector' });
 
         this._showAppsButton = showAppsButton;
@@ -263,22 +259,22 @@ var ViewSelector = new Lang.Class({
 
         gesture = new TouchpadShowOverviewAction(global.stage);
         gesture.connect('activated', this._pinchGestureActivated.bind(this));
-    },
+    }
 
     _pinchGestureActivated(action, scale) {
         if (scale < PINCH_GESTURE_THRESHOLD)
             Main.overview.show();
-    },
+    }
 
     _toggleAppsPage() {
         this._showAppsButton.checked = !this._showAppsButton.checked;
         Main.overview.show();
-    },
+    }
 
     showApps() {
         this._showAppsButton.checked = true;
         Main.overview.show();
-    },
+    }
 
     show() {
         this.reset();
@@ -291,7 +287,7 @@ var ViewSelector = new Lang.Class({
 
         if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
             Main.overview.fadeOutDesktop();
-    },
+    }
 
     animateFromOverview() {
         // Make sure workspace page is fully visible to allow
@@ -304,16 +300,16 @@ var ViewSelector = new Lang.Class({
 
         if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
             Main.overview.fadeInDesktop();
-    },
+    }
 
     setWorkspacesFullGeometry(geom) {
         this._workspacesDisplay.setWorkspacesFullGeometry(geom);
-    },
+    }
 
     hide() {
         this.reset();
         this._workspacesDisplay.hide();
-    },
+    }
 
     _addPage(actor, name, a11yIcon, params) {
         params = Params.parse(params, { a11yFocus: null });
@@ -335,7 +331,7 @@ var ViewSelector = new Lang.Class({
         page.hide();
         this.actor.add_actor(page);
         return page;
-    },
+    }
 
     _fadePageIn() {
         Tweener.addTween(this._activePage,
@@ -343,7 +339,7 @@ var ViewSelector = new Lang.Class({
                            time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
                            transition: 'easeOutQuad'
                          });
-    },
+    }
 
     _fadePageOut(page) {
         let oldPage = page;
@@ -355,7 +351,7 @@ var ViewSelector = new Lang.Class({
                                this._animateIn(oldPage);
                            }
                          });
-    },
+    }
 
     _animateIn(oldPage) {
         if (oldPage)
@@ -372,7 +368,7 @@ var ViewSelector = new Lang.Class({
         } else {
             this._fadePageIn();
         }
-    },
+    }
 
     _animateOut(page) {
         let oldPage = page;
@@ -385,7 +381,7 @@ var ViewSelector = new Lang.Class({
         } else {
             this._fadePageOut(page);
         }
-    },
+    }
 
     _showPage(page) {
         if (!Main.overview.visible)
@@ -402,17 +398,17 @@ var ViewSelector = new Lang.Class({
             this._animateOut(oldPage)
         else
             this._animateIn();
-    },
+    }
 
     _a11yFocusPage(page) {
         this._showAppsButton.checked = page == this._appsPage;
         page.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
-    },
+    }
 
     _onShowAppsButtonToggled() {
         this._showPage(this._showAppsButton.checked ?
                        this._appsPage : this._workspacesPage);
-    },
+    }
 
     _onStageKeyPress(actor, event) {
         // Ignore events while anything but the overview has
@@ -443,7 +439,7 @@ var ViewSelector = new Lang.Class({
             }
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _searchCancelled() {
         this._showPage(this._showAppsButton.checked ? this._appsPage
@@ -457,7 +453,7 @@ var ViewSelector = new Lang.Class({
         // (https://bugzilla.gnome.org/show_bug.cgi?id=636341) */
         if (this._text.text != '')
             this.reset();
-    },
+    }
 
     reset() {
         // Don't drop the key focus on Clutter's side if anything but the
@@ -470,7 +466,7 @@ var ViewSelector = new Lang.Class({
 
         this._text.set_cursor_visible(true);
         this._text.set_selection(0, 0);
-    },
+    }
 
     _onStageKeyFocusChanged() {
         let focus = global.stage.get_key_focus();
@@ -483,7 +479,7 @@ var ViewSelector = new Lang.Class({
             this._entry.add_style_pseudo_class('focus');
         else
             this._entry.remove_style_pseudo_class('focus');
-    },
+    }
 
     _onMapped() {
         if (this._entry.mapped) {
@@ -498,7 +494,7 @@ var ViewSelector = new Lang.Class({
                 global.stage.disconnect(this._capturedEventId);
             this._capturedEventId = 0;
         }
-    },
+    }
 
     _shouldTriggerSearch(symbol) {
         if (symbol == Clutter.Multi_key)
@@ -515,7 +511,7 @@ var ViewSelector = new Lang.Class({
             return true;
 
         return false;
-    },
+    }
 
     startSearch(event) {
         global.stage.set_key_focus(this._text);
@@ -523,12 +519,12 @@ var ViewSelector = new Lang.Class({
         let synthEvent = event.copy();
         synthEvent.set_source(this._text);
         this._text.event(synthEvent, false);
-    },
+    }
 
     // the entry does not show the hint
     _isActivated() {
         return this._text.text == this._entry.get_text();
-    },
+    }
 
     _onTextChanged(se, prop) {
         let terms = getTermsForSearchString(this._entry.get_text());
@@ -553,7 +549,7 @@ var ViewSelector = new Lang.Class({
             this._entry.set_secondary_icon(null);
             this._searchCancelled();
         }
-    },
+    }
 
     _onKeyPress(entry, event) {
         let symbol = event.get_key_symbol();
@@ -592,7 +588,7 @@ var ViewSelector = new Lang.Class({
             }
         }
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     _onCapturedEvent(actor, event) {
         if (event.type() == Clutter.EventType.BUTTON_PRESS) {
@@ -609,7 +605,7 @@ var ViewSelector = new Lang.Class({
         }
 
         return Clutter.EVENT_PROPAGATE;
-    },
+    }
 
     getActivePage() {
         if (this._activePage == this._workspacesPage)
@@ -618,7 +614,7 @@ var ViewSelector = new Lang.Class({
             return ViewPage.APPS;
         else
             return ViewPage.SEARCH;
-    },
+    }
 
     fadeIn() {
         let actor = this._activePage;
@@ -626,7 +622,7 @@ var ViewSelector = new Lang.Class({
                                   time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / 2,
                                   transition: 'easeInQuad'
                                 });
-    },
+    }
 
     fadeHalf() {
         let actor = this._activePage;
@@ -635,5 +631,5 @@ var ViewSelector = new Lang.Class({
                                   transition: 'easeOutQuad'
                                 });
     }
-});
+};
 Signals.addSignalMethods(ViewSelector.prototype);
diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js
index 3e53f60b5..27b342b00 100644
--- a/js/ui/windowAttentionHandler.js
+++ b/js/ui/windowAttentionHandler.js
@@ -1,27 +1,24 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const Lang = imports.lang;
 const Shell = imports.gi.Shell;
 
 const Main = imports.ui.main;
 const MessageTray = imports.ui.messageTray;
 
-var WindowAttentionHandler = new Lang.Class({
-    Name: 'WindowAttentionHandler',
-
-    _init() {
+var WindowAttentionHandler = class {
+    constructor() {
         this._tracker = Shell.WindowTracker.get_default();
         this._windowDemandsAttentionId = global.display.connect('window-demands-attention',
                                                                 this._onWindowDemandsAttention.bind(this));
         this._windowMarkedUrgentId = global.display.connect('window-marked-urgent',
                                                                 this._onWindowDemandsAttention.bind(this));
-    },
+    }
 
     _getTitleAndBanner(app, window) {
         let title = app.get_name();
         let banner = _("“%s” is ready").format(window.get_title());
         return [title, banner]
-    },
+    }
 
     _onWindowDemandsAttention(display, window) {
         // We don't want to show the notification when the window is already focused,
@@ -54,18 +51,15 @@ var WindowAttentionHandler = new Lang.Class({
             notification.update(title, banner);
         }));
     }
-});
+};
 
-var Source = new Lang.Class({
-    Name: 'WindowAttentionSource',
-    Extends: MessageTray.Source,
+var Source = class WindowAttentionSource extends MessageTray.Source {
+    constructor(app, window) {
+        super(app.get_name());
 
-    _init(app, window) {
         this._window = window;
         this._app = app;
 
-        this.parent(app.get_name());
-
         this.signalIDs = [];
         this.signalIDs.push(this._window.connect('notify::demands-attention',
                                                  this._sync.bind(this)));
@@ -77,20 +71,20 @@ var Source = new Lang.Class({
                                                  () => { this.destroy(); }));
 
         this.connect('destroy', this._onDestroy.bind(this));
-    },
+    }
 
     _sync() {
         if (this._window.demands_attention || this._window.urgent)
             return;
         this.destroy();
-    },
+    }
 
     _onDestroy() {
         for(let i = 0; i < this.signalIDs.length; i++) {
            this._window.disconnect(this.signalIDs[i]);
         }
         this.signalIDs = [];
-    },
+    }
 
     _createPolicy() {
         if (this._app && this._app.get_app_info()) {
@@ -99,14 +93,14 @@ var Source = new Lang.Class({
         } else {
             return new MessageTray.NotificationGenericPolicy();
         }
-    },
+    }
 
     createIcon(size) {
         return this._app.create_icon_texture(size);
-    },
+    }
 
     open() {
         Main.activateWindow(this._window);
         this.destroy();
     }
-});
+};
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index fedee72d5..22931dc10 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -47,12 +47,9 @@ const GSD_WACOM_OBJECT_PATH = '/org/gnome/SettingsDaemon/Wacom';
 const GsdWacomIface = loadInterfaceXML('org.gnome.SettingsDaemon.Wacom');
 const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
 
-var DisplayChangeDialog = new Lang.Class({
-    Name: 'DisplayChangeDialog',
-    Extends: ModalDialog.ModalDialog,
-
-    _init(wm) {
-        this.parent({ styleClass: 'prompt-dialog' });
+var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
+    constructor(wm) {
+        super({ styleClass: 'prompt-dialog' });
 
         this._wm = wm;
 
@@ -81,7 +78,7 @@ var DisplayChangeDialog = new Lang.Class({
 
         this._timeoutId = Mainloop.timeout_add(ONE_SECOND, this._tick.bind(this));
         GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._tick');
-    },
+    }
 
     close(timestamp) {
         if (this._timeoutId > 0) {
@@ -89,14 +86,14 @@ var DisplayChangeDialog = new Lang.Class({
             this._timeoutId = 0;
         }
 
-        this.parent(timestamp);
-    },
+        super.close(timestamp);
+    }
 
     _formatCountDown() {
         let fmt = ngettext("Settings changes will revert in %d second",
                            "Settings changes will revert in %d seconds");
         return fmt.format(this._countDown);
-    },
+    }
 
     _tick() {
         this._countDown--;
@@ -110,50 +107,48 @@ var DisplayChangeDialog = new Lang.Class({
 
         this._content.body = this._formatCountDown();
         return GLib.SOURCE_CONTINUE;
-    },
+    }
 
     _onFailure() {
         this._wm.complete_display_change(false);
         this.close();
-    },
+    }
 
     _onSuccess() {
         this._wm.complete_display_change(true);
         this.close();
-    },
-});
-
-var WindowDimmer = new Lang.Class({
-    Name: 'WindowDimmer',
+    }
+};
 
-    _init(actor) {
+var WindowDimmer = class {
+    constructor(actor) {
         this._brightnessEffect = new Clutter.BrightnessContrastEffect();
         actor.add_effect(this._brightnessEffect);
         this.actor = actor;
         this._enabled = true;
         this._dimFactor = 0.0;
         this._syncEnabled();
-    },
+    }
 
     _syncEnabled() {
         this._brightnessEffect.enabled = (this._enabled && this._dimFactor > 0);
-    },
+    }
 
     setEnabled(enabled) {
         this._enabled = enabled;
         this._syncEnabled();
-    },
+    }
 
     set dimFactor(factor) {
         this._dimFactor = factor;
         this._brightnessEffect.set_brightness(factor * DIM_BRIGHTNESS);
         this._syncEnabled();
-    },
+    }
 
     get dimFactor() {
         return this._dimFactor;
     }
-});
+};
 
 function getWindowDimmer(actor) {
     let enabled = Meta.prefs_get_attach_modal_dialogs();
@@ -177,10 +172,8 @@ function getWindowDimmer(actor) {
  */
 var LAST_WINDOW_GRACE_TIME = 1000;
 
-var WorkspaceTracker = new Lang.Class({
-    Name: 'WorkspaceTracker',
-
-    _init(wm) {
+var WorkspaceTracker = class {
+    constructor(wm) {
         this._wm = wm;
 
         this._workspaces = [];
@@ -208,15 +201,15 @@ var WorkspaceTracker = new Lang.Class({
         this._workspaceSettings.connect('changed::dynamic-workspaces', 
this._queueCheckWorkspaces.bind(this));
 
         this._nWorkspacesChanged();
-    },
+    }
 
     blockUpdates() {
         this._pauseWorkspaceCheck = true;
-    },
+    }
 
     unblockUpdates() {
         this._pauseWorkspaceCheck = false;
-    },
+    }
 
     _checkWorkspaces() {
         let workspaceManager = global.workspace_manager;
@@ -283,7 +276,7 @@ var WorkspaceTracker = new Lang.Class({
 
         this._checkWorkspacesId = 0;
         return false;
-    },
+    }
 
     keepWorkspaceAlive(workspace, duration) {
         if (workspace._keepAliveId)
@@ -295,7 +288,7 @@ var WorkspaceTracker = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
         GLib.Source.set_name_by_id(workspace._keepAliveId, '[gnome-shell] this._queueCheckWorkspaces');
-    },
+    }
 
     _windowRemoved(workspace, window) {
         workspace._lastRemovedWindow = window;
@@ -308,33 +301,33 @@ var WorkspaceTracker = new Lang.Class({
             return GLib.SOURCE_REMOVE;
         });
         GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces');
-    },
+    }
 
     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) {
         // If the window left the primary monitor, that
         // might make that workspace empty
         if (monitorIndex == Main.layoutManager.primaryIndex)
             this._queueCheckWorkspaces();
-    },
+    }
 
     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) {
         // If the window entered the primary monitor, that
         // might make that workspace non-empty
         if (monitorIndex == Main.layoutManager.primaryIndex)
             this._queueCheckWorkspaces();
-    },
+    }
 
     _windowsRestacked() {
         // Figure out where the pointer is in case we lost track of
         // it during a grab. (In particular, if a trayicon popup menu
         // is dismissed, see if we need to close the message tray.)
         global.sync_pointer();
-    },
+    }
 
     _queueCheckWorkspaces() {
         if (this._checkWorkspacesId == 0)
             this._checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, 
this._checkWorkspaces.bind(this));
-    },
+    }
 
     _nWorkspacesChanged() {
         let workspaceManager = global.workspace_manager;
@@ -382,18 +375,16 @@ var WorkspaceTracker = new Lang.Class({
 
         return false;
     }
-});
+};
 
-var TilePreview = new Lang.Class({
-    Name: 'TilePreview',
-
-    _init() {
+var TilePreview = class {
+    constructor() {
         this.actor = new St.Widget();
         global.window_group.add_actor(this.actor);
 
         this._reset();
         this._showing = false;
-    },
+    }
 
     show(window, tileRect, monitorIndex) {
         let windowActor = window.get_compositor_private();
@@ -437,7 +428,7 @@ var TilePreview = new Lang.Class({
                            time: WINDOW_ANIMATION_TIME,
                            transition: 'easeOutQuad'
                          });
-    },
+    }
 
     hide() {
         if (!this._showing)
@@ -450,13 +441,13 @@ var TilePreview = new Lang.Class({
                            transition: 'easeOutQuad',
                            onComplete: this._reset.bind(this)
                          });
-    },
+    }
 
     _reset() {
         this.actor.hide();
         this._rect = null;
         this._monitorIndex = -1;
-    },
+    }
 
     _updateStyle(monitor) {
         let styles = ['tile-preview'];
@@ -469,17 +460,15 @@ var TilePreview = new Lang.Class({
 
         this.actor.style_class = styles.join(' ');
     }
-});
-
-var TouchpadWorkspaceSwitchAction = new Lang.Class({
-    Name: 'TouchpadWorkspaceSwitchAction',
+};
 
-    _init(actor) {
+var TouchpadWorkspaceSwitchAction = class {
+    constructor(actor) {
         this._dx = 0;
         this._dy = 0;
         actor.connect('captured-event', this._handleEvent.bind(this));
        this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
-    },
+    }
 
     _checkActivated() {
         let dir;
@@ -497,7 +486,7 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
 
         this.emit('activated', dir);
         return true;
-    },
+    }
 
     _handleEvent(actor, event) {
         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
@@ -533,7 +522,7 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
 
         return Clutter.EVENT_STOP;
     }
-});
+};
 Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype);
 
 var WorkspaceSwitchAction = new Lang.Class({
@@ -667,10 +656,8 @@ var AppSwitchAction = new Lang.Class({
     }
 });
 
-var ResizePopup = new Lang.Class({
-    Name: 'ResizePopup',
-
-    _init() {
+var ResizePopup = class {
+    constructor() {
         this._widget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
         this._label = new St.Label({ style_class: 'resize-popup',
                                      x_align: Clutter.ActorAlign.CENTER,
@@ -678,7 +665,7 @@ var ResizePopup = new Lang.Class({
                                      x_expand: true, y_expand: true });
         this._widget.add_child(this._label);
         Main.uiGroup.add_actor(this._widget);
-    },
+    }
 
     set(rect, displayW, displayH) {
         /* Translators: This represents the size of a window. The first number is
@@ -688,18 +675,16 @@ var ResizePopup = new Lang.Class({
 
         this._widget.set_position(rect.x, rect.y);
         this._widget.set_size(rect.width, rect.height);
-    },
+    }
 
     destroy() {
         this._widget.destroy();
         this._widget = null;
-    },
-});
-
-var WindowManager = new Lang.Class({
-    Name: 'WindowManager',
+    }
+};
 
-    _init() {
+var WindowManager = class {
+    constructor() {
         this._shellwm =  global.window_manager;
 
         this._minimizing = [];
@@ -1036,14 +1021,14 @@ var WindowManager = new Lang.Class({
                 currentWindow.unmake_fullscreen();
         });
         global.stage.add_action(gesture);
-    },
+    }
 
     _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) {
         this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex);
         this._currentPadOsd.connect('closed', () => { this._currentPadOsd = null });
 
         return this._currentPadOsd.actor;
-    },
+    }
 
     _switchWorkspaceMotion(action, xRel, yRel) {
         let workspaceManager = global.workspace_manager;
@@ -1062,7 +1047,7 @@ var WindowManager = new Lang.Class({
             xRel = 0;
 
         this._switchData.container.set_position(xRel, yRel);
-    },
+    }
 
     _switchWorkspaceCancel() {
         if (!this._switchData || this._switchData.inProgress)
@@ -1078,7 +1063,7 @@ var WindowManager = new Lang.Class({
                            onCompleteScope: this,
                            onCompleteParams: [switchData],
                          });
-    },
+    }
 
     _actionSwitchWorkspace(action, direction) {
         let workspaceManager = global.workspace_manager;
@@ -1091,7 +1076,7 @@ var WindowManager = new Lang.Class({
             this._switchData.gestureActivated = true;
             this.actionMoveWorkspace(newWs);
         }
-    },
+    }
 
     _lookupIndex(windows, metaWindow) {
         for (let i = 0; i < windows.length; i++) {
@@ -1100,7 +1085,7 @@ var WindowManager = new Lang.Class({
             }
         }
         return -1;
-    },
+    }
 
     _switchApp() {
         let windows = global.get_window_actors().filter(actor => {
@@ -1129,7 +1114,7 @@ var WindowManager = new Lang.Class({
         }
 
         Main.activateWindow(nextWindow);
-    },
+    }
 
     insertWorkspace(pos) {
         let workspaceManager = global.workspace_manager;
@@ -1168,44 +1153,43 @@ var WindowManager = new Lang.Class({
             newWs.activate(global.get_current_time());
             this._blockAnimations = false;
         }
-    },
-
+    }
 
     keepWorkspaceAlive(workspace, duration) {
         if (!this._workspaceTracker)
             return;
 
         this._workspaceTracker.keepWorkspaceAlive(workspace, duration);
-    },
+    }
 
     skipNextEffect(actor) {
         this._skippedActors.push(actor);
-    },
+    }
 
     setCustomKeybindingHandler(name, modes, handler) {
         if (Meta.keybindings_set_custom_handler(name, handler))
             this.allowKeybinding(name, modes);
-    },
+    }
 
     addKeybinding(name, settings, flags, modes, handler) {
         let action = global.display.add_keybinding(name, settings, flags, handler);
         if (action != Meta.KeyBindingAction.NONE)
             this.allowKeybinding(name, modes);
         return action;
-    },
+    }
 
     removeKeybinding(name) {
         if (global.display.remove_keybinding(name))
             this.allowKeybinding(name, Shell.ActionMode.NONE);
-    },
+    }
 
     allowKeybinding(name, modes) {
         this._allowedKeybindings[name] = modes;
-    },
+    }
 
     _shouldAnimate() {
         return !(Main.overview.visible || this._blockAnimations);
-    },
+    }
 
     _shouldAnimateActor(actor, types) {
         if (this._removeEffect(this._skippedActors, actor))
@@ -1219,7 +1203,7 @@ var WindowManager = new Lang.Class({
 
         let type = actor.meta_window.get_window_type();
         return types.indexOf(type) >= 0;
-    },
+    }
 
     _removeEffect(list, actor) {
         let idx = list.indexOf(actor);
@@ -1228,7 +1212,7 @@ var WindowManager = new Lang.Class({
             return true;
         }
         return false;
-    },
+    }
 
     _minimizeWindow(shellwm, actor) {
         let types = [Meta.WindowType.NORMAL,
@@ -1292,7 +1276,7 @@ var WindowManager = new Lang.Class({
                                onOverwriteParams: [shellwm, actor]
                              });
         }
-    },
+    }
 
     _minimizeWindowDone(shellwm, actor) {
         if (this._removeEffect(this._minimizing, actor)) {
@@ -1303,13 +1287,13 @@ var WindowManager = new Lang.Class({
 
             shellwm.completed_minimize(actor);
         }
-    },
+    }
 
     _minimizeWindowOverwritten(shellwm, actor) {
         if (this._removeEffect(this._minimizing, actor)) {
             shellwm.completed_minimize(actor);
         }
-    },
+    }
 
     _unminimizeWindow(shellwm, actor) {
         let types = [Meta.WindowType.NORMAL,
@@ -1374,7 +1358,7 @@ var WindowManager = new Lang.Class({
                                onOverwriteParams: [shellwm, actor]
                              });
         }
-    },
+    }
 
     _unminimizeWindowDone(shellwm, actor) {
         if (this._removeEffect(this._unminimizing, actor)) {
@@ -1385,13 +1369,13 @@ var WindowManager = new Lang.Class({
 
             shellwm.completed_unminimize(actor);
         }
-    },
+    }
 
     _unminimizeWindowOverwritten(shellwm, actor) {
         if (this._removeEffect(this._unminimizing, actor)) {
             shellwm.completed_unminimize(actor);
         }
-    },
+    }
 
     _sizeChangeWindow(shellwm, actor, whichChange, oldFrameRect, oldBufferRect) {
         let types = [Meta.WindowType.NORMAL];
@@ -1404,7 +1388,7 @@ var WindowManager = new Lang.Class({
             this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange);
         else
             shellwm.completed_size_change(actor);
-    },
+    }
 
     _prepareAnimationInfo(shellwm, actor, oldFrameRect, change) {
         // Position a clone of the window on top of the old position,
@@ -1421,7 +1405,7 @@ var WindowManager = new Lang.Class({
 
         actor.__animationInfo = { clone: actorClone,
                                   oldRect: oldFrameRect };
-    },
+    }
 
     _sizeChangedWindow(shellwm, actor) {
         if (!actor.__animationInfo)
@@ -1476,7 +1460,7 @@ var WindowManager = new Lang.Class({
         // It's important that we don't wait until the animation is completed to
         // do this, otherwise our scale will be applied to the old texture size.
         shellwm.completed_size_change(actor);
-    },
+    }
 
     _clearAnimationInfo(actor) {
         if (actor.__animationInfo) {
@@ -1485,7 +1469,7 @@ var WindowManager = new Lang.Class({
             return true;
         }
         return false;
-    },
+    }
 
     _sizeChangeWindowDone(shellwm, actor) {
         if (this._removeEffect(this._resizing, actor)) {
@@ -1496,12 +1480,12 @@ var WindowManager = new Lang.Class({
             actor.translation_y = 0;
             this._clearAnimationInfo(actor);
         }
-    },
+    }
 
     _sizeChangeWindowOverwritten(shellwm, actor) {
         if (this._removeEffect(this._resizing, actor))
             this._clearAnimationInfo(actor);
-    },
+    }
 
     _hasAttachedDialogs(window, ignoreWindow) {
         var count = 0;
@@ -1515,7 +1499,7 @@ var WindowManager = new Lang.Class({
             return true;
         });
         return count != 0;
-    },
+    }
 
     _checkDimming(window, ignoreWindow) {
         let shouldDim = this._hasAttachedDialogs(window, ignoreWindow);
@@ -1530,7 +1514,7 @@ var WindowManager = new Lang.Class({
                 this._dimmedWindows.filter(win => win != window);
             this._undimWindow(window);
         }
-    },
+    }
 
     _dimWindow(window) {
         let actor = window.get_compositor_private();
@@ -1547,7 +1531,7 @@ var WindowManager = new Lang.Class({
                              });
         else
             dimmer.dimFactor = 1.0;
-    },
+    }
 
     _undimWindow(window) {
         let actor = window.get_compositor_private();
@@ -1563,7 +1547,7 @@ var WindowManager = new Lang.Class({
                                transition: 'linear' });
         else
             dimmer.dimFactor = 0.0;
-    },
+    }
 
     _mapWindow(shellwm, actor) {
         actor._windowType = actor.meta_window.get_window_type();
@@ -1647,7 +1631,7 @@ var WindowManager = new Lang.Class({
             shellwm.completed_map(actor);
             return;
         }
-    },
+    }
 
     _mapWindowDone(shellwm, actor) {
         if (this._removeEffect(this._mapping, actor)) {
@@ -1660,13 +1644,13 @@ var WindowManager = new Lang.Class({
             actor.translation_x = 0;
             shellwm.completed_map(actor);
         }
-    },
+    }
 
     _mapWindowOverwrite(shellwm, actor) {
         if (this._removeEffect(this._mapping, actor)) {
             shellwm.completed_map(actor);
         }
-    },
+    }
 
     _destroyWindow(shellwm, actor) {
         let window = actor.meta_window;
@@ -1738,7 +1722,7 @@ var WindowManager = new Lang.Class({
             shellwm.completed_destroy(actor);
             return;
         }
-    },
+    }
 
     _destroyWindowDone(shellwm, actor) {
         if (this._removeEffect(this._destroying, actor)) {
@@ -1749,7 +1733,7 @@ var WindowManager = new Lang.Class({
             }
             shellwm.completed_destroy(actor);
         }
-    },
+    }
 
     _filterKeybinding(shellwm, binding) {
         if (Main.actionMode == Shell.ActionMode.NONE)
@@ -1764,7 +1748,7 @@ var WindowManager = new Lang.Class({
             return false;
 
         return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode);
-    },
+    }
 
     _syncStacking() {
         if (this._switchData == null)
@@ -1793,7 +1777,7 @@ var WindowManager = new Lang.Class({
                 }
             }
         }
-    },
+    }
 
     _getPositionForDirection(direction) {
         let xDest = 0, yDest = 0;
@@ -1817,7 +1801,7 @@ var WindowManager = new Lang.Class({
             xDest = global.screen_width;
 
         return [xDest, yDest];
-    },
+    }
 
     _prepareWorkspaceSwitch(from, to, direction) {
         if (this._switchData)
@@ -1914,7 +1898,7 @@ var WindowManager = new Lang.Class({
                 switchData.windows.splice(switchData.windows.indexOf(w), 1);
             });
         }
-    },
+    }
 
     _finishWorkspaceSwitch(switchData) {
         this._switchData = null;
@@ -1934,7 +1918,7 @@ var WindowManager = new Lang.Class({
         switchData.movingWindowBin.destroy();
 
         this._movingWindow = null;
-    },
+    }
 
     _switchWorkspace(shellwm, from, to, direction) {
         if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
@@ -1967,28 +1951,28 @@ var WindowManager = new Lang.Class({
                            onCompleteScope: this,
                            onCompleteParams: [shellwm]
                          });
-    },
+    }
 
     _switchWorkspaceDone(shellwm) {
         this._finishWorkspaceSwitch(this._switchData);
         shellwm.completed_switch_workspace();
-    },
+    }
 
     _showTilePreview(shellwm, window, tileRect, monitorIndex) {
         if (!this._tilePreview)
             this._tilePreview = new TilePreview();
         this._tilePreview.show(window, tileRect, monitorIndex);
-    },
+    }
 
     _hideTilePreview(shellwm) {
         if (!this._tilePreview)
             return;
         this._tilePreview.hide();
-    },
+    }
 
     _showWindowMenu(shellwm, window, menu, rect) {
         this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
-    },
+    }
 
     _startSwitcher(display, window, binding) {
         let constructor = null;
@@ -2027,19 +2011,19 @@ var WindowManager = new Lang.Class({
 
         if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
             tabPopup.destroy();
-    },
+    }
 
     _startA11ySwitcher(display, window, binding) {
         Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
-    },
+    }
 
     _toggleAppMenu(display, window, event, binding) {
         Main.panel.toggleAppMenu();
-    },
+    }
 
     _toggleCalendar(display, window, event, binding) {
         Main.panel.toggleCalendar();
-    },
+    }
 
     _toggleTweens() {
         this._tweensPaused = !this._tweensPaused;
@@ -2048,7 +2032,7 @@ var WindowManager = new Lang.Class({
             OrigTweener.pauseAllTweens();
         else
             OrigTweener.resumeAllTweens();
-    },
+    }
 
     _showWorkspaceSwitcher(display, window, binding) {
         let workspaceManager = display.get_workspace_manager();
@@ -2117,7 +2101,7 @@ var WindowManager = new Lang.Class({
             }
             this._workspaceSwitcherPopup.display(direction, newWs.index());
         }
-    },
+    }
 
     actionMoveWorkspace(workspace) {
         if (!Main.sessionMode.hasWorkspaces)
@@ -2128,7 +2112,7 @@ var WindowManager = new Lang.Class({
 
         if (activeWorkspace != workspace)
             workspace.activate(global.get_current_time());
-    },
+    }
 
     actionMoveWindow(window, workspace) {
         if (!Main.sessionMode.hasWorkspaces)
@@ -2147,20 +2131,20 @@ var WindowManager = new Lang.Class({
             global.display.clear_mouse_mode();
             workspace.activate_with_focus (window, global.get_current_time());
         }
-    },
+    }
 
     _confirmDisplayChange() {
         let dialog = new DisplayChangeDialog(this._shellwm);
         dialog.open();
-    },
+    }
 
     _createCloseDialog(shellwm, window) {
         return new CloseDialog.CloseDialog(window);
-    },
+    }
 
     _createInhibitShortcutsDialog(shellwm, window) {
         return new InhibitShortcutsDialog.InhibitShortcutsDialog(window);
-    },
+    }
 
     _showResizePopup(display, show, rect, displayW, displayH) {
         if (show) {
@@ -2174,5 +2158,5 @@ var WindowManager = new Lang.Class({
                 this._resizePopup = null;
             }
         }
-    },
-});
+    }
+};
diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
index 11d4f17b6..939ba15d2 100644
--- a/js/ui/windowMenu.js
+++ b/js/ui/windowMenu.js
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*
 
 const Gtk = imports.gi.Gtk;
-const Lang = imports.lang;
 const Meta = imports.gi.Meta;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
@@ -11,12 +10,9 @@ const Main = imports.ui.main;
 const PopupMenu = imports.ui.popupMenu;
 const RemoteMenu = imports.ui.remoteMenu;
 
-var WindowMenu = new Lang.Class({
-    Name: 'WindowMenu',
-    Extends: PopupMenu.PopupMenu,
-
-    _init(window, sourceActor) {
-        this.parent(sourceActor, 0, St.Side.TOP);
+var WindowMenu = class extends PopupMenu.PopupMenu {
+    constructor(window, sourceActor) {
+        super(sourceActor, 0, St.Side.TOP);
 
         this.actor.add_style_class_name('window-menu');
 
@@ -24,7 +20,7 @@ var WindowMenu = new Lang.Class({
         this.actor.hide();
 
         this._buildMenu(window);
-    },
+    }
 
     _buildMenu(window) {
         let type = window.get_window_type();
@@ -177,16 +173,13 @@ var WindowMenu = new Lang.Class({
         if (!window.can_close())
             item.setSensitive(false);
     }
-});
-
-var AppMenu = new Lang.Class({
-    Name: 'AppMenu',
-    Extends: RemoteMenu.RemoteMenu,
+};
 
-    _init(window, sourceActor) {
+var AppMenu = class extends RemoteMenu.RemoteMenu {
+    constructor(window, sourceActor) {
         let app = Shell.WindowTracker.get_default().get_window_app(window);
 
-        this.parent(sourceActor, app.menu, app.action_group);
+        super(sourceActor, app.menu, app.action_group);
 
         this.actor.add_style_class_name('fallback-app-menu');
         let variant = window.get_gtk_theme_variant();
@@ -196,12 +189,10 @@ var AppMenu = new Lang.Class({
         Main.layoutManager.uiGroup.add_actor(this.actor);
         this.actor.hide();
     }
-});
+};
 
-var WindowMenuManager = new Lang.Class({
-    Name: 'WindowMenuManager',
-
-    _init() {
+var WindowMenuManager = class {
+    constructor() {
         this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
 
         this._sourceActor = new St.Widget({ reactive: true, visible: false });
@@ -209,7 +200,7 @@ var WindowMenuManager = new Lang.Class({
             this._manager.activeMenu.toggle();
         });
         Main.uiGroup.add_actor(this._sourceActor);
-    },
+    }
 
     showWindowMenuForWindow(window, type, rect) {
         let menuType = (type == Meta.WindowMenuType.WM) ? WindowMenu : AppMenu;
@@ -239,4 +230,4 @@ var WindowMenuManager = new Lang.Class({
             window.disconnect(destroyId);
         });
     }
-});
+};
diff --git a/js/ui/workspace.js b/js/ui/workspace.js
index baa8a4380..d002cd008 100644
--- a/js/ui/workspace.js
+++ b/js/ui/workspace.js
@@ -102,10 +102,8 @@ var WindowCloneLayout = new Lang.Class({
     }
 });
 
-var WindowClone = new Lang.Class({
-    Name: 'WindowClone',
-
-    _init(realWindow, workspace) {
+var WindowClone = class {
+    constructor(realWindow, workspace) {
         this.realWindow = realWindow;
         this.metaWindow = realWindow.meta_window;
         this.metaWindow._delegate = this;
@@ -180,18 +178,18 @@ var WindowClone = new Lang.Class({
 
         this._selected = false;
         this._closeRequested = false;
-    },
+    }
 
     set slot(slot) {
         this._slot = slot;
-    },
+    }
 
     get slot() {
         if (this.inDrag)
             return this._dragSlot;
         else
             return this._slot;
-    },
+    }
 
     deleteAll() {
         // Delete all windows, starting from the bottom-most (most-modal) one
@@ -205,7 +203,7 @@ var WindowClone = new Lang.Class({
 
         this.metaWindow.delete(global.get_current_time());
         this._closeRequested = true;
-    },
+    }
 
     addDialog(win) {
         let parent = win.get_transient_for();
@@ -222,11 +220,11 @@ var WindowClone = new Lang.Class({
         // assume it's a close confirmation and leave the overview
         if (this._closeRequested)
             this._activate();
-    },
+    }
 
     hasAttachedDialogs() {
         return this.actor.get_n_children() > 1;
-    },
+    }
 
     _doAddAttachedDialog(metaWin, realWin) {
         let clone = new Clutter.Clone({ source: realWin });
@@ -240,7 +238,7 @@ var WindowClone = new Lang.Class({
             this._onMetaWindowSizeChanged();
         });
         this.actor.add_child(clone);
-    },
+    }
 
     _updateAttachedDialogs() {
         let iter = win => {
@@ -256,23 +254,23 @@ var WindowClone = new Lang.Class({
             return true;
         };
         this.metaWindow.foreach_transient(iter);
-    },
+    }
 
     get boundingBox() {
         return this._boundingBox;
-    },
+    }
 
     get width() {
         return this._boundingBox.width;
-    },
+    }
 
     get height() {
         return this._boundingBox.height;
-    },
+    }
 
     getOriginalPosition() {
         return [this._boundingBox.x, this._boundingBox.y];
-    },
+    }
 
     _computeBoundingBox() {
         let rect = this.metaWindow.get_frame_rect();
@@ -291,7 +289,7 @@ var WindowClone = new Lang.Class({
         // Convert from a MetaRectangle to a native JS object
         this._boundingBox = { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
         this.actor.layout_manager.boundingBox = rect;
-    },
+    }
 
     // Find the actor just below us, respecting reparenting done
     // by DND code
@@ -307,7 +305,7 @@ var WindowClone = new Lang.Class({
         } else {
             return this._stackAbove;
         }
-    },
+    }
 
     setStackAbove(actor) {
         this._stackAbove = actor;
@@ -320,11 +318,11 @@ var WindowClone = new Lang.Class({
             this.actor.lower_bottom();
         else
             this.actor.raise(actualAbove);
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     _disconnectSignals() {
         this.actor.get_children().forEach(child => {
@@ -338,12 +336,12 @@ var WindowClone = new Lang.Class({
             realWindow.meta_window.disconnect(child._posChangedId);
             realWindow.disconnect(child._destroyId);
         });
-    },
+    }
 
     _onMetaWindowSizeChanged() {
         this._computeBoundingBox();
         this.emit('size-changed');
-    },
+    }
 
     _onDestroy() {
         this._disconnectSignals();
@@ -357,12 +355,12 @@ var WindowClone = new Lang.Class({
         }
 
         this.disconnectAll();
-    },
+    }
 
     _activate() {
         this._selected = true;
         this.emit('selected', global.get_current_time());
-    },
+    }
 
     _onKeyPress(actor, event) {
         let symbol = event.get_key_symbol();
@@ -373,11 +371,11 @@ var WindowClone = new Lang.Class({
         }
 
         return false;
-    },
+    }
 
     _onClicked(action, actor) {
         this._activate();
-    },
+    }
 
     _onLongPress(action, actor, state) {
         // Take advantage of the Clutter policy to consider
@@ -400,7 +398,7 @@ var WindowClone = new Lang.Class({
             this.emit('show-chrome');
         }
         return true;
-    },
+    }
 
     _onDragBegin(draggable, time) {
         this._dragSlot = this._slot;
@@ -408,19 +406,19 @@ var WindowClone = new Lang.Class({
         this.dragOrigScale = this.actor.scale_x;
         this.inDrag = true;
         this.emit('drag-begin');
-    },
+    }
 
     handleDragOver(source, actor, x, y, time) {
         return this._workspace.handleDragOver(source, actor, x, y, time);
-    },
+    }
 
     acceptDrop(source, actor, x, y, time) {
         this._workspace.acceptDrop(source, actor, x, y, time);
-    },
+    }
 
     _onDragCancelled(draggable, time) {
         this.emit('drag-cancelled');
-    },
+    }
 
     _onDragEnd(draggable, time, snapback) {
         this.inDrag = false;
@@ -438,7 +436,7 @@ var WindowClone = new Lang.Class({
 
         this.emit('drag-end');
     }
-});
+};
 Signals.addSignalMethods(WindowClone.prototype);
 
 
@@ -447,10 +445,8 @@ Signals.addSignalMethods(WindowClone.prototype);
  * @parentActor: The actor which will be the parent of all overlay items
  *               such as app icon and window caption
  */
-var WindowOverlay = new Lang.Class({
-    Name: 'WindowOverlay',
-
-    _init(windowClone, parentActor) {
+var WindowOverlay = class {
+    constructor(windowClone, parentActor) {
         let metaWindow = windowClone.metaWindow;
 
         this._windowClone = windowClone;
@@ -505,37 +501,37 @@ var WindowOverlay = new Lang.Class({
         // the signal will be emitted normally when we are added
         if (parentActor.get_stage())
             this._onStyleChanged();
-    },
+    }
 
     hide() {
         this._hidden = true;
 
         this.hideCloseButton();
-    },
+    }
 
     show() {
         this._hidden = false;
 
         if (this._windowClone.actor['has-pointer'])
             this._animateVisible();
-    },
+    }
 
     chromeHeights() {
         return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap),
                 (this.title.height - this.borderSize) / 2];
-    },
+    }
 
     chromeWidths() {
         return [this.borderSize,
                 Math.max(this.borderSize, this.closeButton.width - this.closeButton._overlap)];
-    },
+    }
 
     setMaxChromeWidth(max) {
         if (this._maxTitleWidth == max)
             return;
 
         this._maxTitleWidth = max;
-    },
+    }
 
     relayout(animate) {
         let button = this.closeButton;
@@ -598,7 +594,7 @@ var WindowOverlay = new Lang.Class({
             this.border.set_position(borderX, borderY);
             this.border.set_size(borderWidth, borderHeight);
         }
-    },
+    }
 
     _getCaption() {
         let metaWindow = this._windowClone.metaWindow;
@@ -608,7 +604,7 @@ var WindowOverlay = new Lang.Class({
         let tracker = Shell.WindowTracker.get_default();
         let app = tracker.get_window_app(metaWindow);
         return app.get_name();
-    },
+    }
 
     _animateOverlayActor(actor, x, y, width, height) {
         let params = { x: x,
@@ -621,12 +617,12 @@ var WindowOverlay = new Lang.Class({
             params.height = height;
 
         Tweener.addTween(actor, params);
-    },
+    }
 
     _windowCanClose() {
         return this._windowClone.metaWindow.can_close() &&
                !this._windowClone.hasAttachedDialogs();
-    },
+    }
 
     _onDestroy() {
         if (this._idleToggleCloseId > 0) {
@@ -637,7 +633,7 @@ var WindowOverlay = new Lang.Class({
         this.title.destroy();
         this.closeButton.destroy();
         this.border.destroy();
-    },
+    }
 
     _animateVisible() {
         this._parentActor.raise_top();
@@ -654,7 +650,7 @@ var WindowOverlay = new Lang.Class({
                                time: CLOSE_BUTTON_FADE_TIME,
                                transition: 'easeOutQuad' });
         });
-    },
+    }
 
     _animateInvisible() {
         [this.closeButton, this.border, this.title].forEach(a => {
@@ -664,7 +660,7 @@ var WindowOverlay = new Lang.Class({
                                time: CLOSE_BUTTON_FADE_TIME,
                                transition: 'easeInQuad' });
         });
-    },
+    }
 
     _onShowChrome() {
         // We might get enter events on the clone while the overlay is
@@ -676,14 +672,14 @@ var WindowOverlay = new Lang.Class({
 
         this._animateVisible();
         this.emit('show-close-button');
-    },
+    }
 
     _onHideChrome() {
         if (this._idleToggleCloseId == 0) {
             this._idleToggleCloseId = Mainloop.timeout_add(750, this._idleToggleCloseButton.bind(this));
             GLib.Source.set_name_by_id(this._idleToggleCloseId, '[gnome-shell] this._idleToggleCloseButton');
         }
-    },
+    }
 
     _idleToggleCloseButton() {
         this._idleToggleCloseId = 0;
@@ -693,7 +689,7 @@ var WindowOverlay = new Lang.Class({
             this._animateInvisible();
 
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     hideCloseButton() {
         if (this._idleToggleCloseId > 0) {
@@ -703,7 +699,7 @@ var WindowOverlay = new Lang.Class({
         this.closeButton.hide();
         this.border.hide();
         this.title.hide();
-    },
+    }
 
     _onStyleChanged() {
         let closeNode = this.closeButton.get_theme_node();
@@ -714,7 +710,7 @@ var WindowOverlay = new Lang.Class({
 
         this._parentActor.queue_relayout();
     }
-});
+};
 Signals.addSignalMethods(WindowOverlay.prototype);
 
 var WindowPositionFlags = {
@@ -797,15 +793,15 @@ var WindowPositionFlags = {
 // each window's "cell" area to be the same, but we shrink the thumbnail
 // and center it horizontally, and align it to the bottom vertically.
 
-var LayoutStrategy = new Lang.Class({
-    Name: 'LayoutStrategy',
-    Abstract: true,
+var LayoutStrategy = class {
+    constructor(monitor, rowSpacing, columnSpacing) {
+        if (new.target === LayoutStrategy)
+            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 
-    _init(monitor, rowSpacing, columnSpacing) {
         this._monitor = monitor;
         this._rowSpacing = rowSpacing;
         this._columnSpacing = columnSpacing;
-    },
+    }
 
     _newRow() {
         // Row properties:
@@ -823,7 +819,7 @@ var LayoutStrategy = new Lang.Class({
                  width: 0, height: 0,
                  fullWidth: 0, fullHeight: 0,
                  windows: [] };
-    },
+    }
 
     // Computes and returns an individual scaling factor for @window,
     // to be applied in addition to the overal layout scale.
@@ -841,7 +837,7 @@ var LayoutStrategy = new Lang.Class({
 
         // Map from [0, 1] to [1.5, 1]
         return _interpolate(1.5, 1, ratio);
-    },
+    }
 
     // Compute the size of each row, by assigning to the properties
     // row.width, row.height, row.fullWidth, row.fullHeight, and
@@ -849,7 +845,7 @@ var LayoutStrategy = new Lang.Class({
     // intended to be called by subclasses.
     _computeRowSizes(layout) {
         throw new Error('_computeRowSizes not implemented');
-    },
+    }
 
     // Compute strategy-specific window slots for each window in
     // @windows, given the @layout. The strategy may also use @layout
@@ -862,7 +858,7 @@ var LayoutStrategy = new Lang.Class({
     //  * rows - A list of rows, which should be instantiated by _newRow.
     computeLayout(windows, layout) {
         throw new Error('computeLayout not implemented');
-    },
+    }
 
     // Given @layout, compute the overall scale and space of the layout.
     // The scale is the individual, non-fancy scale of each window, and
@@ -895,7 +891,7 @@ var LayoutStrategy = new Lang.Class({
 
         layout.scale = scale;
         layout.space = space;
-    },
+    }
 
     computeWindowSlots(layout, area) {
         this._computeRowSizes(layout);
@@ -971,12 +967,9 @@ var LayoutStrategy = new Lang.Class({
         }
         return slots;
     }
-});
-
-var UnalignedLayoutStrategy = new Lang.Class({
-    Name: 'UnalignedLayoutStrategy',
-    Extends: LayoutStrategy,
+};
 
+var UnalignedLayoutStrategy = class extends LayoutStrategy {
     _computeRowSizes(layout) {
         let { rows: rows, scale: scale } = layout;
         for (let i = 0; i < rows.length; i++) {
@@ -984,7 +977,7 @@ var UnalignedLayoutStrategy = new Lang.Class({
             row.width = row.fullWidth * scale + (row.windows.length - 1) * this._columnSpacing;
             row.height = row.fullHeight * scale;
         }
-    },
+    }
 
     _keepSameRow(row, window, width, idealRowWidth) {
         if (row.fullWidth + width <= idealRowWidth)
@@ -997,12 +990,12 @@ var UnalignedLayoutStrategy = new Lang.Class({
             return true;
 
         return false;
-    },
+    }
 
     _sortRow(row) {
         // Sort windows horizontally to minimize travel distance
         row.windows.sort((a, b) => a.realWindow.x - b.realWindow.x);
-    },
+    }
 
     computeLayout(windows, layout) {
         let numRows = layout.numRows;
@@ -1055,7 +1048,7 @@ var UnalignedLayoutStrategy = new Lang.Class({
         layout.gridWidth = maxRow.fullWidth;
         layout.gridHeight = gridHeight;
     }
-});
+};
 
 function padArea(area, padding) {
     return {
@@ -1098,10 +1091,8 @@ const WorkspaceActor = new Lang.Class({
 /**
  * @metaWorkspace: a #Meta.Workspace, or null
  */
-var Workspace = new Lang.Class({
-    Name: 'Workspace',
-
-    _init(metaWorkspace, monitorIndex) {
+var Workspace = class {
+    constructor(metaWorkspace, monitorIndex) {
         // When dragging a window, we use this slot for reserve space.
         this._reservedSlot = null;
         this._reservedSlotWindow = null;
@@ -1174,7 +1165,7 @@ var Workspace = new Lang.Class({
             if (this.actor.mapped)
                 this._syncActualGeometry();
         });
-    },
+    }
 
     setFullGeometry(geom) {
         if (rectEqual(this._fullGeometry, geom))
@@ -1184,7 +1175,7 @@ var Workspace = new Lang.Class({
 
         if (this.actor.mapped)
             this._recalculateWindowPositions(WindowPositionFlags.NONE);
-    },
+    }
 
     setActualGeometry(geom) {
         if (rectEqual(this._actualGeometry, geom))
@@ -1195,7 +1186,7 @@ var Workspace = new Lang.Class({
 
         if (this.actor.mapped)
             this._syncActualGeometry();
-    },
+    }
 
     _syncActualGeometry() {
         if (this._actualGeometryLater || !this._actualGeometryDirty)
@@ -1216,7 +1207,7 @@ var Workspace = new Lang.Class({
 
             return false;
         });
-    },
+    }
 
     _lookupIndex(metaWindow) {
         for (let i = 0; i < this._windows.length; i++) {
@@ -1225,15 +1216,15 @@ var Workspace = new Lang.Class({
             }
         }
         return -1;
-    },
+    }
 
     containsMetaWindow(metaWindow) {
         return this._lookupIndex(metaWindow) >= 0;
-    },
+    }
 
     isEmpty() {
         return this._windows.length == 0;
-    },
+    }
 
     setReservedSlot(metaWindow) {
         if (this._reservedSlotWindow == metaWindow)
@@ -1248,7 +1239,7 @@ var Workspace = new Lang.Class({
         }
 
         this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
-    },
+    }
 
     _recalculateWindowPositions(flags) {
         this._positionWindowsFlags |= flags;
@@ -1262,7 +1253,7 @@ var Workspace = new Lang.Class({
             this._positionWindowsId = 0;
             return false;
         });
-    },
+    }
 
     _realRecalculateWindowPositions(flags) {
         if (this._repositionWindowsId > 0) {
@@ -1283,7 +1274,7 @@ var Workspace = new Lang.Class({
 
         this._currentLayout = this._computeLayout(clones);
         this._updateWindowPositions(flags);
-    },
+    }
 
     _updateWindowPositions(flags) {
         if (this._currentLayout == null) {
@@ -1378,7 +1369,7 @@ var Workspace = new Lang.Class({
                 this._showWindowOverlay(clone, overlay);
             }
         }
-    },
+    }
 
     syncStacking(stackIndices) {
         let clones = this._windows.slice();
@@ -1398,7 +1389,7 @@ var Workspace = new Lang.Class({
                 clone.setStackAbove(previousClone.actor);
             }
         }
-    },
+    }
 
     _animateClone(clone, overlay, x, y, scale) {
         Tweener.addTween(clone.actor,
@@ -1414,7 +1405,7 @@ var Workspace = new Lang.Class({
                          });
 
         clone.overlay.relayout(true);
-    },
+    }
 
     _showWindowOverlay(clone, overlay) {
         if (clone.inDrag)
@@ -1422,7 +1413,7 @@ var Workspace = new Lang.Class({
 
         if (overlay && overlay._hidden)
                 overlay.show();
-    },
+    }
 
     _delayedWindowRepositioning() {
         let [x, y, mask] = global.get_pointer();
@@ -1447,7 +1438,7 @@ var Workspace = new Lang.Class({
         this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
         this._repositionWindowsId = 0;
         return GLib.SOURCE_REMOVE;
-    },
+    }
 
     _doRemoveWindow(metaWin) {
         let win = metaWin.get_compositor_private();
@@ -1493,7 +1484,7 @@ var Workspace = new Lang.Class({
         this._repositionWindowsId = Mainloop.timeout_add(750,
             this._delayedWindowRepositioning.bind(this));
         GLib.Source.set_name_by_id(this._repositionWindowsId, '[gnome-shell] 
this._delayedWindowRepositioning');
-    },
+    }
 
     _doAddWindow(metaWin) {
         if (this.leavingOverview)
@@ -1556,27 +1547,27 @@ var Workspace = new Lang.Class({
 
         this._currentLayout = null;
         this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
-    },
+    }
 
     _windowAdded(metaWorkspace, metaWin) {
         this._doAddWindow(metaWin);
-    },
+    }
 
     _windowRemoved(metaWorkspace, metaWin) {
         this._doRemoveWindow(metaWin);
-    },
+    }
 
     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) {
         if (monitorIndex == this.monitorIndex) {
             this._doAddWindow(metaWin);
         }
-    },
+    }
 
     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) {
         if (monitorIndex == this.monitorIndex) {
             this._doRemoveWindow(metaWin);
         }
-    },
+    }
 
     // check for maximized windows on the workspace
     hasMaximizedWindows() {
@@ -1588,7 +1579,7 @@ var Workspace = new Lang.Class({
                 return true;
         }
         return false;
-    },
+    }
 
     fadeToOverview() {
         // We don't want to reposition windows while animating in this way.
@@ -1637,7 +1628,7 @@ var Workspace = new Lang.Class({
                 this._fadeWindow(i, time, 0);
             }
         }
-    },
+    }
 
     fadeFromOverview() {
         this.leavingOverview = true;
@@ -1695,7 +1686,7 @@ var Workspace = new Lang.Class({
                 this._fadeWindow(i, time, 255);
             }
         }
-    },
+    }
 
     _fadeWindow(index, time, opacity) {
         let clone = this._windows[index];
@@ -1719,12 +1710,12 @@ var Workspace = new Lang.Class({
             // The window is hidden
             clone.actor.opacity = 0;
         }
-    },
+    }
 
     zoomToOverview() {
         // Position and scale the windows.
         this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
-    },
+    }
 
     zoomFromOverview() {
         let workspaceManager = global.workspace_manager;
@@ -1749,7 +1740,7 @@ var Workspace = new Lang.Class({
         // Position and scale the windows.
         for (let i = 0; i < this._windows.length; i++)
            this._zoomWindowFromOverview(i);
-    },
+    }
 
     _zoomWindowFromOverview(index) {
         let clone = this._windows[index];
@@ -1779,11 +1770,11 @@ var Workspace = new Lang.Class({
                                transition: 'easeOutQuad'
                              });
         }
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     _onDestroy(actor) {
         if (this._overviewHiddenId) {
@@ -1815,29 +1806,29 @@ var Workspace = new Lang.Class({
         }
 
         this._windows = [];
-    },
+    }
 
     // Sets this.leavingOverview flag to false.
     _doneLeavingOverview() {
         this.leavingOverview = false;
-    },
+    }
 
     _doneShowingOverview() {
         this._animatingWindowsFade = false;
         this._recalculateWindowPositions(WindowPositionFlags.INITIAL);
-    },
+    }
 
     // Tests if @actor belongs to this workspaces and monitor
     _isMyWindow(actor) {
         let win = actor.meta_window;
         return (this.metaWorkspace == null || win.located_on_workspace(this.metaWorkspace)) &&
             (win.get_monitor() == this.monitorIndex);
-    },
+    }
 
     // Tests if @win should be shown in the Overview
     _isOverviewWindow(win) {
         return !win.get_meta_window().skip_taskbar;
-    },
+    }
 
     // Create a clone of a (non-desktop) window and add it to the window list
     _addWindowClone(win, positioned) {
@@ -1884,7 +1875,7 @@ var Workspace = new Lang.Class({
         this._windowOverlays.push(overlay);
 
         return [clone, overlay];
-    },
+    }
 
     _removeWindowClone(metaWin) {
         // find the position of the window in our list
@@ -1895,7 +1886,7 @@ var Workspace = new Lang.Class({
 
         this._windowOverlays.splice(index, 1);
         return this._windows.splice(index, 1).pop();
-    },
+    }
 
     _onShowOverlayClose(windowOverlay) {
         for (let i = 0; i < this._windowOverlays.length; i++) {
@@ -1904,7 +1895,7 @@ var Workspace = new Lang.Class({
                 continue;
             overlay.hideCloseButton();
         }
-    },
+    }
 
     _isBetterLayout(oldLayout, newLayout) {
         if (oldLayout.scale === undefined)
@@ -1926,7 +1917,7 @@ var Workspace = new Lang.Class({
             // Lose -- worse scale and space
             return false;
         }
-    },
+    }
 
     _getBestLayout(windows, area, rowSpacing, columnSpacing) {
         // We look for the largest scale that allows us to fit the
@@ -1956,7 +1947,7 @@ var Workspace = new Lang.Class({
         }
 
         return lastLayout;
-    },
+    }
 
     _getSpacingAndPadding() {
         let node = this.actor.get_theme_node();
@@ -1985,20 +1976,20 @@ var Workspace = new Lang.Class({
         padding.right += rightBorder;
 
         return [rowSpacing, columnSpacing, padding];
-    },
+    }
 
     _computeLayout(windows) {
         let [rowSpacing, columnSpacing, padding] = this._getSpacingAndPadding();
         let area = padArea(this._fullGeometry, padding);
         return this._getBestLayout(windows, area, rowSpacing, columnSpacing);
-    },
+    }
 
     _onCloneSelected(clone, time) {
         let wsIndex = undefined;
         if (this.metaWorkspace)
             wsIndex = this.metaWorkspace.index();
         Main.activateWindow(clone.metaWindow, time, wsIndex);
-    },
+    }
 
     // Draggable target interface
     handleDragOver(source, actor, x, y, time) {
@@ -2008,7 +1999,7 @@ var Workspace = new Lang.Class({
             return DND.DragMotionResult.COPY_DROP;
 
         return DND.DragMotionResult.CONTINUE;
-    },
+    }
 
     acceptDrop(source, actor, x, y, time) {
         if (source.realWindow) {
@@ -2044,6 +2035,5 @@ var Workspace = new Lang.Class({
 
         return false;
     }
-});
-
+};
 Signals.addSignalMethods(Workspace.prototype);
diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js
index ac187bbe3..386a29fe0 100644
--- a/js/ui/workspaceThumbnail.js
+++ b/js/ui/workspaceThumbnail.js
@@ -54,10 +54,8 @@ var PrimaryActorLayout = new Lang.Class({
     },
 });
 
-var WindowClone = new Lang.Class({
-    Name: 'WindowClone',
-
-    _init(realWindow) {
+var WindowClone = class {
+    constructor(realWindow) {
         this.clone = new Clutter.Clone({ source: realWindow });
 
         /* Can't use a Shell.GenericContainer because of DND and reparenting... */
@@ -108,7 +106,7 @@ var WindowClone = new Lang.Class({
             return true;
         };
         this.metaWindow.foreach_transient(iter);
-    },
+    }
 
     // Find the actor just below us, respecting reparenting done
     // by DND code
@@ -124,7 +122,7 @@ var WindowClone = new Lang.Class({
         } else {
             return this._stackAbove;
         }
-    },
+    }
 
     setStackAbove(actor) {
         this._stackAbove = actor;
@@ -139,15 +137,15 @@ var WindowClone = new Lang.Class({
             this.actor.lower_bottom();
         else
             this.actor.raise(actualAbove);
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     addAttachedDialog(win) {
         this._doAddAttachedDialog(win, win.get_compositor_private());
-    },
+    }
 
     _doAddAttachedDialog(metaDialog, realDialog) {
         let clone = new Clutter.Clone({ source: realDialog });
@@ -160,7 +158,7 @@ var WindowClone = new Lang.Class({
             clone.destroy();
         });
         this.actor.add_child(clone);
-    },
+    }
 
     _updateDialogPosition(realDialog, cloneDialog) {
         let metaDialog = realDialog.meta_window;
@@ -168,11 +166,11 @@ var WindowClone = new Lang.Class({
         let rect = this.metaWindow.get_frame_rect();
 
         cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y);
-    },
+    }
 
     _onPositionChanged() {
         this.actor.set_position(this.realWindow.x, this.realWindow.y);
-    },
+    }
 
     _disconnectSignals() {
         this.actor.get_children().forEach(child => {
@@ -181,7 +179,7 @@ var WindowClone = new Lang.Class({
             realWindow.disconnect(child._updateId);
             realWindow.disconnect(child._destroyId);
         });
-    },
+    }
 
     _onDestroy() {
         this._disconnectSignals();
@@ -194,13 +192,13 @@ var WindowClone = new Lang.Class({
         }
 
         this.disconnectAll();
-    },
+    }
 
     _onButtonRelease(actor, event) {
         this.emit('selected', event.get_time());
 
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onTouchEvent(actor, event) {
         if (event.type() != Clutter.EventType.TOUCH_END ||
@@ -209,16 +207,16 @@ var WindowClone = new Lang.Class({
 
         this.emit('selected', event.get_time());
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onDragBegin(draggable, time) {
         this.inDrag = true;
         this.emit('drag-begin');
-    },
+    }
 
     _onDragCancelled(draggable, time) {
         this.emit('drag-cancelled');
-    },
+    }
 
     _onDragEnd(draggable, time, snapback) {
         this.inDrag = false;
@@ -236,7 +234,7 @@ var WindowClone = new Lang.Class({
 
         this.emit('drag-end');
     }
-});
+};
 Signals.addSignalMethods(WindowClone.prototype);
 
 
@@ -254,10 +252,8 @@ var ThumbnailState = {
 /**
  * @metaWorkspace: a #Meta.Workspace
  */
-var WorkspaceThumbnail = new Lang.Class({
-    Name: 'WorkspaceThumbnail',
-
-    _init(metaWorkspace) {
+var WorkspaceThumbnail = class {
+    constructor(metaWorkspace) {
         this.metaWorkspace = metaWorkspace;
         this.monitorIndex = Main.layoutManager.primaryIndex;
 
@@ -311,18 +307,18 @@ var WorkspaceThumbnail = new Lang.Class({
         this.state = ThumbnailState.NORMAL;
         this._slidePosition = 0; // Fully slid in
         this._collapseFraction = 0; // Not collapsed
-    },
+    }
 
     _createBackground() {
         this._bgManager = new Background.BackgroundManager({ monitorIndex: Main.layoutManager.primaryIndex,
                                                              container: this._contents,
                                                              vignette: false });
-    },
+    }
 
     setPorthole(x, y, width, height) {
         this.actor.set_size(width, height);
         this._contents.set_position(-x, -y);
-    },
+    }
 
     _lookupIndex(metaWindow) {
         for (let i = 0; i < this._windows.length; i++) {
@@ -331,7 +327,7 @@ var WorkspaceThumbnail = new Lang.Class({
             }
         }
         return -1;
-    },
+    }
 
     syncStacking(stackIndices) {
         this._windows.sort((a, b) => {
@@ -350,31 +346,31 @@ var WorkspaceThumbnail = new Lang.Class({
                 clone.setStackAbove(previousClone.actor);
             }
         }
-    },
+    }
 
     set slidePosition(slidePosition) {
         this._slidePosition = slidePosition;
         this.actor.queue_relayout();
-    },
+    }
 
     get slidePosition() {
         return this._slidePosition;
-    },
+    }
 
     set collapseFraction(collapseFraction) {
         this._collapseFraction = collapseFraction;
         this.actor.queue_relayout();
-    },
+    }
 
     get collapseFraction() {
         return this._collapseFraction;
-    },
+    }
 
     _doRemoveWindow(metaWin) {
         let clone = this._removeWindowClone(metaWin);
         if (clone)
             clone.destroy();
-    },
+    }
 
     _doAddWindow(metaWin) {
         if (this._removed)
@@ -428,11 +424,11 @@ var WorkspaceThumbnail = new Lang.Class({
             let clone = this._windows[idx];
             clone.addAttachedDialog(metaWin);
         }
-    },
+    }
 
     _windowAdded(metaWorkspace, metaWin) {
         this._doAddWindow(metaWin);
-    },
+    }
 
     _windowRemoved(metaWorkspace, metaWin) {
         let index = this._allWindows.indexOf(metaWin);
@@ -443,31 +439,31 @@ var WorkspaceThumbnail = new Lang.Class({
         }
 
         this._doRemoveWindow(metaWin);
-    },
+    }
 
     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) {
         if (monitorIndex == this.monitorIndex) {
             this._doAddWindow(metaWin);
         }
-    },
+    }
 
     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) {
         if (monitorIndex == this.monitorIndex) {
             this._doRemoveWindow(metaWin);
         }
-    },
+    }
 
     _updateMinimized(metaWin) {
         if (metaWin.minimized)
             this._doRemoveWindow(metaWin);
         else
             this._doAddWindow(metaWin);
-    },
+    }
 
     destroy() {
         if (this.actor)
           this.actor.destroy();
-    },
+    }
 
     workspaceRemoved() {
         if (this._removed)
@@ -482,7 +478,7 @@ var WorkspaceThumbnail = new Lang.Class({
 
         for (let i = 0; i < this._allWindows.length; i++)
             this._allWindows[i].disconnect(this._minimizedChangedIds[i]);
-    },
+    }
 
     _onDestroy(actor) {
         this.workspaceRemoved();
@@ -494,20 +490,20 @@ var WorkspaceThumbnail = new Lang.Class({
 
         this._windows = [];
         this.actor = null;
-    },
+    }
 
     // Tests if @actor belongs to this workspace and monitor
     _isMyWindow(actor) {
         let win = actor.meta_window;
         return win.located_on_workspace(this.metaWorkspace) &&
             (win.get_monitor() == this.monitorIndex);
-    },
+    }
 
     // Tests if @win should be shown in the Overview
     _isOverviewWindow(win) {
         return !win.get_meta_window().skip_taskbar &&
                win.get_meta_window().showing_on_its_workspace();
-    },
+    }
 
     // Create a clone of a (non-desktop) window and add it to the window list
     _addWindowClone(win) {
@@ -538,7 +534,7 @@ var WorkspaceThumbnail = new Lang.Class({
         this._windows.push(clone);
 
         return clone;
-    },
+    }
 
     _removeWindowClone(metaWin) {
         // find the position of the window in our list
@@ -548,7 +544,7 @@ var WorkspaceThumbnail = new Lang.Class({
             return null;
 
         return this._windows.splice(index, 1).pop();
-    },
+    }
 
     activate(time) {
         if (this.state > ThumbnailState.NORMAL)
@@ -561,7 +557,7 @@ var WorkspaceThumbnail = new Lang.Class({
             Main.overview.hide();
         else
             this.metaWorkspace.activate(time);
-    },
+    }
 
     // Draggable target interface used only by ThumbnailsBox
     handleDragOverInternal(source, time) {
@@ -579,7 +575,7 @@ var WorkspaceThumbnail = new Lang.Class({
             return DND.DragMotionResult.COPY_DROP;
 
         return DND.DragMotionResult.CONTINUE;
-    },
+    }
 
     acceptDropInternal(source, time) {
         if (this.state > ThumbnailState.NORMAL)
@@ -608,8 +604,7 @@ var WorkspaceThumbnail = new Lang.Class({
 
         return false;
     }
-});
-
+};
 Signals.addSignalMethods(WorkspaceThumbnail.prototype);
 
 
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index 47993e393..228c3f81b 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -26,10 +26,8 @@ var AnimationType = {
 
 const MUTTER_SCHEMA = 'org.gnome.mutter';
 
-var WorkspacesViewBase = new Lang.Class({
-    Name: 'WorkspacesViewBase',
-
-    _init(monitorIndex) {
+var WorkspacesViewBase = class {
+    constructor(monitorIndex) {
         this.actor = new St.Widget({ style_class: 'workspaces-view',
                                      reactive: true });
         this.actor.connect('destroy', this._onDestroy.bind(this));
@@ -46,7 +44,7 @@ var WorkspacesViewBase = new Lang.Class({
         this._inDrag = false;
         this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
         this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
-    },
+    }
 
     _onDestroy() {
         this._dragEnd();
@@ -59,41 +57,38 @@ var WorkspacesViewBase = new Lang.Class({
             Main.overview.disconnect(this._windowDragEndId);
             this._windowDragEndId = 0;
         }
-    },
+    }
 
     _dragBegin(overview, window) {
         this._inDrag = true;
         this._setReservedSlot(window);
-    },
+    }
 
     _dragEnd() {
         this._inDrag = false;
         this._setReservedSlot(null);
-    },
+    }
 
     destroy() {
         this.actor.destroy();
-    },
+    }
 
     setFullGeometry(geom) {
         this._fullGeometry = geom;
         this._syncFullGeometry();
-    },
+    }
 
     setActualGeometry(geom) {
         this._actualGeometry = geom;
         this._syncActualGeometry();
-    },
-});
-
-var WorkspacesView = new Lang.Class({
-    Name: 'WorkspacesView',
-    Extends: WorkspacesViewBase,
+    }
+};
 
-    _init(monitorIndex) {
+var WorkspacesView = class extends WorkspacesViewBase {
+    constructor(monitorIndex) {
         let workspaceManager = global.workspace_manager;
 
-        this.parent(monitorIndex);
+        super(monitorIndex);
 
         this._animating = false; // tweening
         this._scrolling = false; // swipe-scrolling
@@ -124,28 +119,28 @@ var WorkspacesView = new Lang.Class({
         this._switchWorkspaceNotifyId =
             global.window_manager.connect('switch-workspace',
                                           this._activeWorkspaceChanged.bind(this));
-    },
+    }
 
     _setReservedSlot(window) {
         for (let i = 0; i < this._workspaces.length; i++)
             this._workspaces[i].setReservedSlot(window);
-    },
+    }
 
     _syncFullGeometry() {
         for (let i = 0; i < this._workspaces.length; i++)
             this._workspaces[i].setFullGeometry(this._fullGeometry);
-    },
+    }
 
     _syncActualGeometry() {
         for (let i = 0; i < this._workspaces.length; i++)
             this._workspaces[i].setActualGeometry(this._actualGeometry);
-    },
+    }
 
     getActiveWorkspace() {
         let workspaceManager = global.workspace_manager;
         let active = workspaceManager.get_active_workspace_index();
         return this._workspaces[active];
-    },
+    }
 
     animateToOverview(animationType) {
         for (let w = 0; w < this._workspaces.length; w++) {
@@ -155,7 +150,7 @@ var WorkspacesView = new Lang.Class({
                 this._workspaces[w].fadeToOverview();
         }
         this._updateWorkspaceActors(false);
-    },
+    }
 
     animateFromOverview(animationType) {
         this.actor.remove_clip();
@@ -166,12 +161,12 @@ var WorkspacesView = new Lang.Class({
             else
                 this._workspaces[w].fadeFromOverview();
         }
-    },
+    }
 
     syncStacking(stackIndices) {
         for (let i = 0; i < this._workspaces.length; i++)
             this._workspaces[i].syncStacking(stackIndices);
-    },
+    }
 
     _scrollToActive() {
         let workspaceManager = global.workspace_manager;
@@ -179,7 +174,7 @@ var WorkspacesView = new Lang.Class({
 
         this._updateWorkspaceActors(true);
         this._updateScrollAdjustment(active);
-    },
+    }
 
     // Update workspace actors parameters
     // @showAnimation: iff %true, transition between states
@@ -218,7 +213,7 @@ var WorkspacesView = new Lang.Class({
                     this._updateVisibility();
             }
         }
-    },
+    }
 
     _updateVisibility() {
         let workspaceManager = global.workspace_manager;
@@ -235,7 +230,7 @@ var WorkspacesView = new Lang.Class({
                     workspace.actor.visible = (w == active);
             }
         }
-    },
+    }
 
     _updateScrollAdjustment(index) {
         if (this._scrolling)
@@ -251,7 +246,7 @@ var WorkspacesView = new Lang.Class({
                 this._animatingScroll = false;
             }
         });
-    },
+    }
 
     _updateWorkspaces() {
         let workspaceManager = global.workspace_manager;
@@ -284,28 +279,28 @@ var WorkspacesView = new Lang.Class({
         }
         if (this._actualGeometry)
             this._syncActualGeometry();
-    },
+    }
 
     _activeWorkspaceChanged(wm, from, to, direction) {
         if (this._scrolling)
             return;
 
         this._scrollToActive();
-    },
+    }
 
     _onDestroy() {
-        this.parent();
+        super._onDestroy();
 
         this.scrollAdjustment.run_dispose();
         Main.overview.disconnect(this._overviewShownId);
         global.window_manager.disconnect(this._switchWorkspaceNotifyId);
         let workspaceManager = global.workspace_manager;
         workspaceManager.disconnect(this._updateWorkspacesId);
-    },
+    }
 
     startSwipeScroll() {
         this._scrolling = true;
-    },
+    }
 
     endSwipeScroll() {
         this._scrolling = false;
@@ -313,7 +308,7 @@ var WorkspacesView = new Lang.Class({
         // Make sure title captions etc are shown as necessary
         this._scrollToActive();
         this._updateVisibility();
-    },
+    }
 
     // sync the workspaces' positions to the value of the scroll adjustment
     // and change the active workspace if appropriate
@@ -356,59 +351,57 @@ var WorkspacesView = new Lang.Class({
             this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1;
             this._workspaces[i].actor.y += dy;
         }
-    },
-});
+    }
+};
 Signals.addSignalMethods(WorkspacesView.prototype);
 
-var ExtraWorkspaceView = new Lang.Class({
-    Name: 'ExtraWorkspaceView',
-    Extends: WorkspacesViewBase,
-
-    _init(monitorIndex) {
-        this.parent(monitorIndex);
+var ExtraWorkspaceView = class extends WorkspacesViewBase {
+    constructor(monitorIndex) {
+        super(monitorIndex);
         this._workspace = new Workspace.Workspace(null, monitorIndex);
         this.actor.add_actor(this._workspace.actor);
-    },
+    }
 
     _setReservedSlot(window) {
         this._workspace.setReservedSlot(window);
-    },
+    }
 
     _syncFullGeometry() {
         this._workspace.setFullGeometry(this._fullGeometry);
-    },
+    }
 
     _syncActualGeometry() {
         this._workspace.setActualGeometry(this._actualGeometry);
-    },
+    }
 
     getActiveWorkspace() {
         return this._workspace;
-    },
+    }
 
     animateToOverview(animationType) {
         if (animationType == AnimationType.ZOOM)
             this._workspace.zoomToOverview();
         else
             this._workspace.fadeToOverview();
-    },
+    }
 
     animateFromOverview(animationType) {
         if (animationType == AnimationType.ZOOM)
             this._workspace.zoomFromOverview();
         else
             this._workspace.fadeFromOverview();
-    },
+    }
 
     syncStacking(stackIndices) {
         this._workspace.syncStacking(stackIndices);
-    },
+    }
 
     startSwipeScroll() {
-    },
+    }
+
     endSwipeScroll() {
-    },
-});
+    }
+};
 
 var DelegateFocusNavigator = new Lang.Class({
     Name: 'DelegateFocusNavigator',
@@ -419,10 +412,8 @@ var DelegateFocusNavigator = new Lang.Class({
     },
 });
 
-var WorkspacesDisplay = new Lang.Class({
-    Name: 'WorkspacesDisplay',
-
-    _init() {
+var WorkspacesDisplay = class {
+    constructor() {
         this.actor = new DelegateFocusNavigator({ clip_to_allocation: true });
         this.actor._delegate = this;
         this.actor.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this));
@@ -486,18 +477,18 @@ var WorkspacesDisplay = new Lang.Class({
         this._keyPressEventId = 0;
 
         this._fullGeometry = null;
-    },
+    }
 
     _onPan(action) {
         let [dist, dx, dy] = action.get_motion_delta(0);
         let adjustment = this._scrollAdjustment;
         adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
         return false;
-    },
+    }
 
     navigateFocus(from, direction) {
         return this._getPrimaryView().actor.navigate_focus(from, direction, false);
-    },
+    }
 
     show(fadeOnPrimary) {
         this._updateWorkspacesViews();
@@ -518,7 +509,7 @@ var WorkspacesDisplay = new Lang.Class({
 
         if (this._keyPressEventId == 0)
             this._keyPressEventId = global.stage.connect('key-press-event', 
this._onKeyPressEvent.bind(this));
-    },
+    }
 
     animateFromOverview(fadeOnPrimary) {
         for (let i = 0; i < this._workspacesViews.length; i++) {
@@ -529,7 +520,7 @@ var WorkspacesDisplay = new Lang.Class({
                 animationType = AnimationType.ZOOM;
             this._workspacesViews[i].animateFromOverview(animationType);
         }
-    },
+    }
 
     hide() {
         if (this._restackedNotifyId > 0){
@@ -547,7 +538,7 @@ var WorkspacesDisplay = new Lang.Class({
         for (let i = 0; i < this._workspacesViews.length; i++)
             this._workspacesViews[i].destroy();
         this._workspacesViews = [];
-    },
+    }
 
     _workspacesOnlyOnPrimaryChanged() {
         this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary');
@@ -556,7 +547,7 @@ var WorkspacesDisplay = new Lang.Class({
             return;
 
         this._updateWorkspacesViews();
-    },
+    }
 
     _updateWorkspacesViews() {
         for (let i = 0; i < this._workspacesViews.length; i++)
@@ -585,7 +576,7 @@ var WorkspacesDisplay = new Lang.Class({
 
         this._updateWorkspacesFullGeometry();
         this._updateWorkspacesActualGeometry();
-    },
+    }
 
     _scrollValueChanged() {
         for (let i = 0; i < this._workspacesViews.length; i++) {
@@ -600,23 +591,23 @@ var WorkspacesDisplay = new Lang.Class({
             // values map directly
             adjustment.value = this._scrollAdjustment.value;
         }
-    },
+    }
 
     _getMonitorIndexForEvent(event) {
         let [x, y] = event.get_coords();
         let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 });
         return global.display.get_monitor_index_for_rect(rect);
-    },
+    }
 
     _getPrimaryView() {
         if (!this._workspacesViews.length)
             return null;
         return this._workspacesViews[this._primaryIndex];
-    },
+    }
 
     activeWorkspaceHasMaximizedWindows() {
         return this._getPrimaryView().getActiveWorkspace().hasMaximizedWindows();
-    },
+    }
 
     _parentSet(actor, oldParent) {
         if (oldParent && this._notifyOpacityId)
@@ -640,7 +631,7 @@ var WorkspacesDisplay = new Lang.Class({
                 primaryView.actor.visible = opacity != 0;
             });
         });
-    },
+    }
 
     // This geometry should always be the fullest geometry
     // the workspaces switcher can ever be allocated, as if
@@ -648,7 +639,7 @@ var WorkspacesDisplay = new Lang.Class({
     setWorkspacesFullGeometry(geom) {
         this._fullGeometry = geom;
         this._updateWorkspacesFullGeometry();
-    },
+    }
 
     _updateWorkspacesFullGeometry() {
         if (!this._workspacesViews.length)
@@ -659,7 +650,7 @@ var WorkspacesDisplay = new Lang.Class({
             let geometry = (i == this._primaryIndex) ? this._fullGeometry : monitors[i];
             this._workspacesViews[i].setFullGeometry(geometry);
         }
-    },
+    }
 
     _updateWorkspacesActualGeometry() {
         if (!this._workspacesViews.length)
@@ -676,12 +667,12 @@ var WorkspacesDisplay = new Lang.Class({
             let geometry = (i == this._primaryIndex) ? primaryGeometry : monitors[i];
             this._workspacesViews[i].setActualGeometry(geometry);
         }
-    },
+    }
 
     _onRestacked(overview, stackIndices) {
         for (let i = 0; i < this._workspacesViews.length; i++)
             this._workspacesViews[i].syncStacking(stackIndices);
-    },
+    }
 
     _onScrollEvent(actor, event) {
         if (!this.actor.mapped)
@@ -706,7 +697,7 @@ var WorkspacesDisplay = new Lang.Class({
         }
         Main.wm.actionMoveWorkspace(ws);
         return Clutter.EVENT_STOP;
-    },
+    }
 
     _onKeyPressEvent(actor, event) {
         if (!this.actor.mapped)
@@ -727,5 +718,5 @@ var WorkspacesDisplay = new Lang.Class({
         Main.wm.actionMoveWorkspace(ws);
         return Clutter.EVENT_STOP;
     }
-});
+};
 Signals.addSignalMethods(WorkspacesDisplay.prototype);
diff --git a/js/ui/xdndHandler.js b/js/ui/xdndHandler.js
index 9fc284c33..af968f42b 100644
--- a/js/ui/xdndHandler.js
+++ b/js/ui/xdndHandler.js
@@ -1,17 +1,14 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
-const Lang = imports.lang;
 const Main = imports.ui.main;
 const Meta = imports.gi.Meta;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 const DND = imports.ui.dnd;
 
-var XdndHandler = new Lang.Class({
-    Name: 'XdndHandler',
-
-    _init() {
+var XdndHandler = class {
+    constructor() {
         // Used to display a clone of the cursor window when the
         // window group is hidden (like it happens in the overview)
         this._cursorWindowClone = null;
@@ -30,7 +27,7 @@ var XdndHandler = new Lang.Class({
         dnd.connect('dnd-leave', this._onLeave.bind(this));
 
         this._windowGroupVisibilityHandlerId = 0;
-    },
+    }
 
     // Called when the user cancels the drag (i.e release the button)
     _onLeave() {
@@ -44,7 +41,7 @@ var XdndHandler = new Lang.Class({
         }
 
         this.emit('drag-end');
-    },
+    }
 
     _onEnter() {
         this._windowGroupVisibilityHandlerId  =
@@ -52,7 +49,7 @@ var XdndHandler = new Lang.Class({
                     this._onWindowGroupVisibilityChanged.bind(this));
 
         this.emit('drag-begin', global.get_current_time());
-    },
+    }
 
     _onWindowGroupVisibilityChanged() {
         if (!global.window_group.visible) {
@@ -80,7 +77,7 @@ var XdndHandler = new Lang.Class({
                 this._cursorWindowClone = null;
             }
         }
-    },
+    }
 
     _onPositionChanged(obj, x, y) {
         let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
@@ -120,6 +117,5 @@ var XdndHandler = new Lang.Class({
                 pickedActor = pickedActor.get_parent();
         }
     }
-});
-
+};
 Signals.addSignalMethods(XdndHandler.prototype);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]