diff --git a/apps/calendar/ajax/getcal.php b/apps/calendar/ajax/getcal.php
index a65c6cf2602192808f0b0109e1cfb2400178a047..3d43677075f7da0871ab635d9a266f3aa26f1d0d 100644
--- a/apps/calendar/ajax/getcal.php
+++ b/apps/calendar/ajax/getcal.php
@@ -28,43 +28,674 @@ $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))
+	if($select_year != substr($event['startdate'], 0, 4) && $event["repeating"] == false)
 		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';
-	}
+	if($select_year == substr($event['startdate'], 0, 4) && $event["repeating"] == false){
+		$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;
+		$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);
+		}
 	}
-	else
-	{
-		$return[$year][$month][$day][$hour] = array(1 => $return_event);
+	if($event["repeating"] == 1){
+		$object = Sabre_VObject_Reader::read($event['calendardata']);
+		$vevent = $object->VEVENT;
+		//echo substr_count($event["calendardata"], "EXDATE");
+		$numofelements = substr_count($vevent->RRULE, ";");
+		$properties = array("FREQ"=>"false", "UNTIL"=>"false", "COUNT"=>"false", "INTERVAL"=>"false", "BYDAY"=>"false", "BYMONTHDAY"=>"false", "BYWEEKNO"=>"false", "BYMONTH"=>"false", "BYYEARDAY"=>"false", "BYSETPOS"=>"false");
+		$exruleproperties = array("FREQ"=>"false", "UNTIL"=>"false", "COUNT"=>"false", "INTERVAL"=>"false", "BYDAY"=>"false", "BYMONTHDAY"=>"false", "BYWEEKNO"=>"false", "BYMONTH"=>"false", "BYYEARDAY"=>"false", "BYSETPOS"=>"false");
+		$byday = array("MO"=>"false", "TU"=>"false", "WE"=>"false", "TH"=>"false", "FR"=>"false", "SA"=>"false", "SU"=>"false");
+		if($numofelements !=  0){
+			$rrule = explode(";", $vevent->RRULE);
+			for($i = 0;$i <= $numofelements;$i++){
+				$rule = explode("=", $rrule[$i]);
+				$property = $rule[0];
+				$value = $rule[1];
+				$properties[$property] = $value;
+			}
+			if($properties["BYDAY"] != "false"){
+				$numofdays = substr_count($properties["BYDAY"], ",");
+				if($numofdays == 0){
+					if(strlen($properties["BYDAY"]) != 2){
+						$lenght = strlen($properties["BYDAY"]);
+						switch($lenght){
+							case "3":
+								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,1);
+								$properties["BYDAY"] = substr($properties["BYDAY"],1,2);
+								break;
+							case "4":
+								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,2);
+								$properties["BYDAY"] = substr($properties["BYDAY"],2,2);
+								break;
+							case "5":
+								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,3);
+								$properties["BYDAY"] = substr($properties["BYDAY"],3,2);
+								break;
+							case "6":
+								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,4);
+								$properties["BYDAY"] = substr($properties["BYDAY"],4,2);
+								break;
+						}
+					}
+					$byday[$properties["BYDAY"]] = true;
+					
+				}else{
+					$days = explode(",", $properties["BYDAY"]);
+					for($i = 0;$i <= $numofdays;$i++){
+						$day = $days[$i];
+						$byday[$day] = true;
+					}
+				}
+			}
+		}else{
+			$rule = explode("=", $vevent->RRULE);
+			$properties[$rule[0]] = $rule[1];
+		}
+		if($properties["INTERVAL"] == "false"){
+				$properties["INTERVAL"] = 1;
+		}
+		$count = 0; //counts all loops
+		$countedoutputs = 0; //counts only the outputs
+		$countchecker = true;
+		$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));
+		$firststart_year  = $start_dt->format('Y');
+		$firststart_month = $start_dt->format('n');
+		$firststart_day   = $start_dt->format('j');
+		$hour  = $start_dt->format('G');
+		$interval = 0;
+		if($properties["UNTIL"] != "false"){
+			$until = $properties["UNTIL"];
+			$until_year = substr($until, 0, 4);
+			$until_month = substr($until, 4, 2);
+			$until_day = substr($until, 6, 2);
+		}
+		//print_r($properties);
+		//print_r($byday);
+		if($properties["FREQ"] == "DAILY"){
+			if($properties["BYDAY"] == "false"){
+				$byday = array("MO"=>"1", "TU"=>"1", "WE"=>"1", "TH"=>"1", "FR"=>"1", "SA"=>"1", "SU"=>"1");
+			}
+			while(date("Y", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)) <= $select_year && $countchecker == true){
+				if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)), 0, 2))] == "1"){
+					$newunixtime = mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval);
+					$year  = date("Y", $newunixtime);
+					$month = date("n", $newunixtime) - 1; // return is 0 based
+					$day   = date("j", $newunixtime);
+					if($properties["UNTIL"] != "false"){
+						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+							break;
+						}
+					}
+					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'];
+					$interval = $properties["INTERVAL"];
+					$countedoutputs++;
+					if($properties["COUNT"] != "false"){
+						if($countedoutputs == $properties["COUNT"]){
+							$countchecker = false;
+						}
+					}
+					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);
+					}
+				}
+				$count++;
+			}
+		}
+		if($properties["FREQ"] == "WEEKLY"){
+			if($properties["BYDAY"] == "false"){
+				$byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year)), 0, 2))] = "1";
+			}
+			while(date("Y", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)) <= $select_year && $countchecker == true){
+				if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)), 0, 2))] == "1"){
+					$newunixtime = mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval);
+					$year  = date("Y", $newunixtime);
+					$month = date("n", $newunixtime) - 1; // return is 0 based
+					$day   = date("j", $newunixtime);
+					if($properties["UNTIL"] != "false"){
+						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+							break;
+						}
+					}
+					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'];
+					$interval = $properties["INTERVAL"];
+					$countedoutputs++;
+					if($properties["COUNT"] != "false"){
+						if($countedoutputs == $properties["COUNT"]){
+							$countchecker = false;
+						}
+					}
+					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);
+					}
+				}
+				$count++;
+			}
+		}
+		if($properties["FREQ"] == "MONTHLY"){
+			if(substr_count($properties["BYMONTHDAY"], ",") != 0){
+				$numofBYMONTHDAY = substr_count($properties["BYMONTHDAY"], ",");
+				if($numofBYMONTHDAY == 0){
+					$BYMONTHDAY = array();
+					$BYMONTHDAY[0] = $properties["BYMONTHDAY"];
+				}else{
+					$BYMONTHDAY = explode(",", $properties["BYMONTHDAY"]);
+				}
+				while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year)) <= $select_year && $countchecker == true){
+					for($i = 0;$i <= $numofBYMONTHDAY;$i++){
+						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $BYMONTHDAY[$i], $firststart_year);
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+					}
+					$count++;
+				}
+			}
+			//if($properties["BYMONTHDAY"] != "false"){
+				if($properties["BYSETPOS"] == "false"){
+					while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year)) <= $select_year && $countchecker == true){
+						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year);
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+						$count++;
+					}
+				}else{
+					if(!is_nan($properties["BYSETPOS"]) && $properties["BYSETPOS"] >= 1){
+						while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
+							$lastdayofmonth = date("t", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year));
+							$matches = 0;
+							$matchedday = "";
+							for($i = 1;$i <= $lastdayofmonth;$i++){
+								$thisday = date("j", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year));
+								$thisdayname = strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year)),0,2));
+								//echo $thisdayname . " " . $thisday . "\n"; 
+								if($byday[$thisdayname] == 1){
+									$matches++;
+								}
+								if($matches == $properties["BYSETPOS"]){
+									$matchedday = $thisday;
+									$i = 32;
+								}
+							}
+							$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
+							$year  = date("Y", $newunixtime);
+							$month = date("n", $newunixtime) - 1; // return is 0 based
+							$day   = $matchedday;
+							if($properties["UNTIL"] != "false"){
+								if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+									break;
+								}
+							}
+							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'];
+							$interval = $properties["INTERVAL"];
+							$countedoutputs++;
+							if($properties["COUNT"] != "false"){
+								if($countedoutputs == $properties["COUNT"]){
+									$countchecker = false;
+								}
+							}
+							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);
+							}
+							$count++;
+						}
+					}elseif(!is_nan($properties["BYSETPOS"]) && $properties["BYSETPOS"] <= -1){
+						while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
+							$lastdayofmonth = date("t", mktime(0,0,0, $firststart_month + ($count * $interval), 1, $firststart_year));
+							$matches = 0;
+							$matchedday = "";
+							for($i = $lastdayofmonth;$i >= 1;$i--){
+								$thisday = date("j", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year));
+								$thisdayname = strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year)),0,2));
+								//echo $thisdayname . " " . $thisday . "\n"; 
+								if($byday[$thisdayname] == 1){
+									$matches++;
+								}
+								if($matches == $properties["BYSETPOS"]){
+									$matchedday = $thisday;
+									$i = 0;
+								}
+							}
+							$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
+							$year  = date("Y", $newunixtime);
+							$month = date("n", $newunixtime) - 1; // return is 0 based
+							$day   = $matchedday;
+							if($properties["UNTIL"] != "false"){
+								if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+									break;
+								}
+							}
+							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'];
+							$interval = $properties["INTERVAL"];
+							$countedoutputs++;
+							if($properties["COUNT"] != "false"){
+								if($countedoutputs == $properties["COUNT"]){
+									$countchecker = false;
+								}
+							}
+							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);
+							}
+							$count++;
+						}
+					//}
+				}
+			}
+			if(strlen($properties["BYDAY"]) == 2){
+				while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
+					if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)), 0, 2))] == "1"){
+						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+					}
+					$count++;
+				}
+			}else{
+				while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
+					$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
+					$year  = date("Y", $newunixtime);
+					$month = $month - 1; // return is 0 based
+					$day   = $dateofweekone;
+					if($properties["UNTIL"] != "false"){
+						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+							break;
+						}
+					}
+					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'];
+					$interval = $properties["INTERVAL"];
+					$countedoutputs++;
+					if($properties["COUNT"] != "false"){
+						if($countedoutputs == $properties["COUNT"]){
+							$countchecker = false;
+						}
+					}
+					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);
+					}
+					$count++;
+				}
+			}
+		}
+		if($properties["FREQ"] == "YEARLY"){
+			if($properties["BYMONTH"] != "false"){
+				if($properties["BYMONTHDAY"] == false){
+					$properties["BYMONTHDAY"] = date("j", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year));
+				}
+				if($properties["BYDAY"] == "false"){
+					while(date("Y", mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
+						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+						$count++;
+					}
+				}
+				if(strlen($properties["BYDAY"]) == 2){
+					while(date("Y", mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
+						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+						$count++;
+					}
+				}else{
+					$number = substr($properties["BYDAY"],0,1);
+					$weekday = substr($properties["BYDAY"],1,2);
+					$month = $properties["BYMONTH"];
+					$dateofweekone = "";
+					for($i = 0; $i <= 7;$i++){
+						if(strtoupper(substr(date("D", mktime(0,0,0, $properties["BYMONTH"], $i, $select_year)), 0, 2)) == $weekday){
+							$dateofweekone = date("j", mktime(0,0,0, $properties["BYMONTH"], $i, $select_year));
+							$i = 8;
+						}
+					}
+					if($number != 1){
+						$dateofweekone = $dateofweekone + (7 * ($number - 1));
+					}
+					while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
+						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
+						$year  = date("Y", $newunixtime);
+						$month = $month - 1; // return is 0 based
+						$day   = $dateofweekone;
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+						$count++;
+					}
+				}
+			}elseif($properties["BYYEARDAY"] != false){
+				$numofyeardays = substr_count($properties["BYYEARDAY"], ",");
+				if($numofyeardays == 0){
+					$yeardays = array();
+					$yeardays[0] = $properties["BYYEARDAY"];
+				}else{
+					$yeardays = explode(",", $properties["BYYEARDAY"]);
+				}
+				while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval)) + ($yeardays[$numofyeardays]-1) * 86400) <= $select_year && $countchecker == true){
+					for($i = 0;$i <= $numofyeardays;$i++){
+						$newunixtime = mktime(0,0,0, 1, 1, $firststart_year + ($count * $interval)) + ($yeardays[$i] -1) * 86400;
+						$year  = date("Y", $newunixtime);
+						$month = date("n", $newunixtime) - 1; // return is 0 based
+						$day   = date("j", $newunixtime);
+						if($properties["UNTIL"] != "false"){
+							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
+								break;
+							}
+						}
+						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'];
+						$interval = $properties["INTERVAL"];
+						$countedoutputs++;
+						if($properties["COUNT"] != "false"){
+							if($countedoutputs == $properties["COUNT"]){
+								$countchecker = false;
+							}
+						}
+						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);
+						}
+					}
+					$count++;
+				}
+			}
+		}
 	}
 }
 OC_JSON::encodedPrint($return);
diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css
index ca9f3274e3c422c09668205ced9ad781f36088b2..14b7d45523eac995920a4614e87efe0d87f727a7 100644
--- a/apps/calendar/css/style.css
+++ b/apps/calendar/css/style.css
@@ -59,4 +59,4 @@ select#category{width:140px;}
 button.category{margin:0 3px;}
 
 .calendar-colorpicker-color{display:inline-block;width:20px;height:20px;margin-right:2px;cursor:pointer;}
-.calendar-colorpicker-color.active{background-image:url("../../../core/img/jquery-ui/ui-icons_222222_256x240.png");background-position:-62px -143px;}
+.calendar-colorpicker-color.active{background-image:url("../../../core/img/actions/selected.svg");background-position:2px 2px;}
diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php
index afc35bf7f3774b6bdc68b8c976feadae252f338b..4f5092839392af8da45b6d740c094adca2fb5887 100644
--- a/apps/calendar/templates/settings.php
+++ b/apps/calendar/templates/settings.php
@@ -25,7 +25,7 @@ OC_UTIL::addStyle('', 'jquery.multiselect');
                         if ($continent!="") echo '</optgroup>';
                         echo '<optgroup label="'.$ex[0].'">';
                     endif;
-                    $city=$ex[1];
+					$city=strtr($ex[1], '_', ' ');
                     $continent=$ex[0];
                     echo '<option value="'.$timezone.'"'.($_['timezone'] == $timezone?' selected="selected"':'').'>'.$city.'</option>';
                 endforeach;?>
diff --git a/apps/gallery/ajax/cover.php b/apps/gallery/ajax/cover.php
index 44d73028510010e92c83868e997aa65417c7dcbc..d83f4daaa52ef0f0fac5f6b58b4aef2e9f33ec0e 100644
--- a/apps/gallery/ajax/cover.php
+++ b/apps/gallery/ajax/cover.php
@@ -1,5 +1,7 @@
 <?php
 require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 
 function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSrc is a FILE - Returns an image resource.
     //getting the image dimensions  
@@ -36,11 +38,6 @@ function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSr
     return $thumb;
 }
 
-// Check if we are a user
-if( !OC_User::isLoggedIn()){
-	echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.')));
-	exit();
-}
 $box_size = 200;
 $album_name = $_GET['album'];
 $x = $_GET['x'];
diff --git a/apps/gallery/ajax/createAlbum.php b/apps/gallery/ajax/createAlbum.php
index 3a490bdc3bd35d83db91fd8c260202e978271f4f..610f761b72ac0d8f967fcf19ba1f6f4f353be1b3 100644
--- a/apps/gallery/ajax/createAlbum.php
+++ b/apps/gallery/ajax/createAlbum.php
@@ -1,14 +1,11 @@
 <?php
 require_once('../../../lib/base.php');
-
-if( !OC_User::isLoggedIn()){
-	echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.')));
-	exit();
-}
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 
 $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums ("uid_owner", "album_name") VALUES ("'.OC_User::getUser().'", "'.$_GET['album_name'].'")');
 $stmt->execute(array());
 
-echo json_encode(array( 'status' => 'success', 'name' => $_GET['album_name']));
+OC_JSON::success(array('name' => $_GET['album_name']));
 
 ?>
diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php
index 2829dae81f3f0ad0bac54e4e83c1570e770a628e..38bea74636fb0e0604e2ac624fbf61324d579ffa 100644
--- a/apps/gallery/ajax/getAlbums.php
+++ b/apps/gallery/ajax/getAlbums.php
@@ -1,10 +1,7 @@
 <?php
 require_once('../../../lib/base.php');
-
-if (!OC_User::IsLoggedIn()) {
-  echo json_encode(array('status' => 'error', 'message' => 'You need to log in'));
-  exit();
-}
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 
 $a = array();
 $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE `uid_owner` = ?');
@@ -17,6 +14,6 @@ while ($r = $result->fetchRow()) {
   $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10));
 }
 
-echo json_encode(array('status'=>'success', 'albums'=>$a));
+OC_JSON::success(array('albums'=>$a));
 
 ?>
diff --git a/apps/gallery/ajax/getCovers.php b/apps/gallery/ajax/getCovers.php
index 57737f2fdd65963577068b6ab1e9ce0766df4049..6b2224b5f01daa35d1fe03ac99d5c432811a782e 100644
--- a/apps/gallery/ajax/getCovers.php
+++ b/apps/gallery/ajax/getCovers.php
@@ -1,5 +1,7 @@
 <?php
 require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 
 function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height, $tgtImg, $shift) { 
     //getting the image dimensions
@@ -38,11 +40,6 @@ function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height, $tgtImg, $
     imagedestroy($myImage);
 }
 
-// Check if we are a user
-if( !OC_User::isLoggedIn()){
-	echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.')));
-	exit();
-}
 $box_size = 200;
 $album_name= $_GET['album_name'];
 
diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php
index a04ad62b1bff2e7be927b50ff9aea6337416f3f7..de0b141a36709c32acc27c9f04e95dcc023c6f96 100644
--- a/apps/gallery/ajax/scanForAlbums.php
+++ b/apps/gallery/ajax/scanForAlbums.php
@@ -1,14 +1,11 @@
 <?php
 
 require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 require_once('../lib_scanner.php');
 
-if (!OC_User::IsLoggedIn()) {
-  echo json_encode(array('status' => 'error', 'message' => 'You need to log in'));
-  exit();
-}
-
-echo json_encode(array( 'status' => 'success', 'albums' => OC_GALLERY_SCANNER::scan('')));
-//echo json_encode(array('status' => 'success', 'albums' => array(array('name' => 'test', 'imagesCount' => 1, 'images' => array('dupa')))));
+OC_JSON::success(array('albums' => OC_GALLERY_SCANNER::scan('')));
+//OC_JSON::success(array('albums' => array(array('name' => 'test', 'imagesCount' => 1, 'images' => array('dupa')))));
 
 ?>
diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php
index db428eeff34983f6b6f3ad45bcfd668429712ef1..f24782390f68fd42de8e8d91e56e9429ab676f9a 100644
--- a/apps/gallery/ajax/thumbnail.php
+++ b/apps/gallery/ajax/thumbnail.php
@@ -1,5 +1,7 @@
 <?php
 require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
 
 function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSrc is a FILE - Returns an image resource.
     //getting the image dimensions  
@@ -40,11 +42,6 @@ function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSr
     return $thumb;
 }
 
-// Check if we are a user
-if( !OC_User::isLoggedIn()){
-	echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.')));
-	exit();
-}
 $box_size = 200;
 $img = $_GET['img'];
 
diff --git a/apps/gallery/index.php b/apps/gallery/index.php
index c8d5892e5552f0c20995b806a6f656a9af99acbc..87fdafcf13c0a2f0341e3d2f11679e6186b2bfce 100644
--- a/apps/gallery/index.php
+++ b/apps/gallery/index.php
@@ -2,6 +2,7 @@
 require_once('../../lib/base.php');
 
 OC_Util::checkLoggedIn();
+OC_Util::checkAppEnabled('gallery');
 OC_App::setActiveNavigationEntry( 'gallery_index' );
 
 
diff --git a/core/img/actions/selected.png b/core/img/actions/selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..98c29df9cf5d612e21d8ab86bfa1b871c92064a8
Binary files /dev/null and b/core/img/actions/selected.png differ
diff --git a/core/img/actions/selected.svg b/core/img/actions/selected.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3294f68c68de151c60b0e3bc5f2ad7d9a3933693
--- /dev/null
+++ b/core/img/actions/selected.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="play.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-add.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="25.345359"
+     inkscape:cx="10.565719"
+     inkscape:cy="5.327912"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="969"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0, -1036.36)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 14,1038.3622 -6,12 -6,-12 6,6.9978 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>