--- a/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js
+++ b/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js
@@ -1,9 +1,10 @@
 const Applet = imports.ui.applet;
-const Gkbd = imports.gi.Gkbd;
 const Lang = imports.lang;
-const Cinnamon = imports.gi.Cinnamon;
+const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
 const St = imports.gi.St;
 const Gtk = imports.gi.Gtk;
+const CinnamonDesktop = imports.gi.CinnamonDesktop;
 const Main = imports.ui.main;
 const PopupMenu = imports.ui.popupMenu;
 const Util = imports.misc.util;
@@ -16,11 +17,12 @@ function LayoutMenuItem() {
 LayoutMenuItem.prototype = {
     __proto__: PopupMenu.PopupBaseMenuItem.prototype,
 
-    _init: function(config, id, indicator, long_name) {
+    _init: function(ipsettings, id, index, indicator, long_name) {
         PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
 
-        this._config = config;
+        this._ipsettings = ipsettings;
         this._id = id;
+        this._index = index;
         this.label = new St.Label({ text: long_name });
         this.indicator = indicator;
         this.addActor(this.label);
@@ -29,7 +31,7 @@ LayoutMenuItem.prototype = {
 
     activate: function(event) {
         PopupMenu.PopupBaseMenuItem.prototype.activate.call(this);
-        this._config.lock_group(this._id);
+        this._ipsettings.set_value('current', GLib.Variant.new_uint32(this._index));
     }
 };
 
@@ -62,18 +64,18 @@ MyApplet.prototype = {
                                        this._syncConfig,
                                        null);
 
-            this._config = Gkbd.Configuration.get();
-            this._config.connect('changed', Lang.bind(this, this._syncConfig));
-            this._config.connect('group-changed', Lang.bind(this, this._syncGroup));
+            this._xkbInfo = new CinnamonDesktop.XkbInfo();
+            this._ipsettings = new Gio.Settings({ schema: 'org.cinnamon.desktop.input-sources' });
+            this._ipsettings.connect('changed::sources', Lang.bind(this, this._syncConfig));
+            this._ipsettings.connect('changed::current', Lang.bind(this, this._syncGroup));
 
-            this._config.start_listen();
 
             this._syncConfig();
 
             this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
             this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() {
                 Main.overview.hide();
-                Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
+                Util.spawn(['gkbd-keyboard-display', '-l', this._selectedLayout._id]);
             }));                                
             this.menu.addAction(_("Show Character Table"), Lang.bind(this, function() {
                 Main.overview.hide();
@@ -113,8 +115,8 @@ MyApplet.prototype = {
     },
 
     _syncConfig: function() {
-        let groups = this._config.get_group_names();
-        if (groups.length > 1) {
+        let sources = this._ipsettings.get_value('sources');
+        if (sources.n_children() > 1) {
             this.actor.show();
         } else {
             this.menu.close();
@@ -127,25 +129,30 @@ MyApplet.prototype = {
         for (let i = 0; i < this._labelActors.length; i++)
             this._labelActors[i].destroy();
 
-        let short_names = this._adjustGroupNames(this._config.get_short_group_names());
 
         this._selectedLayout = null;
         this._layoutItems = [ ];
         this._labelActors = [ ];
-        for (let i = 0; i < groups.length; i++) {
-            let icon_name = this._config.get_group_name(i);
+        for (let i = 0; i < sources.n_children(); i++) {
+            let [type, id] = sources.get_child_value(i).deep_unpack();
+            let displayName = id;
+            let shortName = id;
+            let xkbLayout = id;
+            if (type == 'xkb') {
+                [_exists, displayName, shortName, xkbLayout, _xkbVariant] = this._xkbInfo.get_layout_info(id);
+            } // TODO: errorhandling, handle 'ibus'
+            let icon_name = xkbLayout; // FIXME: Really?
             let actor;
             if (this._showFlags)
                 actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.FULLCOLOR, style_class: 'popup-menu-icon' });
             else
-                actor = new St.Label({ text: short_names[i] });
-            let item = new LayoutMenuItem(this._config, i, actor, groups[i]);
-            item._short_group_name = short_names[i];
+                actor = new St.Label({ text: shortName });
+            let item = new LayoutMenuItem(this._ipsettings, id, i, actor, displayName);
             item._icon_name = icon_name;
             this._layoutItems.push(item);
             this.menu.addMenuItem(item, i);
 
-            let shortLabel = new St.Label({ text: short_names[i] });
+            let shortLabel = new St.Label({ text: shortName });
             this._labelActors.push(shortLabel);
         }
 
@@ -153,17 +160,17 @@ MyApplet.prototype = {
     },
 
     _syncGroup: function() {
-        let selected = this._config.get_current_group();
+        let current = this._ipsettings.get_uint('current');
 
         if (this._selectedLayout) {
             this._selectedLayout.setShowDot(false);
             this._selectedLayout = null;
         }
 
-        let item = this._layoutItems[selected];
+        let item = this._layoutItems[current];
         item.setShowDot(true);
 
-        let selectedLabel = this._labelActors[selected];
+        let selectedLabel = this._labelActors[current];
 
         if (this._showFlags) {
             this.set_applet_icon_name(item._icon_name);
