diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php
index f66d98a8ccbc4dcbdf2384aee54be55afaeb442e..44d4235b9b3a69384f251ce05a3b862499ad80b1 100644
--- a/apps/bookmarks/bookmarksHelper.php
+++ b/apps/bookmarks/bookmarksHelper.php
@@ -1,5 +1,52 @@
 <?php
 
+// Source: http://www.php.net/manual/de/function.curl-setopt.php#102121
+// This works around a safe_mode/open_basedir restriction
+function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
+	$mr = $maxredirect === null ? 5 : intval($maxredirect);
+	if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
+		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
+		curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
+	} else {
+		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
+		if ($mr > 0) {
+			$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
+
+			$rch = curl_copy_handle($ch);
+			curl_setopt($rch, CURLOPT_HEADER, true);
+			curl_setopt($rch, CURLOPT_NOBODY, true);
+			curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
+			curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
+			do {
+				curl_setopt($rch, CURLOPT_URL, $newurl);
+				$header = curl_exec($rch);
+				if (curl_errno($rch)) {
+					$code = 0;
+				} else {
+					$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
+					if ($code == 301 || $code == 302) {
+						preg_match('/Location:(.*?)\n/', $header, $matches);
+						$newurl = trim(array_pop($matches));
+					} else {
+						$code = 0;
+					}
+				}
+			} while ($code && --$mr);
+			curl_close($rch);
+			if (!$mr) {
+				if ($maxredirect === null) {
+					trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
+				} else {
+					$maxredirect = 0;
+				}
+				return false;
+			}
+			curl_setopt($ch, CURLOPT_URL, $newurl);
+		}
+	}
+	return curl_exec($ch);
+}
+
 function getURLMetadata($url) {
 	//allow only http(s) and (s)ftp
 	$protocols = '/^[hs]{0,1}[tf]{0,1}tp[s]{0,1}\:\/\//i';
@@ -12,13 +59,11 @@ function getURLMetadata($url) {
 	$ch = curl_init();
 	curl_setopt($ch, CURLOPT_URL, $url);
 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-	$page = curl_exec($ch);
+	$page = curl_exec_follow($ch);
 	curl_close($ch);
 
 	@preg_match( "/<title>(.*)<\/title>/si", $page, $match );
 	$metadata['title'] = htmlspecialchars_decode(@$match[1]); 
 
-	$meta = get_meta_tags($url);
-	
 	return $metadata;
 }
\ No newline at end of file
diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js
index 87954b7aac69ca18b3a774b8ec7cc5a38d5d65c6..efddac40426d4b1366364e6a7d11d52ecbafdaff 100644
--- a/apps/calendar/js/calendar.js
+++ b/apps/calendar/js/calendar.js
@@ -200,6 +200,7 @@ Calendar={
 					});
 				}
 			});
+			window.setTimeout("Calendar.UI.loadEvents(" + year + ")", 120000);
 		},
 		getEventsForDate:function(date){
 			var day = date.getDate();
diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css
index 1f95fdb2ad476f496e8b9c9885ac23117c1806ff..c1abd0efb62248da1dccae8e0f00437c359226d5 100644
--- a/apps/contacts/css/styles.css
+++ b/apps/contacts/css/styles.css
@@ -1,2 +1,3 @@
 .contacts_details_left {text-align:right;vertical-align:top;padding:2px;}
 .contacts_details_right {text-align:left;vertical-align:top;padding:2px;}
+#contacts_deletecard {position:absolute;top:15px;right:0;}
diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js
index 0fcfdeaab5df00dc7dbc375a7133de3d1869313e..2f4a736f55376554166bfb6d608066b1e718e9f9 100644
--- a/apps/contacts/js/interface.js
+++ b/apps/contacts/js/interface.js
@@ -1,11 +1,4 @@
 $(document).ready(function(){
-	/*-------------------------------------------------------------------------
-	 * Actions for startup
-	 *-----------------------------------------------------------------------*/
-	if( $('#leftcontent li').length > 0 ){
-		$('#leftcontent li').first().addClass('active');
-	}
-
 	/*-------------------------------------------------------------------------
 	 * Event handlers
 	 *-----------------------------------------------------------------------*/
diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php
index 6d67584b29ef625a0f3468bff99bc93850bdc8ce..98ebc1b0b36ea1845ba700cb0f74f0077f6bdac9 100644
--- a/apps/contacts/templates/index.php
+++ b/apps/contacts/templates/index.php
@@ -14,5 +14,5 @@ OC_Util::addStyle('contacts','styles');
 	</ul>
 </div>
 <div id="rightcontent" class="rightcontent" data-id="<?php echo $_['id']; ?>">
-	<?php echo $this->inc("part.details"); ?>
+	<?php echo $this->inc("part.addcardform"); ?>
 </div>
diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php
index 26a33739acb071167d34e67322593d6c633f9a72..438f84d45d4ca6d992eb739831d4806d521e94f0 100644
--- a/apps/contacts/templates/part.details.php
+++ b/apps/contacts/templates/part.details.php
@@ -28,7 +28,7 @@
 		<?php endforeach; ?>
 	</table>
 	<form>
-		<input type="button" id="contacts_deletecard" value="<?php echo $l->t('Delete');?>">
+		<img class="svg action" id="contacts_deletecard" src="<?php echo image_path('', 'actions/delete.svg'); ?>" title="<?php echo $l->t('Delete contact');?>" />
 		<input type="button" id="contacts_addproperty" value="<?php echo $l->t('Add Property');?>">
 	</form>
 <?php endif; ?>
diff --git a/apps/remoteStorage/compat.php b/apps/remoteStorage/compat.php
index d383e8795102fbae55012a912230525ff39a6a94..35a133c43c705e7bfb777444895d4d3dbf5b6bf1 100644
--- a/apps/remoteStorage/compat.php
+++ b/apps/remoteStorage/compat.php
@@ -44,7 +44,7 @@ if(isset($_SERVER['HTTP_ORIGIN'])) {
 	header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
 	header('Access-Control-Max-Age: 3600');
 	header('Access-Control-Allow-Methods: OPTIONS, GET, PUT, DELETE, PROPFIND');
-  	header('Access-Control-Allow-Headers: Authorization');
+  	header('Access-Control-Allow-Headers: Authorization, Content-Type');
 } else {
 	header('Access-Control-Allow-Origin: *');
 }
diff --git a/apps/user_webfinger/activate.php b/apps/user_webfinger/activate.php
deleted file mode 100644
index 50257232ae496a2e49b4132e5ee2a1bf2a84c6b1..0000000000000000000000000000000000000000
--- a/apps/user_webfinger/activate.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-$ownCloudBaseUri = substr($_SERVER['REQUEST_URI'],0, -(strlen('/apps/user_webfinger/activate.php')));
-$thisAppDir = __DIR__;
-$appsDir = dirname($thisAppDir);
-$ownCloudDir = dirname($appsDir);
-try{
-	symlink($thisAppDir, $ownCloudDir.'/.well-known');
-	echo "Webfinger should now work.\n";
-} catch(Exception $e) {
-	echo "Please create a file called '.well-known in the ownCloud root, give the web server user permission to change it, and retry.\n";
-}
diff --git a/apps/user_webfinger/appinfo/install.php b/apps/user_webfinger/appinfo/install.php
new file mode 100644
index 0000000000000000000000000000000000000000..079043cd102200a8378d55622f497f4e2154d447
--- /dev/null
+++ b/apps/user_webfinger/appinfo/install.php
@@ -0,0 +1,6 @@
+<?php
+$appInfoDir = __DIR__;
+$thisAppDir = dirname($appInfoDir);
+$appsDir = dirname($thisAppDir);
+$ownCloudDir = dirname($appsDir);
+symlink($thisAppDir, $ownCloudDir.'/.well-known');
diff --git a/index.php b/index.php
index 2e55827a62a9144ba0a1942196dc9d4bf6991b8f..4e1f5bcc8d6d9eb7f5458faf7e036aea255993eb 100644
--- a/index.php
+++ b/index.php
@@ -27,8 +27,16 @@ require_once('lib/base.php');
 
 // Setup required :
 $not_installed = !OC_Config::getValue('installed', false);
-$install_called = (isset($_POST['install']) AND $_POST['install']=='true');
 if($not_installed) {
+	// Check for autosetup:
+	$autosetup_file = OC::$SERVERROOT."/config/autoconfig.php";
+	if( file_exists( $autosetup_file )){
+		error_log("Autoconfig file found, setting up owncloud...");
+		include( $autosetup_file );
+		$_POST['install'] = 'true';
+		$_POST = array_merge ($_POST, $AUTOCONFIG);
+	        unlink($autosetup_file);
+	}
 	OC_Util::addScript('setup');
 	require_once('setup.php');
 	exit();
diff --git a/lib/util.php b/lib/util.php
index f8748e868c114ac02130ae99ebf49936fe9f3f62..4920d13914dd07935dc99c17c9bb790c82579fd6 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -90,7 +90,7 @@ class OC_Util {
 	 * @return array
 	 */
 	public static function getVersion(){
-		return array(1,92,0);
+		return array(2,90,0);
 	}
 
 	/**
@@ -98,7 +98,7 @@ class OC_Util {
 	 * @return string
 	 */
 	public static function getVersionString(){
-		return '2 beta 3';
+		return '3 alpha 1';
 	}
 
 	/**