diff --git a/themes/antergos/index.html b/themes/antergos/index.html
index ab718f8..0fc8a0d 100644
--- a/themes/antergos/index.html
+++ b/themes/antergos/index.html
@@ -50,8 +50,8 @@
 	
 
 	
-	
-	
+	
+	
 
 
 
diff --git a/themes/antergos/js/greeter.js b/themes/antergos/js/greeter.js
index 7948f7b..5033561 100644
--- a/themes/antergos/js/greeter.js
+++ b/themes/antergos/js/greeter.js
@@ -182,36 +182,28 @@ class AntergosThemeUtils {
 	 * Get some values from `lightdm-webkit2-greeter.conf` and save them for later.
 	 */
 	init_config_values() {
-		var logo, user_image, debug, background_images, background_images_dir;
-
-		if ( 'undefined' !== typeof( config ) ) {
-
-			logo = config.get_str( 'branding', 'logo' ) || 'img/antergos.png';
-			user_image = config.get_str( 'branding', 'user_image' ) || 'img/antergos-logo-user.png';
-			background_images_dir = config.get_str( 'branding', 'background_images' ) || '/usr/share/backgrounds';
-			debug = config.get_bool( 'greeter', 'debug_mode' ) || false;
+		if ( 'undefined' === typeof( greeter_config ) ) {
+			greeter_config = {branding: {}, greeter: {}};
+		}
 
-			if ( background_images_dir ) {
-				background_images = greeterutil.dirlist( background_images_dir ) || [];
-				_util.log(background_images);
-			}
+		this.logo                  = greeter_config.branding.logo || 'img/antergos.png';
+		this.user_image            = greeter_config.branding.user_image || 'img/antergos-logo-user.png';
+		this.background_images_dir = greeter_config.branding.background_images || '/usr/share/backgrounds';
+		this.debug                 = greeter_config.greeter.debug_mode || false;
+		this.background_images     = [];
 
-			if ( background_images && background_images.length ) {
-				background_images = this.find_images( background_images );
-			}
+		if ( this.background_images_dir ) {
+			theme_utils.dirlist( this.background_images_dir, true, ( result ) => {
+				this.background_images = result || [];
 
+				_util.log( this.background_images );
+			} );
 		}
-
-		this.logo = logo;
-		this.debug = debug;
-		this.user_image = user_image;
-		this.background_images = background_images;
-		this.background_images_dir = background_images_dir;
 	}
 
 	is_not_empty( value ) {
 		let empty_values = [null, 'null', undefined, 'undefined'];
-		return empty_values.findIndex(v => v === value) === -1;
+		return ! empty_values.includes(value);
 	}
 
 
@@ -219,7 +211,7 @@ class AntergosThemeUtils {
 		var images = [],
 			subdirs = [];
 
-		for ( var file of dirlist ) {
+		for ( let file of dirlist ) {
 			if ( file.match( /(png|PNG)|(jpg|JPEG)|(bmp|BMP)/ ) ) {
 				images.push( file );
 			} else if ( ! file.match( /\w+\.\w+/ ) ) {
@@ -227,14 +219,17 @@ class AntergosThemeUtils {
 			}
 		}
 
-		if ( subdirs.length && ! images.length && this.recursion < 3 ) {
+		if ( subdirs.length && images.length < 20 && this.recursion < 3 ) {
 			this.recursion++;
-			for ( var dir of subdirs ) {
-				var list = greeterutil.dirlist( dir );
 
-				if ( list && list.length ) {
-					images.push.apply( images, this.find_images( list ) );
-				}
+			for ( let dir of subdirs ) {
+				theme_utils.dirlist( dir, ( result ) => {
+					if ( result && result.length ) {
+						images.push.apply( images, this.find_images( result ) );
+					}
+				} );
+
+
 			}
 		}
 
@@ -896,7 +891,7 @@ class AntergosTheme {
 /**
  * Initialize the theme once the window has loaded.
  */
-$( window ).on('load', () => {
+$( window ).on( 'GreeterReady', () => {
 	new AntergosThemeUtils();
 	new AntergosTheme();
 } );
diff --git a/themes/antergos/package.json b/themes/antergos/package.json
index 70e8c60..a0108eb 100644
--- a/themes/antergos/package.json
+++ b/themes/antergos/package.json
@@ -18,7 +18,7 @@
   "config": {},
   "wg_theme": {
     "display_name": "Default",
-    "supports": ["2.2", "3"],
+    "supports": ["3"],
     "entry_point": "./index.html",
     "styles": [
       "bootswatch-paper",
diff --git a/web-greeter/bridge/Greeter.py b/web-greeter/bridge/Greeter.py
index 63dd870..2acf1a0 100644
--- a/web-greeter/bridge/Greeter.py
+++ b/web-greeter/bridge/Greeter.py
@@ -53,12 +53,22 @@ LightDMUsers = LightDM.UserList()
 
 class Greeter(BridgeObject):
 
-    authentication_complete = bridge.signal(LightDM.Greeter)
-    autologin_timer_expired = bridge.signal(LightDM.Greeter)
-    idle = bridge.signal(LightDM.Greeter)
-    reset = bridge.signal(LightDM.Greeter)
-    show_message = bridge.signal((LightDM.Greeter, str, str), arguments=('text', 'type'))
-    show_prompt = bridge.signal((LightDM.Greeter, str, str), arguments=('text', 'type'))
+    authentication_complete = bridge.signal(LightDM.Greeter, name='authentication_complete')
+    autologin_timer_expired = bridge.signal(LightDM.Greeter, name='autologin_timer_expired')
+
+    idle = bridge.signal(LightDM.Greeter, name='idle')
+    reset = bridge.signal(LightDM.Greeter, name='reset')
+
+    show_message = bridge.signal(
+        (LightDM.Greeter, str, LightDM.MessageType),
+        name='show_message',
+        arguments=('text', 'type')
+    )
+    show_prompt = bridge.signal(
+        (LightDM.Greeter, str, LightDM.PromptType),
+        name='show_prompt',
+        arguments=('text', 'type')
+    )
 
     def __init__(self, themes_dir, *args, **kwargs):
         super().__init__(name='LightDMGreeter', *args, **kwargs)
@@ -81,8 +91,8 @@ class Greeter(BridgeObject):
         LightDMGreeter.connect('autologin-timer-expired', self.authentication_complete.emit)
         LightDMGreeter.connect('idle', self.idle.emit)
         LightDMGreeter.connect('reset', self.reset.emit)
-        LightDMGreeter.connect('show-message', self.reset.emit)
-        LightDMGreeter.connect('show-prompt', self.reset.emit)
+        LightDMGreeter.connect('show-message', self.show_message.emit)
+        LightDMGreeter.connect('show-prompt', self.show_prompt.emit)
 
     @bridge.prop(str)
     def authentication_user(self):
diff --git a/web-greeter/bridge/ThemeUtils.py b/web-greeter/bridge/ThemeUtils.py
index 0a655e0..9ae43e9 100644
--- a/web-greeter/bridge/ThemeUtils.py
+++ b/web-greeter/bridge/ThemeUtils.py
@@ -28,7 +28,7 @@
 
 # Standard Lib
 import os
-import os.path as path
+from glob import glob
 
 # 3rd-Party Libs
 from whither.bridge import (
@@ -47,14 +47,14 @@ class ThemeUtils(BridgeObject):
         self._user_config = user_config
         self._greeter = greeter
 
-    @bridge.method(Variant)
-    def dirlist(self, dir_path):
+    @bridge.method(str, bool, name='dirlist', result=Variant)
+    def dirlist(self, dir_path, only_images=True):
         if not dir_path or not isinstance(dir_path, str):
             return []
 
-        dir_path = path.realpath(path.normpath(dir_path))
+        dir_path = os.path.realpath(os.path.normpath(dir_path))
 
-        if not path.isabs(dir_path) or not path.isdir(dir_path):
+        if not os.path.isabs(dir_path) or not os.path.isdir(dir_path):
             return []
 
         allowed = False
@@ -73,7 +73,15 @@ class ThemeUtils(BridgeObject):
         if not allowed:
             return []
 
-        return (path.join(dir_path, f) for f in os.listdir(dir_path))
-
+        if only_images:
+            file_types = ('jpg', 'jpeg', 'png', 'gif', 'bmp')
+            result = [
+                glob('{0}/**/*.{1}'.format(dir_path, ftype), recursive=True)
+                for ftype in file_types
+            ]
+            result = [image for image_list in result for image in image_list]
 
+        else:
+            result = [os.path.join(dir_path, f) for f in os.listdir(dir_path)]
 
+        return result
diff --git a/web-greeter/resources/js/ThemeUtils.js b/web-greeter/resources/js/ThemeUtils.js
index 820ea9b..13e8976 100644
--- a/web-greeter/resources/js/ThemeUtils.js
+++ b/web-greeter/resources/js/ThemeUtils.js
@@ -25,11 +25,6 @@
  * along with lightdm-webkit2-greeter; If not, see .
  */
 
-/*if ( 'undefined' === typeof window.navigator.languages ) {
-	window.navigator.languages = [ window.navigator.language ];
-}*/
-
-
 
 let localized_invalid_date = null,
 	time_language = null,
@@ -109,20 +104,20 @@ class ThemeUtils {
 	 *   * Is located within the greeter's shared data directory (`/var/lib/lightdm-data`).
 	 *   * Is located in `/tmp`.
 	 *
-	 * @param {string} path The abs path to desired directory.
-	 *
-	 * @returns {string[]} List of abs paths for the files and directories found in `path`.
+	 * @param {string}              path        The abs path to desired directory.
+	 * @param {boolean}             only_images Include only images in the results. Default `true`.
+	 * @param {function(string[])}  callback    Callback function to be called with the result.
 	 */
-	dirlist( path ) {
+	dirlist( path, only_images = true, callback ) {
 		let allowed = false;
 
 		if ( '' === path || 'string' !== typeof path ) {
 			console.log('[ERROR] theme_utils.dirlist(): path must be a non-empty string!');
-			return [];
+			return callback([]);
 
 		} else if ( null !== path.match(/^[^/].+/) ) {
 			console.log('[ERROR] theme_utils.dirlist(): path must be absolute!');
-			return[];
+			return callback([]);
 		}
 
 		if ( null !== path.match(/\/\.+(?=\/)/) ) {
@@ -136,15 +131,15 @@ class ThemeUtils {
 
 		if ( ! Object.keys( allowed_dirs ).some( dir => path.startsWith( allowed_dirs[dir] ) ) ) {
 			console.log(`[ERROR] theme_utils.dirlist(): path is not allowed: ${path}`);
-			return [];
+			return callback([]);
 		}
 
 		try {
-			return _ThemeUtils.dirlist( path );
+			return _ThemeUtils.dirlist( path, only_images, callback );
 
 		} catch( err ) {
 			console.log( `[ERROR] theme_utils.dirlist(): ${err}` );
-			return [];
+			return callback([]);
 		}
 	}
 
diff --git a/web-greeter/resources/js/bootstrap.js b/web-greeter/resources/js/bootstrap.js
index 1d3b909..b5fb702 100644
--- a/web-greeter/resources/js/bootstrap.js
+++ b/web-greeter/resources/js/bootstrap.js
@@ -25,12 +25,12 @@
  * along with lightdm-webkit2-greeter; If not, see .
  */
 
-let _channel;
-const _ready_event = new Event( 'GreeterReady' );
 
+(() => {
+	let _channel;
+	const _ready_event = new Event( 'GreeterReady' );
 
-function initialize() {
-	new QWebChannel( qt.webChannelTransport, channel => {
+	function channel_ready_cb( channel ) {
 		_channel = channel;
 
 		/**
@@ -75,11 +75,14 @@ function initialize() {
 		 */
 		window.greeterutil = window.theme_utils;
 
-		setTimeout(function() {
+		setTimeout( function () {
 			window.dispatchEvent( _ready_event );
-		}, 400);
+		}, 2 );
+	}
+
+	document.addEventListener( 'DOMContentLoaded', ( event ) => {
+		new QWebChannel( qt.webChannelTransport, channel_ready_cb );
 	});
-}
 
+})();
 
-setTimeout( initialize, 50 );
diff --git a/web-greeter/whither.yml b/web-greeter/whither.yml
index 607c14e..ad9e3f2 100644
--- a/web-greeter/whither.yml
+++ b/web-greeter/whither.yml
@@ -28,4 +28,4 @@ WebGreeter:
 
     # App's Config
     app:
-        themes_dir: /usr/share/lightdm-webkit/themes
+        themes_dir: /home/dustin/github/antergos/lightdm-webkit2-greeter/themes