diff --git a/apps/calendar/ajax/editeventform.php b/apps/calendar/ajax/editeventform.php
index 66b0b23568a119ad4d945350b7aab0e0a010ff6b..e2d32d03d3de0a5e763003e86ddc43fa23fab3ed 100644
--- a/apps/calendar/ajax/editeventform.php
+++ b/apps/calendar/ajax/editeventform.php
@@ -28,7 +28,7 @@ if($calendar['userid'] != OC_User::getUser()){
 $object = Sabre_VObject_Reader::read($data['calendardata']);
 $vevent = $object->VEVENT;
 $dtstart = $vevent->DTSTART;
-$dtend = $vevent->DTEND;
+$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
 switch($dtstart->getDateType()) {
 	case Sabre_VObject_Element_DateTime::LOCALTZ:
 	case Sabre_VObject_Element_DateTime::LOCAL:
@@ -55,6 +55,11 @@ if (isset($vevent->CATEGORIES)){
        $categories = explode(',', $vevent->CATEGORIES->value);
        $categories = array_map('trim', $categories);
 }
+foreach($categories as $category){
+	if (!in_array($category, $category_options)){
+		array_unshift($category_options, $category);
+	}
+}
 $repeat = isset($vevent->CATEGORY) ? $vevent->CATEGORY->value : '';
 $description = isset($vevent->DESCRIPTION) ? $vevent->DESCRIPTION->value : '';
 
diff --git a/apps/calendar/ajax/getcal.php b/apps/calendar/ajax/getcal.php
index 9794a83ce49f038ab148f74546442546d876bd24..7fa4f87cd3136ce3b14aca1a46174f242cc57f36 100644
--- a/apps/calendar/ajax/getcal.php
+++ b/apps/calendar/ajax/getcal.php
@@ -10,6 +10,60 @@ require_once ("../../../lib/base.php");
 if(!OC_USER::isLoggedIn()) {
 	die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
 }
-$output = new OC_TEMPLATE("calendar", "part.getcal");
-$output -> printpage();
-?>
+
+$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
+$events = array();
+$return = array('calendars'=>array());
+foreach($calendars as $calendar) {
+	$tmp = OC_Calendar_Object::all($calendar['id']);
+	$events = array_merge($events, $tmp);
+	$return['calendars'][$calendar['id']] = array(
+		'displayname' => $calendar['displayname'],
+		'color'       => $calendar['calendarcolor']
+	);
+}
+
+$select_year = $_GET["year"];
+$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London");
+foreach($events as $event)
+{
+	if ($select_year != substr($event['startdate'], 0, 4))
+		continue;
+	$object = Sabre_VObject_Reader::read($event['calendardata']);
+	$vevent = $object->VEVENT;
+	$dtstart = $vevent->DTSTART;
+	$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
+	$start_dt = $dtstart->getDateTime();
+	$start_dt->setTimezone(new DateTimeZone($user_timezone));
+	$end_dt = $dtend->getDateTime();
+	$end_dt->setTimezone(new DateTimeZone($user_timezone));
+	$year  = $start_dt->format('Y');
+	$month = $start_dt->format('n') - 1; // return is 0 based
+	$day   = $start_dt->format('j');
+	$hour  = $start_dt->format('G');
+	if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
+		$hour = 'allday';
+	}
+
+	$return_event = array();
+	foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop)
+	{
+		$return_event[$prop] = $event[$prop];
+	}
+	$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
+	$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
+	$return_event['description'] = $event['summary'];
+	if ($hour == 'allday')
+	{
+		$return_event['allday'] = true;
+	}
+	if (isset($return[$year][$month][$day][$hour]))
+	{
+		$return[$year][$month][$day][$hour][] = $return_event;
+	}
+	else
+	{
+		$return[$year][$month][$day][$hour] = array(1 => $return_event);
+	}
+}
+OC_JSON::encodedPrint($return);
diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php
index 0c7649776d598d64af05bbde08d6a8b91fc81b51..0c3e497d4f2e71d3bbc110b5ddaac59365a6b3d8 100644
--- a/apps/calendar/lib/object.php
+++ b/apps/calendar/lib/object.php
@@ -286,6 +286,30 @@ class OC_Calendar_Object{
 		}
 	}
 
+	public static function getDTEndFromVEvent($vevent)
+	{
+		if ($vevent->DTEND) {
+			$dtend = $vevent->DTEND;
+		}else{
+			$dtend = clone $vevent->DTSTART;
+			if ($vevent->DURATION){
+				$duration = strval($vevent->DURATION);
+				$invert = 0;
+				if ($duration[0] == '-'){
+					$duration = substr($duration, 1);
+					$invert = 1;
+				}
+				if ($duration[0] == '+'){
+					$duration = substr($duration, 1);
+				}
+				$interval = new DateInterval($duration);
+				$interval->invert = $invert;
+				$dtend->getDateTime()->add($interval);
+			}
+		}
+		return $dtend;
+	}
+
 	public static function getCategoryOptions($l10n)
 	{
 		return array(
@@ -482,6 +506,7 @@ class OC_Calendar_Object{
 		}
 		$vevent->DTSTART = $dtstart;
 		$vevent->DTEND = $dtend;
+		unset($vevent->DURATION);
 
 		if($location != ""){
 			$vevent->LOCATION = $location;
diff --git a/apps/calendar/templates/part.getcal.php b/apps/calendar/templates/part.getcal.php
deleted file mode 100644
index af29a3e369c3e6702a7955762530e1333e7bf8a2..0000000000000000000000000000000000000000
--- a/apps/calendar/templates/part.getcal.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
-$events = array();
-$return = array('calendars'=>array());
-foreach($calendars as $calendar) {
-	$tmp = OC_Calendar_Object::all($calendar['id']);
-	$events = array_merge($events, $tmp);
-	$return['calendars'][$calendar['id']] = array(
-		'displayname' => $calendar['displayname'],
-		'color'       => $calendar['calendarcolor']
-	);
-}
-$select_year = $_GET["year"];
-$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London");
-foreach($events as $event)
-{
-	if ($select_year != substr($event['startdate'], 0, 4))
-		continue;
-	$start_dt = new DateTime($event['startdate'], new DateTimeZone('UTC'));
-	$start_dt->setTimezone(new DateTimeZone($user_timezone));
-	$end_dt = new DateTime($event['enddate'], new DateTimeZone('UTC'));
-	$end_dt->setTimezone(new DateTimeZone($user_timezone));
-	$year  = $start_dt->format('Y');
-	$month = $start_dt->format('n') - 1; // return is 0 based
-	$day   = $start_dt->format('j');
-	$hour  = $start_dt->format('G');
-
-	// hack
-	if (strstr($event['calendardata'], 'DTSTART;VALUE=DATE:')) {
-		$hour = 'allday';
-	}
-	$return_event = array();
-	foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop)
-	{
-		$return_event[$prop] = $event[$prop];
-	}
-	$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
-	$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
-	$return_event['description'] = $event['summary'];
-	if ($hour == 'allday')
-	{
-		$return_event['allday'] = true;
-	}
-	if (isset($return[$year][$month][$day][$hour]))
-	{
-		$return[$year][$month][$day][$hour][] = $return_event;
-	}
-	else
-	{
-		$return[$year][$month][$day][$hour] = array(1 => $return_event);
-	}
-}
-OC_JSON::encodedPrint($return);
-?>