diff --git a/apps/calendar/index.php b/apps/calendar/index.php
index b0aaa144495f082f0418835a1fb56fb76a6a07a2..e08264ec09f68b1218d10fc81e408a0704cdf8bf 100755
--- a/apps/calendar/index.php
+++ b/apps/calendar/index.php
@@ -22,12 +22,19 @@ if(!OC_USER::isLoggedIn()) {
 	header("Location: " . OC_HELPER::linkTo("", "index.php"));
 	exit;
 }
+
+// Create default calendar ...
+$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
+if( count($calendars) == 0){
+	OC_Calendar_Calendar::addCalendar(OC_User::getUser(),'default','Default calendar');
+	$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
+}
+
 OC_UTIL::addScript("calendar", "calendar");
 OC_UTIL::addScript("calendar", "calendar_init");
 OC_UTIL::addScript("calendar", "calendar_dialog");
 OC_UTIL::addStyle("calendar", "style");
-require_once ("template.php");
+
 OC_APP::setActiveNavigationEntry("calendar_index");
 $output = new OC_TEMPLATE("calendar", "calendar", "user");
-$output -> printpage();
-?>
\ No newline at end of file
+$output -> printPage();
diff --git a/apps/calendar/lib/PDO.php b/apps/calendar/lib/PDO.php
deleted file mode 100644
index d4c8520aa1f6d20779afa7b60077732f776064f4..0000000000000000000000000000000000000000
--- a/apps/calendar/lib/PDO.php
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-
-/**
- * PDO CalDAV backend
- *
- * This backend is used to store calendar-data in a PDO database, such as 
- * sqlite or MySQL
- * 
- * @package Sabre
- * @subpackage CalDAV
- * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
- * @author Evert Pot (http://www.rooftopsolutions.nl/) 
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract {
-    /**
-     * List of CalDAV properties, and how they map to database fieldnames
-     *
-     * Add your own properties by simply adding on to this array
-     * 
-     * @var array
-     */
-    public $propertyMap = array(
-        '{DAV:}displayname'                          => 'displayname',
-        '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description',
-        '{urn:ietf:params:xml:ns:caldav}calendar-timezone'    => 'timezone',
-        '{http://apple.com/ns/ical/}calendar-order'  => 'calendarorder',
-        '{http://apple.com/ns/ical/}calendar-color'  => 'calendarcolor',
-    );
-
-    /**
-     * Returns a list of calendars for a principal.
-     *
-     * Every project is an array with the following keys:
-     *  * id, a unique id that will be used by other functions to modify the
-     *    calendar. This can be the same as the uri or a database key.
-     *  * uri, which the basename of the uri with which the calendar is 
-     *    accessed.
-     *  * principalUri. The owner of the calendar. Almost always the same as
-     *    principalUri passed to this method.
-     *
-     * Furthermore it can contain webdav properties in clark notation. A very
-     * common one is '{DAV:}displayname'. 
-     *
-     * @param string $principalUri 
-     * @return array 
-     */
-    public function getCalendarsForUser($principalUri) {
-
-        $fields = array_values($this->propertyMap);
-        $fields[] = 'id';
-        $fields[] = 'uri';
-        $fields[] = 'ctag';
-        $fields[] = 'components';
-        $fields[] = 'principaluri';
-
-        // Making fields a comma-delimited list 
-        $fields = implode(', ', $fields);
-        $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM `".$this->calendarTableName."` WHERE principaluri = ?"); 
-        $stmt->execute(array($principalUri));
-
-        $calendars = array();
-        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
-
-            $components = explode(',',$row['components']);
-
-            $calendar = array(
-                'id' => $row['id'],
-                'uri' => $row['uri'],
-                'principaluri' => $row['principaluri'],
-                '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0',
-                '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components),
-            );
-        
-
-            foreach($this->propertyMap as $xmlName=>$dbName) {
-                $calendar[$xmlName] = $row[$dbName];
-            }
-
-            $calendars[] = $calendar;
-
-        }
-
-        return $calendars;
-
-    }
-
-    /**
-     * Creates a new calendar for a principal.
-     *
-     * If the creation was a success, an id must be returned that can be used to reference
-     * this calendar in other methods, such as updateCalendar
-     *
-     * @param string $principalUri
-     * @param string $calendarUri
-     * @param array $properties
-     * @return mixed
-     */
-    public function createCalendar($principalUri,$calendarUri, array $properties) {
-
-        $fieldNames = array(
-            'principaluri',
-            'uri',
-            'ctag',
-        );
-        $values = array(
-            ':principaluri' => $principalUri,
-            ':uri'          => $calendarUri,
-            ':ctag'         => 1,
-        );
-
-        // Default value
-        $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
-        $fieldNames[] = 'components';
-        if (!isset($properties[$sccs])) {
-            $values[':components'] = 'VEVENT,VTODO';
-        } else {
-            if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) {
-                throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet');
-            }
-            $values[':components'] = implode(',',$properties[$sccs]->getValue());
-        }
-
-        foreach($this->propertyMap as $xmlName=>$dbName) {
-            if (isset($properties[$xmlName])) {
-
-                $myValue = $properties[$xmlName];
-                $values[':' . $dbName] = $properties[$xmlName];
-                $fieldNames[] = $dbName;
-            }
-        }
-
-        $stmt = $this->pdo->prepare("INSERT INTO `".$this->calendarTableName."` (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")");
-        $stmt->execute($values);
-
-        return $this->pdo->lastInsertId();
-
-    }
-
-    /**
-     * Updates a calendars properties 
-     *
-     * The properties array uses the propertyName in clark-notation as key,
-     * and the array value for the property value. In the case a property
-     * should be deleted, the property value will be null.
-     *
-     * This method must be atomic. If one property cannot be changed, the
-     * entire operation must fail.
-     *
-     * If the operation was successful, true can be returned.
-     * If the operation failed, false can be returned.
-     *
-     * Deletion of a non-existant property is always succesful.
-     *
-     * Lastly, it is optional to return detailed information about any
-     * failures. In this case an array should be returned with the following
-     * structure:
-     *
-     * array(
-     *   403 => array(
-     *      '{DAV:}displayname' => null,
-     *   ),
-     *   424 => array(
-     *      '{DAV:}owner' => null,
-     *   )
-     * )
-     *
-     * In this example it was forbidden to update {DAV:}displayname. 
-     * (403 Forbidden), which in turn also caused {DAV:}owner to fail
-     * (424 Failed Dependency) because the request needs to be atomic.
-     *
-     * @param string $calendarId
-     * @param array $properties
-     * @return bool|array 
-     */
-    public function updateCalendar($calendarId, array $properties) {
-
-        $newValues = array();
-        $result = array(
-            200 => array(), // Ok
-            403 => array(), // Forbidden
-            424 => array(), // Failed Dependency
-        );
-
-        $hasError = false;
-
-        foreach($properties as $propertyName=>$propertyValue) {
-
-            // We don't know about this property. 
-            if (!isset($this->propertyMap[$propertyName])) {
-                $hasError = true;
-                $result[403][$propertyName] = null;
-                unset($properties[$propertyName]);
-                continue;
-            }
-
-            $fieldName = $this->propertyMap[$propertyName];
-            $newValues[$fieldName] = $propertyValue;
-                
-        }
-
-        // If there were any errors we need to fail the request
-        if ($hasError) {
-            // Properties has the remaining properties
-            foreach($properties as $propertyName=>$propertyValue) {
-                $result[424][$propertyName] = null;
-            }
-
-            // Removing unused statuscodes for cleanliness
-            foreach($result as $status=>$properties) {
-                if (is_array($properties) && count($properties)===0) unset($result[$status]);
-            }
-
-            return $result;
-
-        }
-
-        // Success
-
-        // Now we're generating the sql query.
-        $valuesSql = array();
-        foreach($newValues as $fieldName=>$value) {
-            $valuesSql[] = $fieldName . ' = ?';
-        }
-        $valuesSql[] = 'ctag = ctag + 1';
-
-        $stmt = $this->pdo->prepare("UPDATE `" . $this->calendarTableName . "` SET " . implode(', ',$valuesSql) . " WHERE id = ?");
-        $newValues['id'] = $calendarId; 
-        $stmt->execute(array_values($newValues));
-
-        return true; 
-
-    }
-
-    /**
-     * Delete a calendar and all it's objects 
-     * 
-     * @param string $calendarId 
-     * @return void
-     */
-    public function deleteCalendar($calendarId) {
-
-        $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?');
-        $stmt->execute(array($calendarId));
-
-        $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarTableName.'` WHERE id = ?');
-        $stmt->execute(array($calendarId));
-
-    }
-
-    /**
-     * Returns all calendar objects within a calendar object.
-     *
-     * Every item contains an array with the following keys:
-     *   * id - unique identifier which will be used for subsequent updates
-     *   * calendardata - The iCalendar-compatible calnedar data
-     *   * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
-     *   * lastmodified - a timestamp of the last modification time
-     *   * etag - An arbitrary string, surrounded by double-quotes. (e.g.: 
-     *   '  "abcdef"')
-     *   * calendarid - The calendarid as it was passed to this function.
-     *
-     * Note that the etag is optional, but it's highly encouraged to return for 
-     * speed reasons.
-     *
-     * The calendardata is also optional. If it's not returned 
-     * 'getCalendarObject' will be called later, which *is* expected to return 
-     * calendardata.
-     * 
-     * @param string $calendarId 
-     * @return array 
-     */
-    public function getCalendarObjects($calendarId) {
-
-        $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?');
-        $stmt->execute(array($calendarId));
-        return $stmt->fetchAll();
-
-    }
-
-    /**
-     * Returns information from a single calendar object, based on it's object
-     * uri.
-     *
-     * The returned array must have the same keys as getCalendarObjects. The 
-     * 'calendardata' object is required here though, while it's not required 
-     * for getCalendarObjects.
-     * 
-     * @param string $calendarId 
-     * @param string $objectUri 
-     * @return array 
-     */
-    public function getCalendarObject($calendarId,$objectUri) {
-
-        $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?');
-        $stmt->execute(array($calendarId, $objectUri));
-        return $stmt->fetch();
-
-    }
-
-    /**
-     * Creates a new calendar object. 
-     * 
-     * @param string $calendarId 
-     * @param string $objectUri 
-     * @param string $calendarData 
-     * @return void
-     */
-    public function createCalendarObject($calendarId,$objectUri,$calendarData) {
-
-        $stmt = $this->pdo->prepare('INSERT INTO `'.$this->calendarObjectTableName.'` (calendarid, uri, calendardata, lastmodified) VALUES (?,?,?,?)');
-        $stmt->execute(array($calendarId,$objectUri,$calendarData,time()));
-        $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?');
-        $stmt->execute(array($calendarId));
-
-    }
-
-    /**
-     * Updates an existing calendarobject, based on it's uri. 
-     * 
-     * @param string $calendarId 
-     * @param string $objectUri 
-     * @param string $calendarData 
-     * @return void
-     */
-    public function updateCalendarObject($calendarId,$objectUri,$calendarData) {
-
-        $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarObjectTableName.'` SET calendardata = ?, lastmodified = ? WHERE calendarid = ? AND uri = ?');
-        $stmt->execute(array($calendarData,time(),$calendarId,$objectUri));
-        $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?');
-        $stmt->execute(array($calendarId));
-
-    }
-
-    /**
-     * Deletes an existing calendar object. 
-     * 
-     * @param string $calendarId 
-     * @param string $objectUri 
-     * @return void
-     */
-    public function deleteCalendarObject($calendarId,$objectUri) {
-
-        $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?');
-        $stmt->execute(array($calendarId,$objectUri));
-        $stmt = $this->pdo->prepare('UPDATE `'. $this->calendarTableName .'` SET ctag = ctag + 1 WHERE id = ?');
-        $stmt->execute(array($calendarId));
-
-    }
-
-
-}
diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php
index b7f33b1396596700f6b68bd49fe3dc5d84e4a044..1bd203151cf6bc9e145703a68c42585d6945323d 100644
--- a/apps/calendar/lib/calendar.php
+++ b/apps/calendar/lib/calendar.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * ownCloud - Addressbook
+ * ownCloud - Calendar
  *
  * @author Jakob Sack
  * @copyright 2011 Jakob Sack mail@jakobsack.de
@@ -52,22 +52,22 @@
  */
 
 /**
- * This class manages our addressbooks.
+ * This class manages our calendars
  */
 class OC_Calendar_Calendar{
 	public static function allCalendars($uid){
 		$stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE userid = ?' );
 		$result = $stmt->execute(array($uid));
 		
-		$addressbooks = array();
+		$calendars = array();
 		while( $row = $result->fetchRow()){
-			$addressbooks[] = $row;
+			$calendars[] = $row;
 		}
 
-		return $addressbooks;
+		return $calendars;
 	}
 	
-	public static function allCakendarsWherePrincipalURIIs($principaluri){
+	public static function allCalendarsWherePrincipalURIIs($principaluri){
 		$uid = self::extractUserID($principaluri);
 		return self::allCalendars($uid);
 	}
@@ -79,8 +79,8 @@ class OC_Calendar_Calendar{
 		return $result->fetchRow();
 	}
 
-	public static function addAddressbook($userid,$name,$description){
-		$all = self::allAddressbooks($userid);
+	public static function addCalendar($userid,$name,$description,$components='VEVENT,VTODO',$timezone=null,$order=0,$color=null){
+		$all = self::allCalendars($userid);
 		$uris = array();
 		foreach($all as $i){
 			$uris[] = $i['uri'];
@@ -88,34 +88,35 @@ class OC_Calendar_Calendar{
 
 		$uri = self::createURI($name, $uris );
 
-		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' );
-		$result = $stmt->execute(array($userid,$name,$uri,$description,1));
+		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,description,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?,?)' );
+		$result = $stmt->execute(array($userid,$name,$uri,1,$description,$order,$color,$timezone,$components));
 
 		return OC_DB::insertid();
 	}
 
-	public static function addAddressbookFromDAVData($principaluri,$uri,$name,$description){
+	public static function addCalendarFromDAVData($principaluri,$uri,$name,$description,$components,$timezone,$order,$color){
 		$userid = self::extractUserID($principaluri);
 		
-		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' );
-		$result = $stmt->execute(array($userid,$name,$uri,$description,1));
+		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,description,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?,?)' );
+		$result = $stmt->execute(array($userid,$name,$uri,1,$description,$order,$color,$timezone,$components));
 
 		return OC_DB::insertid();
 	}
 
-	public static function editAddressbook($id,$name,$description){
+	public static function editCalendar($id,$name=null,$description=null,$components=null,$timezone=null,$order=null,$color=null){
 		// Need these ones for checking uri
-		$addressbook = self::find($id);
-
-		if(is_null($name)){
-			$name = $addressbook['name'];
-		}
-		if(is_null($description)){
-			$description = $addressbook['description'];
-		}
+		$calendar = self::find($id);
+
+		// Keep old stuff
+		if(is_null($name)) $name = $calendar['name'];
+		if(is_null($description)) $description = $calendar['description'];
+		if(is_null($components)) $components = $calendar['components'];
+		if(is_null($timezone)) $timezone = $calendar['timezone'];
+		if(is_null($order)) $order = $calendar['order'];
+		if(is_null($color)) $color = $calendar['color'];
 		
-		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?' );
-		$result = $stmt->execute(array($name,$description,$id));
+		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET displayname=?,description=?,calendarorder=?,calendarcolor=?,timezone=?,components=?,ctag=ctag+1 WHERE id=?' );
+		$result = $stmt->execute(array($name,$description,$order,$color,$timezone,$components,$id));
 
 		return true;
 	}
@@ -131,7 +132,7 @@ class OC_Calendar_Calendar{
 		$stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_calendars WHERE id = ?' );
 		$stmt->execute(array($id));
 		
-		$stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE addressbookid = ?' );
+		$stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ?' );
 		$stmt->execute(array($id));
 
 		return true;
@@ -141,12 +142,12 @@ class OC_Calendar_Calendar{
 		$stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' );
 		$result = $stmt->execute(array($id));
 
-		$addressbooks = array();
+		$calendarobjects = array();
 		while( $row = $result->fetchRow()){
-			$addressbooks[] = $row;
+			$calendarobjects[] = $row;
 		}
 
-		return $addressbooks;
+		return $calendarobjects;
 	}
 	
 	public static function findCalendarObject($id){
@@ -163,27 +164,30 @@ class OC_Calendar_Calendar{
 		return $result->fetchRow();
 	}
 
-	public static function addCard($id,$data){
+	public static function addCalendarObject($id,$data){
 		$object = Sabre_VObject_Reader::read($data);
 		list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object);
 
-		$fn = null;
 		$uri = null;
-		$card = Sabre_VObject_Reader::read($data);
-		foreach($card->children as $property){
-			if($property->name == 'FN'){
-				$fn = $property->value;
-			}
-			elseif(is_null($uri) && $property->name == 'UID' ){
-				$uri = $property->value.'.vcf';
-			}
+		if(is_null($uri)){
+			$uid = self::createUID();
+			$object->add('UID',$uid);
+			$data = $object->serialize();
+			$uri = $uid.'.ics';
+		}
+		else{
+			$uri = $uid.'.ics';
 		}
-		if(is_null($uri)) $uri = self::createUID().'.vcf';
 
-		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' );
-		$result = $stmt->execute(array($id,$fn,$data,$uri,time()));
+		$start = is_null($startdate)?null:$startdate->format('Y-m-d H:i:s');
+		$end = is_null($enddate)?null:$enddate->format('Y-m-d H:i:s');
+		$type = $object->name;
+		$time = time();
+		
+		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' );
+		$result = $stmt->execute(array($id,$type,$start,$end,$repeating,$summary,$data,$uri,$time));
 
-		self::touchAddressbook($id);
+		self::touchCalendar($id);
 
 		return OC_DB::insertid();
 	}
@@ -192,8 +196,14 @@ class OC_Calendar_Calendar{
 		$object = Sabre_VObject_Reader::read($data);
 		list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object);
 
-		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttye,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' );
-		$result = $stmt->execute(array($id,$object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,$uri,time()));
+		$start = is_null($startdate)?null:$startdate->format('Y-m-d H:i:s');
+		$end = is_null($enddate)?null:$enddate->format('Y-m-d H:i:s');
+		$type = $object->name;
+		$time = time();
+
+		$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' );
+		// $result = $stmt->execute(array($id,$type,$start,$end,$repeating,$summary,$data,$uri,$time));
+		$result = $stmt->execute(array($id,$type,'2011-08-17 14:00:00','2011-08-17 15:00:00',0,'baum',$data,$uri,$time));
 
 		self::touchCalendar($id);
 
@@ -206,7 +216,7 @@ class OC_Calendar_Calendar{
 		$object = Sabre_VObject_Reader::read($data);
 		list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object);
 
-		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET objecttye=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' );
+		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' );
 		$result = $stmt->execute(array($object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,time(),$id));
 
 		self::touchCalendar($id);
@@ -220,7 +230,7 @@ class OC_Calendar_Calendar{
 		$object = Sabre_VObject_Reader::read($data);
 		list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object);
 
-		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET objecttye=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' );
+		$stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' );
 		$result = $stmt->execute(array($object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,time(),$oldobject['id']));
 
 		self::touchCalendar($oldobject['calendarid']);
diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/connector_sabre.php
new file mode 100644
index 0000000000000000000000000000000000000000..199f5011f9fe1500f2ba20927ae2eec1b476f7c4
--- /dev/null
+++ b/apps/calendar/lib/connector_sabre.php
@@ -0,0 +1,291 @@
+<?php
+
+class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract {
+	/**
+	 * List of CalDAV properties, and how they map to database fieldnames
+	 *
+	 * Add your own properties by simply adding on to this array
+	 *
+	 * @var array
+	 */
+	public $propertyMap = array(
+		'{DAV:}displayname'						  => 'displayname',
+		'{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description',
+		'{urn:ietf:params:xml:ns:caldav}calendar-timezone'	=> 'timezone',
+		'{http://apple.com/ns/ical/}calendar-order'  => 'calendarorder',
+		'{http://apple.com/ns/ical/}calendar-color'  => 'calendarcolor',
+	);
+
+	/**
+	 * Returns a list of calendars for a principal.
+	 *
+	 * Every project is an array with the following keys:
+	 *  * id, a unique id that will be used by other functions to modify the
+	 *	calendar. This can be the same as the uri or a database key.
+	 *  * uri, which the basename of the uri with which the calendar is
+	 *	accessed.
+	 *  * principalUri. The owner of the calendar. Almost always the same as
+	 *	principalUri passed to this method.
+	 *
+	 * Furthermore it can contain webdav properties in clark notation. A very
+	 * common one is '{DAV:}displayname'.
+	 *
+	 * @param string $principalUri
+	 * @return array
+	 */
+	public function getCalendarsForUser($principalUri) {
+		$raw = OC_Calendar_Calendar::allCalendarsWherePrincipalURIIs($principalUri);
+		
+		$calendars = array();
+		foreach( $raw as $row ){
+			$components = explode(',',$row['components']);
+
+			$calendar = array(
+				'id' => $row['id'],
+				'uri' => $row['uri'],
+				'principaluri' => 'principals/'.$row['userid'],
+				'{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0',
+				'{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components),
+			);
+	
+			foreach($this->propertyMap as $xmlName=>$dbName) {
+				$calendar[$xmlName] = $row[$dbName];
+			}
+
+			$calendars[] = $calendar;
+		}
+		return $calendars;
+	}
+
+	/**
+	 * Creates a new calendar for a principal.
+	 *
+	 * If the creation was a success, an id must be returned that can be used to reference
+	 * this calendar in other methods, such as updateCalendar
+	 *
+	 * @param string $principalUri
+	 * @param string $calendarUri
+	 * @param array $properties
+	 * @return mixed
+	 */
+	public function createCalendar($principalUri,$calendarUri, array $properties) {
+		$fieldNames = array(
+			'principaluri',
+			'uri',
+			'ctag',
+		);
+		$values = array(
+			':principaluri' => $principalUri,
+			':uri'		  => $calendarUri,
+			':ctag'		 => 1,
+		);
+
+		// Default value
+		$sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+		$fieldNames[] = 'components';
+		if (!isset($properties[$sccs])) {
+			$values[':components'] = 'VEVENT,VTODO';
+		} else {
+			if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) {
+				throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet');
+			}
+			$values[':components'] = implode(',',$properties[$sccs]->getValue());
+		}
+
+		foreach($this->propertyMap as $xmlName=>$dbName) {
+			if (isset($properties[$xmlName])) {
+
+				$myValue = $properties[$xmlName];
+				$values[':' . $dbName] = $properties[$xmlName];
+				$fieldNames[] = $dbName;
+			}
+		}
+
+		if(!isset($newValues['displayname'])) $newValues['displayname'] = 'unnamed';
+		if(!isset($newValues['description'])) $newValues['description'] = '';
+		if(!isset($newValues['components'])) $newValues['components'] = 'VEVENT,VTODO';
+		if(!isset($newValues['timezone'])) $newValues['timezone'] = null;
+		if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = 0;
+		if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null;
+		
+		return OC_Calendar_Calendar::addCalendarFromDAVData($principalUri,$calendarUri,$newValues['displayname'],$newValues['description'],$newValues['components'],$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']);
+	}
+
+	/**
+	 * Updates a calendars properties
+	 *
+	 * The properties array uses the propertyName in clark-notation as key,
+	 * and the array value for the property value. In the case a property
+	 * should be deleted, the property value will be null.
+	 *
+	 * This method must be atomic. If one property cannot be changed, the
+	 * entire operation must fail.
+	 *
+	 * If the operation was successful, true can be returned.
+	 * If the operation failed, false can be returned.
+	 *
+	 * Deletion of a non-existant property is always succesful.
+	 *
+	 * Lastly, it is optional to return detailed information about any
+	 * failures. In this case an array should be returned with the following
+	 * structure:
+	 *
+	 * array(
+	 *   403 => array(
+	 *	  '{DAV:}displayname' => null,
+	 *   ),
+	 *   424 => array(
+	 *	  '{DAV:}owner' => null,
+	 *   )
+	 * )
+	 *
+	 * In this example it was forbidden to update {DAV:}displayname.
+	 * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+	 * (424 Failed Dependency) because the request needs to be atomic.
+	 *
+	 * @param string $calendarId
+	 * @param array $properties
+	 * @return bool|array
+	 */
+	public function updateCalendar($calendarId, array $properties) {
+
+		$newValues = array();
+		$result = array(
+			200 => array(), // Ok
+			403 => array(), // Forbidden
+			424 => array(), // Failed Dependency
+		);
+
+		$hasError = false;
+
+		foreach($properties as $propertyName=>$propertyValue) {
+
+			// We don't know about this property.
+			if (!isset($this->propertyMap[$propertyName])) {
+				$hasError = true;
+				$result[403][$propertyName] = null;
+				unset($properties[$propertyName]);
+				continue;
+			}
+
+			$fieldName = $this->propertyMap[$propertyName];
+			$newValues[$fieldName] = $propertyValue;
+	
+		}
+
+		// If there were any errors we need to fail the request
+		if ($hasError) {
+			// Properties has the remaining properties
+			foreach($properties as $propertyName=>$propertyValue) {
+				$result[424][$propertyName] = null;
+			}
+
+			// Removing unused statuscodes for cleanliness
+			foreach($result as $status=>$properties) {
+				if (is_array($properties) && count($properties)===0) unset($result[$status]);
+			}
+
+			return $result;
+
+		}
+
+		// Success
+		if(!isset($newValues['displayname'])) $newValues['displayname'] = null;
+		if(!isset($newValues['description'])) $newValues['description'] = null;
+		if(!isset($newValues['timezone'])) $newValues['timezone'] = null;
+		if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = null;
+		if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null;
+
+		OC_Calendar_Calendar::editCalendar($calendarId,$newValues['displayname'],$newValues['description'],null,$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']);
+
+		return true;
+
+	}
+
+	/**
+	 * Delete a calendar and all it's objects
+	 *
+	 * @param string $calendarId
+	 * @return void
+	 */
+	public function deleteCalendar($calendarId) {
+		OC_Calendar_Calendar::deleteCalendar($calendarId);
+	}
+
+	/**
+	 * Returns all calendar objects within a calendar object.
+	 *
+	 * Every item contains an array with the following keys:
+	 *   * id - unique identifier which will be used for subsequent updates
+	 *   * calendardata - The iCalendar-compatible calnedar data
+	 *   * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+	 *   * lastmodified - a timestamp of the last modification time
+	 *   * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+	 *   '  "abcdef"')
+	 *   * calendarid - The calendarid as it was passed to this function.
+	 *
+	 * Note that the etag is optional, but it's highly encouraged to return for
+	 * speed reasons.
+	 *
+	 * The calendardata is also optional. If it's not returned
+	 * 'getCalendarObject' will be called later, which *is* expected to return
+	 * calendardata.
+	 *
+	 * @param string $calendarId
+	 * @return array
+	 */
+	public function getCalendarObjects($calendarId) {
+		return OC_Calendar_Calendar::allCalendarObjects($calendarId);
+	}
+
+	/**
+	 * Returns information from a single calendar object, based on it's object
+	 * uri.
+	 *
+	 * The returned array must have the same keys as getCalendarObjects. The
+	 * 'calendardata' object is required here though, while it's not required
+	 * for getCalendarObjects.
+	 *
+	 * @param string $calendarId
+	 * @param string $objectUri
+	 * @return array
+	 */
+	public function getCalendarObject($calendarId,$objectUri) {
+		return OC_Calendar_Calendar::findCalendarObjectWhereDAVDataIs($calendarId,$objectUri);
+	}
+
+	/**
+	 * Creates a new calendar object.
+	 *
+	 * @param string $calendarId
+	 * @param string $objectUri
+	 * @param string $calendarData
+	 * @return void
+	 */
+	public function createCalendarObject($calendarId,$objectUri,$calendarData) {
+		OC_Calendar_Calendar::addCalendarObjectFromDAVData($calendarId,$objectUri,$calendarData);
+	}
+
+	/**
+	 * Updates an existing calendarobject, based on it's uri.
+	 *
+	 * @param string $calendarId
+	 * @param string $objectUri
+	 * @param string $calendarData
+	 * @return void
+	 */
+	public function updateCalendarObject($calendarId,$objectUri,$calendarData){
+		OC_Calendar_Calendar::editCalendarObjectFromDAVData($calendarId,$objectUri,$calendarData);
+	}
+
+	/**
+	 * Deletes an existing calendar object.
+	 *
+	 * @param string $calendarId
+	 * @param string $objectUri
+	 * @return void
+	 */
+	public function deleteCalendarObject($calendarId,$objectUri){
+		OC_Calendar_Calendar::deleteCalendarObjectFromDAVData($calendarID,$objectUri);
+	}
+}
diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php
index 60a8c23dac2cd2824e9078afe7283e4519d8ffe7..5c446102b2288a60a935c39284927e5b98952c82 100644
--- a/apps/calendar/lib/hooks.php
+++ b/apps/calendar/lib/hooks.php
@@ -33,7 +33,7 @@ class OC_Calendar_Hooks{
 		$calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']);
 		
 		foreach($calendars as $calendar) {
-			OC_Calendar_Calendar::deleteCalendar($addressbook['id']);
+			OC_Calendar_Calendar::deleteCalendar($calendar['id']);
 		}
 
 		return true;