diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php
index 1e706ce869bcd10a694f64ac1582ef5d5bb6656b..5fad23de4f6ce26b7164edd6c7babfeabfe841a6 100644
--- a/apps/user_ldap/appinfo/update.php
+++ b/apps/user_ldap/appinfo/update.php
@@ -19,7 +19,7 @@ foreach($configPrefixes as $config) {
 		'user_ldap', $config.'ldap_uuid_user_attribute', 'not existing');
 	if($state === 'non existing') {
 		$value = \OCP\Config::getAppValue(
-			'user_ldap', $config.'ldap_uuid_attribute', 'auto');
+			'user_ldap', $config.'ldap_uuid_attribute', '');
 		\OCP\Config::setAppValue(
 			'user_ldap', $config.'ldap_uuid_user_attribute', $value);
 		\OCP\Config::setAppValue(
@@ -30,7 +30,7 @@ foreach($configPrefixes as $config) {
 		'user_ldap', $config.'ldap_expert_uuid_user_attr', 'not existing');
 	if($state === 'non existing') {
 		$value = \OCP\Config::getAppValue(
-			'user_ldap', $config.'ldap_expert_uuid_attr', 'auto');
+			'user_ldap', $config.'ldap_expert_uuid_attr', '');
 		\OCP\Config::setAppValue(
 			'user_ldap', $config.'ldap_expert_uuid_user_attr', $value);
 		\OCP\Config::setAppValue(
diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version
index 17b2ccd9bf9050efdf57d7800677e87919b9b5b9..6f2743d65dc06508954334e88edb660bf8efea20 100644
--- a/apps/user_ldap/appinfo/version
+++ b/apps/user_ldap/appinfo/version
@@ -1 +1 @@
-0.4.3
+0.4.4
diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css
index 3051cc8058e1e8c5576b4777e7ac198c25cbd52a..8f339451c6451a48eadbb460302e2cde08da138f 100644
--- a/apps/user_ldap/css/settings.css
+++ b/apps/user_ldap/css/settings.css
@@ -6,6 +6,7 @@
 .tablerow {
 	display: table-row;
 	white-space: nowrap;
+	text-align: left;
 }
 
 .tablerow input, .tablerow textarea {
@@ -16,6 +17,10 @@
 	height: 15px;
 }
 
+#ldap .tablerow label {
+	margin-left: 3px;
+}
+
 .invisible {
 	visibility: hidden;
 }
@@ -77,6 +82,10 @@
 	margin: 5px;
 }
 
+.ldap_count {
+	line-height: 45px;
+}
+
 .ldapSettingControls {
 	margin-top: 3px;
 }
@@ -103,6 +112,10 @@
 	vertical-align: bottom;
 }
 
+#ldap input[type=checkbox] {
+	width: 15px !important;
+}
+
 select[multiple=multiple] + button {
 	height: 28px;
 	padding-top: 6px !important;
@@ -110,6 +123,18 @@ select[multiple=multiple] + button {
 	max-width: 40%;
 }
 
+.save-cursor {
+	cursor: wait;
+}
+
+#ldap .ldap_saving {
+	margin-right: 15px;
+	color: orange;
+	font-weight: bold;
+}
+
+#ldap .ldap_saving img { height: 15px; }
+
 .ldap_config_state_indicator_sign {
 	display: inline-block;
 	height: 16px;
diff --git a/apps/user_ldap/js/experiencedAdmin.js b/apps/user_ldap/js/experiencedAdmin.js
new file mode 100644
index 0000000000000000000000000000000000000000..fac8dd6470f712ab9c70e493d034d982fdcddf3e
--- /dev/null
+++ b/apps/user_ldap/js/experiencedAdmin.js
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2014, Arthur Schiwon <blizzz@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or later.
+ * See the COPYING-README file.
+ */
+
+/* global LdapWizard */
+
+/**
+ * controls behaviour depend on whether the admin is experienced in LDAP or not.
+ *
+ * @class
+ * @param {object} wizard the LDAP Wizard object
+ * @param {boolean} initialState whether the admin is experienced or not
+ */
+function ExperiencedAdmin(wizard, initialState) {
+	this.wizard = wizard;
+	this._isExperienced = initialState;
+	if(this._isExperienced) {
+		this.hideEntryCounters();
+	}
+}
+
+
+/**
+ * toggles whether the admin is an experienced one or not
+ *
+ * @param {boolean} whether the admin is experienced or not
+ */
+ExperiencedAdmin.prototype.setExperienced = function(isExperienced) {
+	this._isExperienced = isExperienced;
+	if(this._isExperienced) {
+		this.enableRawMode();
+		this.hideEntryCounters();
+	} else {
+		this.showEntryCounters();
+	}
+};
+
+/**
+* answers whether the admin is an experienced one or not
+*
+* @return {boolean} whether the admin is experienced or not
+*/
+ExperiencedAdmin.prototype.isExperienced = function() {
+	return this._isExperienced;
+};
+
+/**
+ * switches all LDAP filters from Assisted to Raw mode.
+ */
+ExperiencedAdmin.prototype.enableRawMode = function() {
+	var containers = {
+		'toggleRawGroupFilter': '#rawGroupFilterContainer',
+		'toggleRawLoginFilter': '#rawLoginFilterContainer',
+		'toggleRawUserFilter' : '#rawUserFilterContainer'
+	};
+
+	for(var method in containers) {
+		if($(containers[method]).hasClass('invisible')) {
+			this.wizard[method]();
+		}
+	}
+};
+
+ExperiencedAdmin.prototype.updateUserTab = function(mode) {
+	this._updateTab(mode, $('#ldap_user_count'));
+};
+
+ExperiencedAdmin.prototype.updateGroupTab = function(mode) {
+	this._updateTab(mode, $('#ldap_group_count'));
+};
+
+ExperiencedAdmin.prototype._updateTab = function(mode, $countEl) {
+	if(mode === LdapWizard.filterModeAssisted) {
+		$countEl.removeClass('hidden');
+	} else if(!this._isExperienced) {
+		$countEl.removeClass('hidden');
+	} else {
+		$countEl.addClass('hidden');
+	}
+};
+
+/**
+ * hide user and group counters, they will be displayed on demand only
+ */
+ExperiencedAdmin.prototype.hideEntryCounters = function() {
+	$('#ldap_user_count').addClass('hidden');
+	$('#ldap_group_count').addClass('hidden');
+	$('.ldapGetEntryCount').removeClass('hidden');
+};
+
+/**
+* shows user and group counters, they will be displayed on demand only
+*/
+ExperiencedAdmin.prototype.showEntryCounters = function() {
+	$('#ldap_user_count').removeClass('hidden');
+	$('#ldap_group_count').removeClass('hidden');
+	$('.ldapGetEntryCount').addClass('hidden');
+};
diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js
index e9f60e7ba3c9497352f8e7f7542d5e413bbb39ed..bb66c1df2eef0ffbd77a3118e9f959075d60098a 100644
--- a/apps/user_ldap/js/ldapFilter.js
+++ b/apps/user_ldap/js/ldapFilter.js
@@ -1,19 +1,30 @@
 /* global LdapWizard */
 
-function LdapFilter(target)  {
+function LdapFilter(target, determineModeCallback) {
 	this.locked = true;
 	this.target = false;
 	this.mode = LdapWizard.filterModeAssisted;
 	this.lazyRunCompose = false;
+	this.determineModeCallback = determineModeCallback;
+	this.foundFeatures = false;
+	this.activated = false;
 
 	if( target === 'User' ||
 		target === 'Login' ||
 		target === 'Group') {
 		this.target = target;
-		this.determineMode();
 	}
 }
 
+LdapFilter.prototype.activate = function() {
+	if(this.activated) {
+		return;
+	}
+	this.activated = true;
+
+	this.determineMode();
+};
+
 LdapFilter.prototype.compose = function(callback) {
 	var action;
 
@@ -22,6 +33,11 @@ LdapFilter.prototype.compose = function(callback) {
 		return false;
 	}
 
+	if(this.mode === LdapWizard.filterModeRaw) {
+		//Raw filter editing, i.e. user defined filter, don't compose
+		return;
+	}
+
 	if(this.target === 'User') {
 		action = 'getUserListFilter';
 	} else if(this.target === 'Login') {
@@ -30,11 +46,6 @@ LdapFilter.prototype.compose = function(callback) {
 		action = 'getGroupFilter';
 	}
 
-	if(!$('#raw'+this.target+'FilterContainer').hasClass('invisible')) {
-		//Raw filter editing, i.e. user defined filter, don't compose
-		return;
-	}
-
 	var param = 'action='+action+
 		'&ldap_serverconfig_chooser='+
 		encodeURIComponent($('#ldap_serverconfig_chooser').val());
@@ -44,10 +55,8 @@ LdapFilter.prototype.compose = function(callback) {
 	LdapWizard.ajax(param,
 		function(result) {
 			LdapWizard.applyChanges(result);
-			if(filter.target === 'User') {
-				LdapWizard.countUsers();
-			} else if(filter.target === 'Group') {
-				LdapWizard.countGroups();
+			filter.updateCount();
+			if(filter.target === 'Group') {
 				LdapWizard.detectGroupMemberAssoc();
 			}
 			if(typeof callback !== 'undefined') {
@@ -82,6 +91,7 @@ LdapFilter.prototype.determineMode = function() {
 					filter.mode + '« of type ' + typeof filter.mode);
 			}
 			filter.unlock();
+			filter.determineModeCallback(filter.mode);
 		},
 		function () {
 			//on error case get back to default i.e. Assisted
@@ -90,10 +100,21 @@ LdapFilter.prototype.determineMode = function() {
 				filter.mode = LdapWizard.filterModeAssisted;
 			}
 			filter.unlock();
+			filter.determineModeCallback(filter.mode);
 		}
 	);
 };
 
+LdapFilter.prototype.setMode = function(mode) {
+	if(mode === LdapWizard.filterModeAssisted || mode === LdapWizard.filterModeRaw) {
+		this.mode = mode;
+	}
+};
+
+LdapFilter.prototype.getMode = function() {
+	return this.mode;
+};
+
 LdapFilter.prototype.unlock = function() {
 	this.locked = false;
 	if(this.lazyRunCompose) {
@@ -101,3 +122,33 @@ LdapFilter.prototype.unlock = function() {
 		this.compose();
 	}
 };
+
+LdapFilter.prototype.findFeatures = function() {
+	//TODO: reset this.foundFeatures when any base DN changes
+	if(!this.foundFeatures && !this.locked && this.mode === LdapWizard.filterModeAssisted) {
+		this.foundFeatures = true;
+		var objcEl, avgrEl;
+		if(this.target === 'User') {
+			objcEl = 'ldap_userfilter_objectclass';
+			avgrEl = 'ldap_userfilter_groups';
+		} else if (this.target === 'Group') {
+			objcEl = 'ldap_groupfilter_objectclass';
+			avgrEl = 'ldap_groupfilter_groups';
+		} else if (this.target === 'Login') {
+			LdapWizard.findAttributes();
+			return;
+		} else {
+			return false;
+		}
+		LdapWizard.findObjectClasses(objcEl, this.target);
+		LdapWizard.findAvailableGroups(avgrEl, this.target + "s");
+	}
+};
+
+LdapFilter.prototype.updateCount = function(doneCallback) {
+	if(this.target === 'User') {
+		LdapWizard.countUsers(doneCallback);
+	} else if (this.target === 'Group') {
+		LdapWizard.countGroups(doneCallback);
+	}
+};
diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js
index fd84ca1980b2a2f89bc1c22f33bfb7a208e9edeb..1627528200fa6626fe07e8eec8cc089a37a4901d 100644
--- a/apps/user_ldap/js/settings.js
+++ b/apps/user_ldap/js/settings.js
@@ -122,7 +122,7 @@ var LdapConfiguration = {
 			OC.filePath('user_ldap','ajax','clearMappings.php'),
 			'ldap_clear_mapping='+encodeURIComponent(mappingSubject),
 			function(result) {
-				if(result.status == 'success') {
+				if(result.status === 'success') {
 					OC.dialogs.info(
 						t('user_ldap', 'mappings cleared'),
 						t('user_ldap', 'Success')
@@ -148,23 +148,32 @@ var LdapWizard = {
 	userFilter: false,
 	loginFilter: false,
 	groupFilter: false,
+	ajaxRequests: {},
 
-	ajax: function(param, fnOnSuccess, fnOnError) {
-		$.post(
+	ajax: function(param, fnOnSuccess, fnOnError, reqID) {
+		if(reqID !== undefined) {
+			if(LdapWizard.ajaxRequests.hasOwnProperty(reqID)) {
+				LdapWizard.ajaxRequests[reqID].abort();
+			}
+		}
+		var request = $.post(
 			OC.filePath('user_ldap','ajax','wizard.php'),
 			param,
 			function(result) {
-				if(result.status == 'success') {
+				if(result.status === 'success') {
 					fnOnSuccess(result);
 				} else {
 					fnOnError(result);
 				}
 			}
 		);
+		if(reqID !== undefined) {
+			LdapWizard.ajaxRequests[reqID] = request;
+		}
 	},
 
 	applyChanges: function (result) {
-		for (id in result.changes) {
+		for (var id in result.changes) {
 			LdapWizard.blacklistAdd(id);
 			if(id.indexOf('count') > 0) {
 				$('#'+id).text(result.changes[id]);
@@ -179,28 +188,41 @@ var LdapWizard = {
 		}
 	},
 
+	enableTabs: function() {
+		//do not use this function directly, use basicStatusCheck instead.
+		if(LdapWizard.saveProcesses === 0) {
+			$('.ldap_action_continue').removeAttr('disabled');
+			$('.ldap_action_back').removeAttr('disabled');
+			$('#ldapSettings').tabs('option', 'disabled', []);
+		}
+	},
+
+	disableTabs: function() {
+		$('.ldap_action_continue').attr('disabled', 'disabled');
+		$('.ldap_action_back').attr('disabled', 'disabled');
+		$('#ldapSettings').tabs('option', 'disabled', [1, 2, 3, 4, 5]);
+	},
+
 	basicStatusCheck: function() {
 		//criterias to continue from the first tab
 		// - host, port, user filter, agent dn, password, base dn
-		host	= $('#ldap_host').val();
-		port	= $('#ldap_port').val();
-		agent	= $('#ldap_dn').val();
-		pwd		= $('#ldap_agent_password').val();
-		base	= $('#ldap_base').val();
+		var host  = $('#ldap_host').val();
+		var port  = $('#ldap_port').val();
+		var agent = $('#ldap_dn').val();
+		var pwd   = $('#ldap_agent_password').val();
+		var base  = $('#ldap_base').val();
 
 		if((host && port  && base) && ((!agent && !pwd) || (agent && pwd))) {
-			$('.ldap_action_continue').removeAttr('disabled');
-			$('#ldapSettings').tabs('option', 'disabled', []);
+			LdapWizard.enableTabs();
 		} else {
-			$('.ldap_action_continue').attr('disabled', 'disabled');
-			$('#ldapSettings').tabs('option', 'disabled', [1, 2, 3, 4, 5]);
+			LdapWizard.disableTabs();
 		}
 	},
 
 
 	blacklistAdd: function(id) {
 		obj = $('#'+id);
-		if(!(obj[0].hasOwnProperty('multiple') && obj[0]['multiple'] == true)) {
+		if(!(obj[0].hasOwnProperty('multiple') && obj[0]['multiple'] === true)) {
 			//no need to blacklist multiselect
 			LdapWizard.saveBlacklist[id] = true;
 			return true;
@@ -244,7 +266,8 @@ var LdapWizard = {
 					LdapWizard.showInfoBox(t('user_ldap', 'Please specify a Base DN'));
 					LdapWizard.showInfoBox(t('user_ldap', 'Could not determine Base DN'));
 					$('#ldap_base').prop('disabled', false);
-				}
+				},
+				'guessBaseDN'
 			);
 		}
 	},
@@ -274,7 +297,8 @@ var LdapWizard = {
 					LdapWizard.hideSpinner('#ldap_port');
 					$('#ldap_port').prop('disabled', false);
 					LdapWizard.showInfoBox(t('user_ldap', 'Please specify the port'));
-				}
+				},
+				'guessPortAndTLS'
 			);
 		}
 	},
@@ -317,27 +341,37 @@ var LdapWizard = {
 		}
 	},
 
-	_countThings: function(method) {
+	_countThings: function(method, spinnerID, doneCallback) {
 		param = 'action='+method+
 				'&ldap_serverconfig_chooser='+
 				encodeURIComponent($('#ldap_serverconfig_chooser').val());
 
-		LdapWizard.ajax(param,
+		LdapWizard.showSpinner(spinnerID);
+		var request = LdapWizard.ajax(param,
 			function(result) {
 				LdapWizard.applyChanges(result);
+				LdapWizard.hideSpinner(spinnerID);
+				if(doneCallback !== undefined) {
+					doneCallback(method);
+				}
 			},
 			function (result) {
-				// error handling
-			}
+				OC.Notification.show('Counting the entries failed with, ' + result.message);
+				LdapWizard.hideSpinner(spinnerID);
+				if(doneCallback !== undefined) {
+					doneCallback(method);
+				}
+			},
+			method
 		);
 	},
 
-	countGroups: function() {
-		LdapWizard._countThings('countGroups');
+	countGroups: function(doneCallback) {
+		LdapWizard._countThings('countGroups', '#ldap_group_count', doneCallback);
 	},
 
-	countUsers: function() {
-		LdapWizard._countThings('countUsers');
+	countUsers: function(doneCallback) {
+		LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback);
 	},
 
 	detectEmailAttribute: function() {
@@ -345,7 +379,7 @@ var LdapWizard = {
 				'&ldap_serverconfig_chooser='+
 				encodeURIComponent($('#ldap_serverconfig_chooser').val());
 		//runs in the background, no callbacks necessary
-		LdapWizard.ajax(param, LdapWizard.applyChanges, function(){});
+		LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}, 'detectEmailAttribute');
 	},
 
 	detectGroupMemberAssoc: function() {
@@ -359,7 +393,8 @@ var LdapWizard = {
 			},
 			function (result) {
 				// error handling
-			}
+			},
+			'determineGroupMemberAssoc'
 		);
 	},
 
@@ -372,7 +407,7 @@ var LdapWizard = {
 		LdapWizard.ajax(param,
 			function(result) {
 				$('#ldap_loginfilter_attributes').find('option').remove();
-				for (i in result.options['ldap_loginfilter_attributes']) {
+				for (var i in result.options['ldap_loginfilter_attributes']) {
 					//FIXME: move HTML into template
 					attr = result.options['ldap_loginfilter_attributes'][i];
 					$('#ldap_loginfilter_attributes').append(
@@ -392,12 +427,13 @@ var LdapWizard = {
 									{noneSelectedText : 'No attributes found'});
 				$('#ldap_loginfilter_attributes').multiselect('disable');
 				LdapWizard.hideSpinner('#ldap_loginfilter_attributes');
-			}
+			},
+			'determineAttributes'
 		);
 	},
 
 	findAvailableGroups: function(multisel, type) {
-		if(type != 'Users' && type != 'Groups') {
+		if(type !== 'Users' && type !== 'Groups') {
 			return false;
 		}
 		param = 'action=determineGroupsFor'+encodeURIComponent(type)+
@@ -408,7 +444,7 @@ var LdapWizard = {
 		LdapWizard.ajax(param,
 			function(result) {
 				$('#'+multisel).find('option').remove();
-				for (i in result.options[multisel]) {
+				for (var i in result.options[multisel]) {
 					//FIXME: move HTML into template
 					objc = result.options[multisel][i];
 					$('#'+multisel).append("<option value='"+objc+"'>"+objc+"</option>");
@@ -435,16 +471,17 @@ var LdapWizard = {
 			function (result) {
 				LdapWizard.hideSpinner('#'+multisel);
 				$('#'+multisel).multiselect('disable');
-				if(type == 'Users') {
+				if(type === 'Users') {
 					LdapWizard.userFilterAvailableGroupsHasRun = true;
 					LdapWizard.postInitUserFilter();
 				}
-			}
+			},
+			'findAvailableGroupsFor' + type
 		);
 	},
 
 	findObjectClasses: function(multisel, type) {
-		if(type != 'User' && type != 'Group') {
+		if(type !== 'User' && type !== 'Group') {
 			return false;
 		}
 		param = 'action=determine'+encodeURIComponent(type)+'ObjectClasses'+
@@ -455,7 +492,7 @@ var LdapWizard = {
 		LdapWizard.ajax(param,
 			function(result) {
 				$('#'+multisel).find('option').remove();
-				for (i in result.options[multisel]) {
+				for (var i in result.options[multisel]) {
 					//FIXME: move HTML into template
 					objc = result.options[multisel][i];
 					$('#'+multisel).append("<option value='"+objc+"'>"+objc+"</option>");
@@ -476,12 +513,13 @@ var LdapWizard = {
 			},
 			function (result) {
 				LdapWizard.hideSpinner('#'+multisel);
-				if(type == 'User') {
+				if(type === 'User') {
 					LdapWizard.userFilterObjectClassesHasRun = true;
 					LdapWizard.postInitUserFilter();
 				}
 				//TODO: error handling
-			}
+			},
+			'determine' + type + 'ObjectClasses'
 		);
 	},
 
@@ -530,23 +568,21 @@ var LdapWizard = {
 	isConfigurationActiveControlLocked: true,
 
 	init: function() {
+		LdapWizard.instantiateFilters();
+		LdapWizard.admin.setExperienced($('#ldap_experienced_admin').is(':checked'));
 		LdapWizard.basicStatusCheck();
 		LdapWizard.functionalityCheck();
 		LdapWizard.isConfigurationActiveControlLocked = false;
 	},
 
 	initGroupFilter: function() {
-		LdapWizard.groupFilter = new LdapFilter('Group');
-		LdapWizard.findObjectClasses('ldap_groupfilter_objectclass', 'Group');
-		LdapWizard.findAvailableGroups('ldap_groupfilter_groups', 'Groups');
-		LdapWizard.countGroups();
+		LdapWizard.groupFilter.activate();
 	},
 
 	/** init login filter tab section **/
 
 	initLoginFilter: function() {
-		LdapWizard.loginFilter = new LdapFilter('Login');
-		LdapWizard.findAttributes();
+		LdapWizard.loginFilter.activate();
 	},
 
 	postInitLoginFilter: function() {
@@ -569,30 +605,80 @@ var LdapWizard = {
 		});
 	},
 
+	hideTestSpinner:function (countMethod) {
+		var selector;
+		if(countMethod === 'countUsers') {
+			selector = '#rawUserFilterContainer .ldapGetEntryCount';
+		} else {
+			selector = '#rawGroupFilterContainer .ldapGetEntryCount';
+		}
+		LdapWizard.hideSpinner(selector);
+	},
+
 	/** init user filter tab section **/
 
+	instantiateFilters: function() {
+		delete LdapWizard.userFilter;
+		LdapWizard.userFilter = new LdapFilter('User', function(mode) {
+			if(mode === LdapWizard.filterModeAssisted) {
+				LdapWizard.groupFilter.updateCount();
+			}
+			LdapWizard.userFilter.findFeatures();
+		});
+		$('#rawUserFilterContainer .ldapGetEntryCount').click(function(event) {
+			event.preventDefault();
+			$('#ldap_user_count').text('');
+			LdapWizard.showSpinner('#rawUserFilterContainer .ldapGetEntryCount');
+			LdapWizard.userFilter.updateCount(LdapWizard.hideTestSpinner);
+			LdapWizard.detectEmailAttribute();
+			$('#ldap_user_count').removeClass('hidden');
+		});
+
+		delete LdapWizard.loginFilter;
+		LdapWizard.loginFilter = new LdapFilter('Login', function(mode) {
+			LdapWizard.loginFilter.findFeatures();
+		});
+
+		delete LdapWizard.groupFilter;
+		LdapWizard.groupFilter = new LdapFilter('Group', function(mode) {
+			if(mode === LdapWizard.filterModeAssisted) {
+				LdapWizard.groupFilter.updateCount();
+			}
+			LdapWizard.groupFilter.findFeatures();
+		});
+		$('#rawGroupFilterContainer .ldapGetEntryCount').click(function(event) {
+			event.preventDefault();
+			$('#ldap_group_count').text('');
+			LdapWizard.showSpinner('#rawGroupFilterContainer .ldapGetEntryCount');
+			LdapWizard.groupFilter.updateCount(LdapWizard.hideTestSpinner);
+			LdapWizard.detectGroupMemberAssoc();
+			$('#ldap_group_count').removeClass('hidden');
+		});
+	},
+
 	userFilterObjectClassesHasRun: false,
 	userFilterAvailableGroupsHasRun: false,
 
 	initUserFilter: function() {
 		LdapWizard.userFilterObjectClassesHasRun = false;
 		LdapWizard.userFilterAvailableGroupsHasRun = false;
-		LdapWizard.userFilter = new LdapFilter('User');
-		LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User');
-		LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users');
+		LdapWizard.userFilter.activate();
 	},
 
 	postInitUserFilter: function() {
 		if(LdapWizard.userFilterObjectClassesHasRun &&
 			LdapWizard.userFilterAvailableGroupsHasRun) {
 			LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute);
-			LdapWizard.countUsers();
 		}
 	},
 
 	/** end of init user filter tab section **/
 
 	onTabChange: function(event, ui) {
+		if(LdapWizard.saveProcesses  > 0) {
+			//do not allow to switch tabs as long as a save process is active
+			return false;
+		}
 		newTabIndex = 0;
 		if(ui.newTab[0].id === '#ldapWizard2') {
 			LdapWizard.initUserFilter();
@@ -614,10 +700,10 @@ var LdapWizard = {
 	processChanges: function(triggerObj) {
 		LdapWizard.hideInfoBox();
 
-		if(triggerObj.id == 'ldap_host'
-		   || triggerObj.id == 'ldap_port'
-		   || triggerObj.id == 'ldap_dn'
-		   || triggerObj.id == 'ldap_agent_password') {
+		if(triggerObj.id === 'ldap_host'
+		   || triggerObj.id === 'ldap_port'
+		   || triggerObj.id === 'ldap_dn'
+		   || triggerObj.id === 'ldap_agent_password') {
 			LdapWizard.checkPort();
 			if($('#ldap_port').val()) {
 				//if Port is already set, check BaseDN
@@ -625,16 +711,14 @@ var LdapWizard = {
 			}
 		}
 
-		if(triggerObj.id == 'ldap_userlist_filter') {
-			LdapWizard.countUsers();
+		if(triggerObj.id === 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) {
 			LdapWizard.detectEmailAttribute();
-		} else if(triggerObj.id == 'ldap_group_filter') {
-			LdapWizard.countGroups();
+		} else if(triggerObj.id === 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) {
 			LdapWizard.detectGroupMemberAssoc();
 		}
 
-		if(triggerObj.id == 'ldap_loginfilter_username'
-		   || triggerObj.id == 'ldap_loginfilter_email') {
+		if(triggerObj.id === 'ldap_loginfilter_username'
+		   || triggerObj.id === 'ldap_loginfilter_email') {
 			LdapWizard.loginFilter.compose();
 		}
 
@@ -663,8 +747,8 @@ var LdapWizard = {
 			values = values + "\n" + resultObj[i].value;
 		}
 		LdapWizard._save($('#'+originalObj)[0], $.trim(values));
-		if(originalObj == 'ldap_userfilter_objectclass'
-		   || originalObj == 'ldap_userfilter_groups') {
+		if(originalObj === 'ldap_userfilter_objectclass'
+		   || originalObj === 'ldap_userfilter_groups') {
 			LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute);
 			//when user filter is changed afterwards, login filter needs to
 			//be adjusted, too
@@ -672,15 +756,19 @@ var LdapWizard = {
 				LdapWizard.initLoginFilter();
 			}
 			LdapWizard.loginFilter.compose();
-		} else if(originalObj == 'ldap_loginfilter_attributes') {
+		} else if(originalObj === 'ldap_loginfilter_attributes') {
 			LdapWizard.loginFilter.compose();
-		} else if(originalObj == 'ldap_groupfilter_objectclass'
-		   || originalObj == 'ldap_groupfilter_groups') {
+		} else if(originalObj === 'ldap_groupfilter_objectclass'
+		   || originalObj === 'ldap_groupfilter_groups') {
 			LdapWizard.groupFilter.compose();
 		}
 	},
 
+	saveProcesses: 0,
 	_save: function(object, value) {
+		$('#ldap .ldap_saving').removeClass('hidden');
+		LdapWizard.saveProcesses += 1;
+		$('#ldap *').addClass('save-cursor');
 		param = 'cfgkey='+encodeURIComponent(object.id)+
 				'&cfgval='+encodeURIComponent(value)+
 				'&action=save'+
@@ -690,10 +778,15 @@ var LdapWizard = {
 			OC.filePath('user_ldap','ajax','wizard.php'),
 			param,
 			function(result) {
-				if(result.status == 'success') {
+				LdapWizard.saveProcesses -= 1;
+				if(LdapWizard.saveProcesses === 0) {
+					$('#ldap .ldap_saving').addClass('hidden');
+					$('#ldap *').removeClass('save-cursor');
+				}
+				if(result.status === 'success') {
 					LdapWizard.processChanges(object);
 				} else {
-// 					alert('Oooooooooooh :(');
+					console.log('Could not save value for ' + object.id);
 				}
 			}
 		);
@@ -713,12 +806,15 @@ var LdapWizard = {
 	},
 
 	toggleRawFilter: function(container, moc, mg, stateVar, modeKey) {
+		var isUser = moc.indexOf('user') >= 0;
+		var filter = isUser ? LdapWizard.userFilter : LdapWizard.groupFilter;
 		//moc = multiselect objectclass
 		//mg = mutliselect groups
 		if($(container).hasClass('invisible')) {
+			filter.setMode(LdapWizard.filterModeRaw);
 			$(container).removeClass('invisible');
 			$(moc).multiselect('disable');
-			if($(mg).multiselect().attr('disabled') == 'disabled') {
+			if($(mg).multiselect().attr('disabled') === 'disabled') {
 				LdapWizard[stateVar] = 'disable';
 			} else {
 				LdapWizard[stateVar] = 'enable';
@@ -726,11 +822,13 @@ var LdapWizard = {
 			$(mg).multiselect('disable');
 			LdapWizard._save({ id: modeKey }, LdapWizard.filterModeRaw);
 		} else {
+			filter.setMode(LdapWizard.filterModeAssisted);
+			filter.findFeatures();
 			$(container).addClass('invisible');
 			$(mg).multiselect(LdapWizard[stateVar]);
 			$(moc).multiselect('enable');
 			LdapWizard._save({ id: modeKey }, LdapWizard.filterModeAssisted);
-			if(moc.indexOf('user') >= 0) {
+			if(isUser) {
 				LdapWizard.blacklistRemove('ldap_userlist_filter');
 				LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute);
 			} else {
@@ -740,47 +838,90 @@ var LdapWizard = {
 		}
 	},
 
+	onToggleRawFilterConfirmation: function(currentMode, callback) {
+		if(!LdapWizard.admin.isExperienced()
+			|| currentMode === LdapWizard.filterModeAssisted
+		) {
+			return callback(true);
+		}
+
+		var confirmed = OCdialogs.confirm(
+			'Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?',
+			'Mode switch',
+			callback
+		);
+	},
+
 	toggleRawGroupFilter: function() {
-		LdapWizard.blacklistRemove('ldap_group_filter');
-		LdapWizard.toggleRawFilter('#rawGroupFilterContainer',
-								   '#ldap_groupfilter_objectclass',
-								   '#ldap_groupfilter_groups',
-								   'groupFilterGroupSelectState',
-								   'ldapGroupFilterMode'
-  								);
+		LdapWizard.onToggleRawFilterConfirmation(
+			LdapWizard.groupFilter.getMode(),
+			function(confirmed) {
+				if(confirmed !== true) {
+					return;
+				}
+
+				LdapWizard.blacklistRemove('ldap_group_filter');
+				LdapWizard.toggleRawFilter('#rawGroupFilterContainer',
+										   '#ldap_groupfilter_objectclass',
+										   '#ldap_groupfilter_groups',
+										   'groupFilterGroupSelectState',
+										   'ldapGroupFilterMode'
+		  								);
+				LdapWizard.admin.updateGroupTab(LdapWizard.groupFilter.getMode());
+			}
+		);
 	},
 
 	toggleRawLoginFilter: function() {
-		LdapWizard.blacklistRemove('ldap_login_filter');
-		container = '#rawLoginFilterContainer';
-		if($(container).hasClass('invisible')) {
-			$(container).removeClass('invisible');
-			action = 'disable';
-			property = 'disabled';
-			mode = LdapWizard.filterModeRaw;
-		} else {
-			$(container).addClass('invisible');
-			action = 'enable';
-			property = false;
-			mode = LdapWizard.filterModeAssisted;
-		}
-		$('#ldap_loginfilter_attributes').multiselect(action);
-		$('#ldap_loginfilter_email').prop('disabled', property);
-		$('#ldap_loginfilter_username').prop('disabled', property);
-		LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode);
-		if(action == 'enable') {
-			LdapWizard.loginFilter.compose();
-		}
+		LdapWizard.onToggleRawFilterConfirmation(
+			LdapWizard.loginFilter.getMode(),
+			function(confirmed) {
+				if(confirmed !== true) {
+					return;
+				}
+
+				LdapWizard.blacklistRemove('ldap_login_filter');
+				container = '#rawLoginFilterContainer';
+				if($(container).hasClass('invisible')) {
+					$(container).removeClass('invisible');
+					action = 'disable';
+					property = 'disabled';
+					mode = LdapWizard.filterModeRaw;
+				} else {
+					$(container).addClass('invisible');
+					action = 'enable';
+					property = false;
+					mode = LdapWizard.filterModeAssisted;
+				}
+				LdapWizard.loginFilter.setMode(mode);
+				LdapWizard.loginFilter.findFeatures();
+				$('#ldap_loginfilter_attributes').multiselect(action);
+				$('#ldap_loginfilter_email').prop('disabled', property);
+				$('#ldap_loginfilter_username').prop('disabled', property);
+				LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode);
+				if(action === 'enable') {
+					LdapWizard.loginFilter.compose();
+				}
+			}
+		);
 	},
 
 	toggleRawUserFilter: function() {
-		LdapWizard.blacklistRemove('ldap_userlist_filter');
-		LdapWizard.toggleRawFilter('#rawUserFilterContainer',
-								   '#ldap_userfilter_objectclass',
-								   '#ldap_userfilter_groups',
-								   'userFilterGroupSelectState',
-								   'ldapUserFilterMode'
-  								);
+		LdapWizard.onToggleRawFilterConfirmation(
+			LdapWizard.userFilter.getMode(),
+			function(confirmed) {
+				if(confirmed === true) {
+					LdapWizard.blacklistRemove('ldap_userlist_filter');
+					LdapWizard.toggleRawFilter('#rawUserFilterContainer',
+											   '#ldap_userfilter_objectclass',
+											   '#ldap_userfilter_groups',
+											   'userFilterGroupSelectState',
+											   'ldapUserFilterMode'
+			  								);
+					LdapWizard.admin.updateUserTab(LdapWizard.userFilter.getMode());
+				}
+			}
+		);
 	},
 
 	updateStatusIndicator: function(isComplete) {
@@ -837,6 +978,7 @@ $(document).ready(function() {
 	LdapWizard.initMultiSelect($('#ldap_groupfilter_objectclass'),
 							   'ldap_groupfilter_objectclass',
 							   t('user_ldap', 'Select object classes'));
+
 	$('.lwautosave').change(function() { LdapWizard.save(this); });
 	$('#toggleRawUserFilter').click(LdapWizard.toggleRawUserFilter);
 	$('#toggleRawGroupFilter').click(LdapWizard.toggleRawGroupFilter);
@@ -931,4 +1073,10 @@ $(document).ready(function() {
 			LdapConfiguration.refreshConfig();
 		}
 	});
+
+	expAdminCB = $('#ldap_experienced_admin');
+	LdapWizard.admin = new ExperiencedAdmin(LdapWizard, expAdminCB.is(':checked'));
+	expAdminCB.change(function() {
+		LdapWizard.admin.setExperienced($(this).is(':checked'));
+	});
 });
diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php
index 4cb00561b3f32469e94316247e2a670394c9aa0d..28e456ae2ef4f91f6d4eb4a84a8c7f6157cee2fe 100644
--- a/apps/user_ldap/lib/configuration.php
+++ b/apps/user_ldap/lib/configuration.php
@@ -69,6 +69,7 @@ class Configuration {
 		'ldapConfigurationActive' => false,
 		'ldapAttributesForUserSearch' => null,
 		'ldapAttributesForGroupSearch' => null,
+		'ldapExperiencedAdmin' => false,
 		'homeFolderNamingRule' => null,
 		'hasPagedResultSupport' => false,
 		'hasMemberOfFilterSupport' => false,
@@ -345,52 +346,53 @@ class Configuration {
 	 */
 	public function getDefaults() {
 		return array(
-			'ldap_host'							=> '',
-			'ldap_port'							=> '',
-			'ldap_backup_host'					=> '',
-			'ldap_backup_port'					=> '',
-			'ldap_override_main_server'			=> '',
-			'ldap_dn'							=> '',
-			'ldap_agent_password'				=> '',
-			'ldap_base'							=> '',
-			'ldap_base_users'					=> '',
-			'ldap_base_groups'					=> '',
-			'ldap_userlist_filter'				=> '',
-			'ldap_user_filter_mode'				=> 0,
-			'ldap_userfilter_objectclass'		=> '',
-			'ldap_userfilter_groups'			=> '',
-			'ldap_login_filter'					=> '',
-			'ldap_login_filter_mode'			=> 0,
-			'ldap_loginfilter_email'			=> 0,
-			'ldap_loginfilter_username'			=> 1,
-			'ldap_loginfilter_attributes'		=> '',
-			'ldap_group_filter'					=> '',
-			'ldap_group_filter_mode'			=> 0,
-			'ldap_groupfilter_objectclass'		=> '',
-			'ldap_groupfilter_groups'			=> '',
-			'ldap_display_name'					=> 'displayName',
-			'ldap_group_display_name'			=> 'cn',
-			'ldap_tls'							=> 1,
-			'ldap_nocase'						=> 0,
-			'ldap_quota_def'					=> '',
-			'ldap_quota_attr'					=> '',
-			'ldap_email_attr'					=> '',
-			'ldap_group_member_assoc_attribute'	=> 'uniqueMember',
-			'ldap_cache_ttl'					=> 600,
-			'ldap_uuid_user_attribute'			=> 'auto',
-			'ldap_uuid_group_attribute'			=> 'auto',
-			'home_folder_naming_rule'			=> '',
-			'ldap_turn_off_cert_check'			=> 0,
-			'ldap_configuration_active'			=> 0,
-			'ldap_attributes_for_user_search'	=> '',
-			'ldap_attributes_for_group_search'	=> '',
-			'ldap_expert_username_attr'			=> '',
-			'ldap_expert_uuid_user_attr'		=> '',
-			'ldap_expert_uuid_group_attr'		=> '',
-			'has_memberof_filter_support'		=> 0,
-			'last_jpegPhoto_lookup'				=> 0,
-			'ldap_nested_groups'		        => 0,
-			'ldap_paging_size'					=> 500,
+			'ldap_host'                         => '',
+			'ldap_port'                         => '',
+			'ldap_backup_host'                  => '',
+			'ldap_backup_port'                  => '',
+			'ldap_override_main_server'         => '',
+			'ldap_dn'                           => '',
+			'ldap_agent_password'               => '',
+			'ldap_base'                         => '',
+			'ldap_base_users'                   => '',
+			'ldap_base_groups'                  => '',
+			'ldap_userlist_filter'              => '',
+			'ldap_user_filter_mode'             => 0,
+			'ldap_userfilter_objectclass'       => '',
+			'ldap_userfilter_groups'            => '',
+			'ldap_login_filter'                 => '',
+			'ldap_login_filter_mode'            => 0,
+			'ldap_loginfilter_email'            => 0,
+			'ldap_loginfilter_username'         => 1,
+			'ldap_loginfilter_attributes'       => '',
+			'ldap_group_filter'                 => '',
+			'ldap_group_filter_mode'            => 0,
+			'ldap_groupfilter_objectclass'      => '',
+			'ldap_groupfilter_groups'           => '',
+			'ldap_display_name'                 => 'displayName',
+			'ldap_group_display_name'           => 'cn',
+			'ldap_tls'                          => 1,
+			'ldap_nocase'                       => 0,
+			'ldap_quota_def'                    => '',
+			'ldap_quota_attr'                   => '',
+			'ldap_email_attr'                   => '',
+			'ldap_group_member_assoc_attribute' => 'uniqueMember',
+			'ldap_cache_ttl'                    => 600,
+			'ldap_uuid_user_attribute'          => 'auto',
+			'ldap_uuid_group_attribute'         => 'auto',
+			'home_folder_naming_rule'           => '',
+			'ldap_turn_off_cert_check'          => 0,
+			'ldap_configuration_active'         => 0,
+			'ldap_attributes_for_user_search'   => '',
+			'ldap_attributes_for_group_search'  => '',
+			'ldap_expert_username_attr'         => '',
+			'ldap_expert_uuid_user_attr'        => '',
+			'ldap_expert_uuid_group_attr'       => '',
+			'has_memberof_filter_support'       => 0,
+			'last_jpegPhoto_lookup'             => 0,
+			'ldap_nested_groups'                => 0,
+			'ldap_paging_size'                  => 500,
+			'ldap_experienced_admin'            => 0,
 		);
 	}
 
@@ -400,50 +402,51 @@ class Configuration {
 	public function getConfigTranslationArray() {
 		//TODO: merge them into one representation
 		static $array = array(
-			'ldap_host'							=> 'ldapHost',
-			'ldap_port'							=> 'ldapPort',
-			'ldap_backup_host'					=> 'ldapBackupHost',
-			'ldap_backup_port'					=> 'ldapBackupPort',
-			'ldap_override_main_server' 		=> 'ldapOverrideMainServer',
-			'ldap_dn'							=> 'ldapAgentName',
-			'ldap_agent_password'				=> 'ldapAgentPassword',
-			'ldap_base'							=> 'ldapBase',
-			'ldap_base_users'					=> 'ldapBaseUsers',
-			'ldap_base_groups'					=> 'ldapBaseGroups',
-			'ldap_userfilter_objectclass' 		=> 'ldapUserFilterObjectclass',
-			'ldap_userfilter_groups'	 		=> 'ldapUserFilterGroups',
-			'ldap_userlist_filter'				=> 'ldapUserFilter',
-			'ldap_user_filter_mode'				=> 'ldapUserFilterMode',
-			'ldap_login_filter'					=> 'ldapLoginFilter',
-			'ldap_login_filter_mode'			=> 'ldapLoginFilterMode',
-			'ldap_loginfilter_email'			=> 'ldapLoginFilterEmail',
-			'ldap_loginfilter_username'			=> 'ldapLoginFilterUsername',
-			'ldap_loginfilter_attributes'		=> 'ldapLoginFilterAttributes',
-			'ldap_group_filter'					=> 'ldapGroupFilter',
-			'ldap_group_filter_mode'			=> 'ldapGroupFilterMode',
-			'ldap_groupfilter_objectclass'		=> 'ldapGroupFilterObjectclass',
-			'ldap_groupfilter_groups'			=> 'ldapGroupFilterGroups',
-			'ldap_display_name'					=> 'ldapUserDisplayName',
-			'ldap_group_display_name'			=> 'ldapGroupDisplayName',
-			'ldap_tls'							=> 'ldapTLS',
-			'ldap_nocase'						=> 'ldapNoCase',
-			'ldap_quota_def'					=> 'ldapQuotaDefault',
-			'ldap_quota_attr'					=> 'ldapQuotaAttribute',
-			'ldap_email_attr'					=> 'ldapEmailAttribute',
-			'ldap_group_member_assoc_attribute'	=> 'ldapGroupMemberAssocAttr',
-			'ldap_cache_ttl'					=> 'ldapCacheTTL',
-			'home_folder_naming_rule' 			=> 'homeFolderNamingRule',
-			'ldap_turn_off_cert_check' 			=> 'turnOffCertCheck',
-			'ldap_configuration_active' 		=> 'ldapConfigurationActive',
-			'ldap_attributes_for_user_search' 	=> 'ldapAttributesForUserSearch',
-			'ldap_attributes_for_group_search'	=> 'ldapAttributesForGroupSearch',
-			'ldap_expert_username_attr' 		=> 'ldapExpertUsernameAttr',
-			'ldap_expert_uuid_user_attr' 		=> 'ldapExpertUUIDUserAttr',
-			'ldap_expert_uuid_group_attr'		=> 'ldapExpertUUIDGroupAttr',
-			'has_memberof_filter_support'		=> 'hasMemberOfFilterSupport',
-			'last_jpegPhoto_lookup'				=> 'lastJpegPhotoLookup',
+			'ldap_host'                         => 'ldapHost',
+			'ldap_port'                         => 'ldapPort',
+			'ldap_backup_host'                  => 'ldapBackupHost',
+			'ldap_backup_port'                  => 'ldapBackupPort',
+			'ldap_override_main_server'         => 'ldapOverrideMainServer',
+			'ldap_dn'                           => 'ldapAgentName',
+			'ldap_agent_password'               => 'ldapAgentPassword',
+			'ldap_base'                         => 'ldapBase',
+			'ldap_base_users'                   => 'ldapBaseUsers',
+			'ldap_base_groups'                  => 'ldapBaseGroups',
+			'ldap_userfilter_objectclass'       => 'ldapUserFilterObjectclass',
+			'ldap_userfilter_groups'            => 'ldapUserFilterGroups',
+			'ldap_userlist_filter'              => 'ldapUserFilter',
+			'ldap_user_filter_mode'             => 'ldapUserFilterMode',
+			'ldap_login_filter'                 => 'ldapLoginFilter',
+			'ldap_login_filter_mode'            => 'ldapLoginFilterMode',
+			'ldap_loginfilter_email'            => 'ldapLoginFilterEmail',
+			'ldap_loginfilter_username'         => 'ldapLoginFilterUsername',
+			'ldap_loginfilter_attributes'       => 'ldapLoginFilterAttributes',
+			'ldap_group_filter'                 => 'ldapGroupFilter',
+			'ldap_group_filter_mode'            => 'ldapGroupFilterMode',
+			'ldap_groupfilter_objectclass'      => 'ldapGroupFilterObjectclass',
+			'ldap_groupfilter_groups'           => 'ldapGroupFilterGroups',
+			'ldap_display_name'                 => 'ldapUserDisplayName',
+			'ldap_group_display_name'           => 'ldapGroupDisplayName',
+			'ldap_tls'                          => 'ldapTLS',
+			'ldap_nocase'                       => 'ldapNoCase',
+			'ldap_quota_def'                    => 'ldapQuotaDefault',
+			'ldap_quota_attr'                   => 'ldapQuotaAttribute',
+			'ldap_email_attr'                   => 'ldapEmailAttribute',
+			'ldap_group_member_assoc_attribute' => 'ldapGroupMemberAssocAttr',
+			'ldap_cache_ttl'                    => 'ldapCacheTTL',
+			'home_folder_naming_rule'           => 'homeFolderNamingRule',
+			'ldap_turn_off_cert_check'          => 'turnOffCertCheck',
+			'ldap_configuration_active'         => 'ldapConfigurationActive',
+			'ldap_attributes_for_user_search'   => 'ldapAttributesForUserSearch',
+			'ldap_attributes_for_group_search'  => 'ldapAttributesForGroupSearch',
+			'ldap_expert_username_attr'         => 'ldapExpertUsernameAttr',
+			'ldap_expert_uuid_user_attr'        => 'ldapExpertUUIDUserAttr',
+			'ldap_expert_uuid_group_attr'       => 'ldapExpertUUIDGroupAttr',
+			'has_memberof_filter_support'       => 'hasMemberOfFilterSupport',
+			'last_jpegPhoto_lookup'             => 'lastJpegPhotoLookup',
 			'ldap_nested_groups'                => 'ldapNestedGroups',
 			'ldap_paging_size'                  => 'ldapPagingSize',
+			'ldap_experienced_admin'            => 'ldapExperiencedAdmin'
 		);
 		return $array;
 	}
diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php
index e7cdd0d926a338f4826f2bc07624fb5fc4a096e9..1e588b1cd8586adc0b76e60214b61e780048a196 100644
--- a/apps/user_ldap/settings.php
+++ b/apps/user_ldap/settings.php
@@ -26,6 +26,7 @@
 OC_Util::checkAdminUser();
 
 OCP\Util::addScript('user_ldap', 'ldapFilter');
+OCP\Util::addScript('user_ldap', 'experiencedAdmin');
 OCP\Util::addScript('user_ldap', 'settings');
 OCP\Util::addScript('core', 'jquery.multiselect');
 OCP\Util::addStyle('user_ldap', 'settings');
diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php
index e460997b1bf6e92d0b578f67a3aff69b48727e60..1953d2eaa6e0836084a8b83a1407f44b89e7c136 100644
--- a/apps/user_ldap/templates/part.wizard-groupfilter.php
+++ b/apps/user_ldap/templates/part.wizard-groupfilter.php
@@ -30,13 +30,16 @@
 			placeholder="<?php p($l->t('Raw LDAP filter'));?>"
 			title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>"
 			/>
+			<button class="ldapGetEntryCount hidden" name="ldapGetEntryCount" type="button">
+				<?php p($l->t('Test Filter'));?>
+			</button>
 		</p>
 		<p>
 			<div class="ldapWizardInfo invisible">&nbsp;</div>
 		</p>
-		<p>
+		<p class="ldap_count">
 			<span id="ldap_group_count">0 <?php p($l->t('groups found'));?></span>
 		</p>
 		<?php print_unescaped($_['wizardControls']); ?>
 	</div>
-</fieldset>
\ No newline at end of file
+</fieldset>
diff --git a/apps/user_ldap/templates/part.wizard-server.php b/apps/user_ldap/templates/part.wizard-server.php
index bee2b874178504cff2f3fc3bb6c2655e740bd783..c1744143f98b0a006a6abb4b0293f34cebbdb131 100644
--- a/apps/user_ldap/templates/part.wizard-server.php
+++ b/apps/user_ldap/templates/part.wizard-server.php
@@ -69,6 +69,16 @@
 				</textarea>
 			</div>
 
+			<div class="tablerow left">
+				<input type="checkbox" id="ldap_experienced_admin" value="1"
+					name="ldap_experienced_admin" class="tablecell lwautosave"
+					title="<?php p($l->t('Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.'));?>"
+					/>
+				<label for="ldap_experienced_admin" class="tablecell">
+					<?php p($l->t('Manually enter LDAP filters (recommended for large directories)'));?>
+				</label>
+			</div>
+
 			<div class="tablerow">
 				<div class="tablecell ldapWizardInfo invisible">&nbsp;
 				</div>
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php
index eff9f89ce2cf1f33840f4a7c0b9905c1d0af36aa..99a6e75370b4a4443d9bedf0cb3315ca5e945b92 100644
--- a/apps/user_ldap/templates/part.wizard-userfilter.php
+++ b/apps/user_ldap/templates/part.wizard-userfilter.php
@@ -30,13 +30,16 @@
 			placeholder="<?php p($l->t('Raw LDAP filter'));?>"
 			title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>"
 			/>
+			<button class="ldapGetEntryCount hidden" name="ldapGetEntryCount" type="button">
+				<?php p($l->t('Test Filter'));?>
+			</button>
 		</p>
 		<p>
 			<div class="ldapWizardInfo invisible">&nbsp;</div>
 		</p>
-		<p>
+		<p class="ldap_count">
 			<span id="ldap_user_count">0 <?php p($l->t('users found'));?></span>
 		</p>
 		<?php print_unescaped($_['wizardControls']); ?>
 	</div>
-</fieldset>
\ No newline at end of file
+</fieldset>
diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php
index 33e1614c9c64253411fc1a8525422b4c999e9135..90d558e72d1fe9dd5dff8dcdec97d8a34a847ef8 100644
--- a/apps/user_ldap/templates/part.wizardcontrols.php
+++ b/apps/user_ldap/templates/part.wizardcontrols.php
@@ -1,4 +1,5 @@
 <div class="ldapWizardControls">
+	<span class="ldap_saving hidden"><?php p($l->t('Saving'));?> <img class="wizSpinner" src="<?php p(image_path('core', 'loading.gif')); ?>"/></span>
 	<span class="ldap_config_state_indicator"></span> <span class="ldap_config_state_indicator_sign"></span>
 	<button class="ldap_action_back invisible" name="ldap_action_back"
 			type="button">