diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index d50d9aa9c5a8ca1847ef4f40ead1e759a1cdb608..445b50db09dfe12d26246d2263733b59b973fe36 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Jan-Christoph Borchardt
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
  This file is licensed under the Affero General Public License version 3 or later.
  See the COPYING-README file. */
 
diff --git a/apps/files_sharing/css/sharing.css b/apps/files_sharing/css/sharing.css
index db59a3d340b608f67ff895c2392a0ee48d2732a1..5acd9af589ad03a5461578783ad69865635dd28c 100644
--- a/apps/files_sharing/css/sharing.css
+++ b/apps/files_sharing/css/sharing.css
@@ -1,3 +1,7 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
 #dropdown { display:block;  position:absolute; z-index:100; width:16em; right:0; margin-right:7em; background:#eee; padding:1em;
 -moz-box-shadow:0 1px 1px #777; -webkit-box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777;
 -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em;
@@ -6,4 +10,4 @@
 #public { border-top:1px solid #ddd; padding-top:0.5em; }
 a.unshare { float:right; display:inline; margin:0 .5em; padding:.3em .3em 0 .3em !important; opacity:.5; }
 a.unshare:hover { opacity:1; }
-#share_with { width: 16em; }
\ No newline at end of file
+#share_with { width: 16em; }
diff --git a/apps/media/css/music.css b/apps/media/css/music.css
index 164a6c62ae6f0d0ee5e4840d1489772a1b3e99e7..c782e8afeeb2c87ea0afcb6f152b7503cc5d05fb 100644
--- a/apps/media/css/music.css
+++ b/apps/media/css/music.css
@@ -1,3 +1,7 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
 #controls ul.jp-controls { padding:0; }
 #controls ul.jp-controls li { display:inline; }
 #controls ul.jp-controls li a { position:absolute; padding:.8em 1em .8em 0; }
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index e5948459dd0ff89eca17b6ce4518ef74e2fbbf9a..fe0789cdeb7743fd58d50c8ebd5f96e11c1af2be 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -25,6 +25,7 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
 // 	//group specific settings
 	protected $ldapGroupFilter;
 	protected $ldapGroupDisplayName;
+	protected $ldapGroupMemberAttr;
 
 	public function __construct() {
 		$this->ldapGroupFilter      = OC_Appconfig::getValue('user_ldap', 'ldap_group_filter', '(objectClass=posixGroup)');
@@ -46,14 +47,12 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
 			LDAP_GROUP_MEMBER_ASSOC_ATTR.'='.$uid,
 			$this->ldapGroupDisplayName.'='.$gid
 		));
-		$groups = OC_LDAP::search($filter, $this->ldapGroupDisplayName);
+		$groups = $this->retrieveList($filter, $this->ldapGroupDisplayName);
 
-		if(count($groups) == 1) {
+		if(count($groups) > 0) {
 			return true;
-		} else if(count($groups) < 1) {
-			return false;
 		} else {
-			throw new Exception('Too many groups of the same name!? – this exception should never been thrown :)');
+			return false;
 		}
 	}
 
@@ -84,7 +83,7 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
 			$this->ldapGroupDisplayName.'='.$gid
 		));
 
-		return $this->retrieveList($filter, $this->ldapGroupMemberAttr);
+		return $this->retrieveList($filter, $this->ldapGroupMemberAttr, false);
 	}
 
 	/**
@@ -94,13 +93,7 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
 	 * Returns a list with all groups
 	 */
 	public function getGroups() {
-		$groups = OC_LDAP::search($this->ldapGroupFilter, $this->ldapGroupDisplayName);
-
-		if(count($groups) == 0 )
-			return array();
-		else {
-			return array_unique($groups, SORT_LOCALE_STRING);
-		}
+		return $this->retrieveList($this->ldapGroupFilter, $this->ldapGroupDisplayName);
 	}
 
 	/**
@@ -112,8 +105,13 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
 		return in_array($gid, $this->getGroups());
 	}
 
-	private function retrieveList($filter, $attr) {
-		$list = OC_LDAP::search($filter, $attr);
+	private function retrieveList($filter, $attr, $searchForGroups = true) {
+		if($searchForGroups) {
+			$list = OC_LDAP::searchGroups($filter, $attr);
+		} else {
+			$list = OC_LDAP::searchUsers($filter, $attr);
+		}
+
 
 		if(is_array($list)) {
 			return array_unique($list, SORT_LOCALE_STRING);
diff --git a/apps/user_ldap/lib_ldap.php b/apps/user_ldap/lib_ldap.php
index eea4a82011cd1a5067ee4b4381c45ea099bf69a1..752ac4f22896ead44605f084fafd866ce40bf435 100644
--- a/apps/user_ldap/lib_ldap.php
+++ b/apps/user_ldap/lib_ldap.php
@@ -38,6 +38,8 @@ class OC_LDAP {
 	static protected $ldapHost;
 	static protected $ldapPort;
 	static protected $ldapBase;
+	static protected $ldapBaseUsers;
+	static protected $ldapBaseGroups;
 	static protected $ldapAgentName;
 	static protected $ldapAgentPassword;
 	static protected $ldapTLS;
@@ -64,16 +66,41 @@ class OC_LDAP {
 		}
 	}
 
+	/**
+	 * @brief executes an LDAP search, optimized for Users
+	 * @param $filter the LDAP filter for the search
+	 * @param $attr optional, when a certain attribute shall be filtered out
+	 * @returns array with the search result
+	 *
+	 * Executes an LDAP search
+	 */
+	static public function searchUsers($filter, $attr = null) {
+		return self::search($filter, self::$ldapBaseUsers, $attr);
+	}
+
+	/**
+	 * @brief executes an LDAP search, optimized for Groups
+	 * @param $filter the LDAP filter for the search
+	 * @param $attr optional, when a certain attribute shall be filtered out
+	 * @returns array with the search result
+	 *
+	 * Executes an LDAP search
+	 */
+	static public function searchGroups($filter, $attr = null) {
+		return self::search($filter, self::$ldapBaseGroups, $attr);
+	}
+
 	/**
 	 * @brief executes an LDAP search
 	 * @param $filter the LDAP filter for the search
+	 * @param $base the LDAP subtree that shall be searched
 	 * @param $attr optional, when a certain attribute shall be filtered out
 	 * @returns array with the search result
 	 *
 	 * Executes an LDAP search
 	 */
-	static public function search($filter, $attr = null) {
-		$sr = ldap_search(self::getConnectionResource(), self::$ldapBase, $filter);
+	static private function search($filter, $base, $attr = null) {
+		$sr = ldap_search(self::getConnectionResource(), $base, $filter, array($attr));
 		$findings = ldap_get_entries(self::getConnectionResource(), $sr );
 
 		if(!is_null($attr)) {
@@ -150,7 +177,9 @@ class OC_LDAP {
 			self::$ldapPort            = OC_Appconfig::getValue('user_ldap', 'ldap_port', OC_USER_BACKEND_LDAP_DEFAULT_PORT);
 			self::$ldapAgentName       = OC_Appconfig::getValue('user_ldap', 'ldap_dn','');
 			self::$ldapAgentPassword   = OC_Appconfig::getValue('user_ldap', 'ldap_password','');
-			self::$ldapBase            = OC_Appconfig::getValue('user_ldap', 'ldap_base','');
+			self::$ldapBase            = OC_Appconfig::getValue('user_ldap', 'ldap_base', '');
+			self::$ldapBaseUsers       = OC_Appconfig::getValue('user_ldap', 'ldap_base_users',self::$ldapBase);
+			self::$ldapBaseGroups      = OC_Appconfig::getValue('user_ldap', 'ldap_base_groups', self::$ldapBase);
 			self::$ldapTLS             = OC_Appconfig::getValue('user_ldap', 'ldap_tls',0);
 			self::$ldapNoCase          = OC_Appconfig::getValue('user_ldap', 'ldap_nocase', 0);
 			self::$ldapUserDisplayName = OC_Appconfig::getValue('user_ldap', 'ldap_display_name', OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME);
@@ -163,6 +192,8 @@ class OC_LDAP {
 					|| ( empty(self::$ldapAgentName) &&  empty(self::$ldapAgentPassword))
 				)
 				&& !empty(self::$ldapBase)
+				&& !empty(self::$ldapBaseUsers)
+				&& !empty(self::$ldapBaseGroups)
 				&& !empty(self::$ldapUserDisplayName)
 			)
 			{
diff --git a/core/css/multiselect.css b/core/css/multiselect.css
index 1202ea18427163eea77791fdfd0d1d2814d00611..040b0f46ed33d4a788a08677430941389bce5f88 100644
--- a/core/css/multiselect.css
+++ b/core/css/multiselect.css
@@ -1,7 +1,11 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
 ul.multiselectoptions { z-index:49; position:absolute; background-color:#fff; padding-top:.5em; border:1px solid #ddd; border-top:none; -moz-border-radius-bottomleft:.5em; -webkit-border-bottom-left-radius:.5em; border-bottom-left-radius:.5em; -moz-border-radius-bottomright:.5em; -webkit-border-bottom-right-radius:.5em; border-bottom-right-radius:.5em; -moz-box-shadow:0 1px 1px #ddd; -webkit-box-shadow:0 1px 1px #ddd; box-shadow:0 1px 1px #ddd; }
 ul.multiselectoptions>li{ white-space:nowrap; overflow: hidden; }
-div.multiselect { padding-right:.6em; display:inline; position:relative; display:inline-block; vertical-align: bottom; }
+div.multiselect { padding-right:.6em; display:inline; position:relative; display:inline-block; vertical-align: bottom; min-width:100px; max-width:400px; }
 div.multiselect.active { background-color:#fff; border-bottom:none; border-bottom-left-radius:0; border-bottom-right-radius:0; z-index:50; position:relative }
-div.multiselect>span:first-child { margin-right:2em; float:left; }
-div.multiselect>span:last-child { float:right; position:relative }
+div.multiselect>span:first-child { margin-right:2em; float:left; width:90%; overflow:hidden; text-overflow:ellipsis; }
+div.multiselect>span:last-child { position:absolute; right:.8em; }
 ul.multiselectoptions input.new{ margin:0; padding-bottom:0.2em; padding-top:0.2em; border-top-left-radius:0; border-top-right-radius:0; }
diff --git a/core/css/styles.css b/core/css/styles.css
index ccebc984fbb91315fccd3018d166f5bd81c32135..945e5846683595cbb2c1b7ba8c98d1ff861162d4 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Jan-Christoph Borchardt
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
  This file is licensed under the Affero General Public License version 3 or later.
  See the COPYING-README file. */
 
diff --git a/lib/base.php b/lib/base.php
index 559d49ca997b889a27acad76f567ffff8fcc7355..97b363b1fa92a83d090a94b6ade8dca61fd48b58 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -88,6 +88,9 @@ class OC{
 		elseif(strpos($className,'OC_')===0){
 			require_once strtolower(str_replace('_','/',substr($className,3)) . '.php');
 		}
+		elseif(strpos($className,'OCP\\')===0){
+			require_once 'public/'.strtolower(str_replace('\\','/',substr($className,3)) . '.php');
+		}
 		elseif(strpos($className,'Sabre_')===0) {
 			require_once str_replace('_','/',$className) . '.php';
 		}
@@ -436,4 +439,4 @@ if(!function_exists('get_temp_dir')) {
 	}
 }
 
-OC::init();
\ No newline at end of file
+OC::init();
diff --git a/lib/public/util.php b/lib/public/util.php
new file mode 100644
index 0000000000000000000000000000000000000000..3425ed9df3b81404001d79ce35dd867f52d8028b
--- /dev/null
+++ b/lib/public/util.php
@@ -0,0 +1,60 @@
+<?php
+/**
+* ownCloud
+*
+* @author Frank Karlitschek
+* @copyright 2010 Frank Karlitschek karlitschek@kde.org
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * Public interface of ownCloud for apps to use.
+ * Utility Class.
+ *
+ */
+
+// use OCP namespace for all classes that are considered public. 
+// This means that they should be used by apps instead of the internal ownCloud classes
+namespace OCP;
+
+class Util {
+
+	/**
+	 * send an email 
+	 *
+	 * @param string $toaddress
+	 * @param string $toname
+	 * @param string $subject
+	 * @param string $mailtext
+	 * @param string $fromaddress
+	 * @param string $fromname
+	 * @param bool $html
+	 */
+	public static function sendmail($toaddress,$toname,$subject,$mailtext,$fromaddress,$fromname,$html=0,$altbody='',$ccaddress='',$ccname='',$bcc='') {
+
+		// call the internal mail class
+		OC_MAIL::send($toaddress,$toname,$subject,$mailtext,$fromaddress,$fromname,$html=0,$altbody='',$ccaddress='',$ccname='',$bcc='');
+
+	}
+
+
+
+}
+
+
+
+
+?>
diff --git a/search/css/results.css b/search/css/results.css
index 440e68ee48f74e02bdb5c62c73a9a5275dabd30f..40d5563e89e61491b9e8afb779bbb26608998dc3 100644
--- a/search/css/results.css
+++ b/search/css/results.css
@@ -1,3 +1,7 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
 #searchresults { list-style:none; position:fixed; top:3.5em; right:0; z-index:75; background-color:#fff; overflow:hidden; text-overflow:ellipsis; max-height:80%; width:26.5em; padding-bottom:1em; -moz-box-shadow:0 0 10px #000; -webkit-box-shadow:0 0 10px #000; box-shadow:0 0 10px #000; -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; }
 #searchresults li.resultHeader { font-size:1.2em; font-weight:bold; border-bottom:solid 1px #CCC; padding:.2em; background-color:#eee; }
 #searchresults li.result { margin-left:2em; }
diff --git a/settings/css/settings.css b/settings/css/settings.css
index 62e84654d5553c72ab20991aafe77c53509aab6a..36d9b8d26f9e77afcbab15cdfae19bdbfd3a41a2 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -1,3 +1,7 @@
+/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
+ This file is licensed under the Affero General Public License version 3 or later.
+ See the COPYING-README file. */
+
 select#languageinput, select#timezone { width:15em; }
 input#openid, input#webdav { width:20em; }