Index: /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj	(revision 3022)
@@ -67,8 +67,4 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Calendar.DayView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>.\Calendar.DayView.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
Index: /trunk/sources/HeuristicLab.Hive.Client.Console/3.2/HeuristicLab.Hive.Client.Console-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Console/3.2/HeuristicLab.Hive.Client.Console-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Client.Console/3.2/HeuristicLab.Hive.Client.Console-3.2.csproj	(revision 3022)
@@ -70,5 +70,5 @@
     <Reference Include="Calendar.DayView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\HeuristicLab.Hive.Client.Common\3.2\Calendar.DayView.dll</HintPath>
+      <HintPath>..\..\HeuristicLab.Hive.Contracts\3.2\Calendar.DayView.dll</HintPath>
     </Reference>
     <Reference Include="System" />
@@ -144,5 +144,4 @@
       <DependentUpon>Recurrence.cs</DependentUpon>
     </Compile>
-    <Compile Include="RecurrentEvent.cs" />
     <Compile Include="Service References\ClientService\Reference.cs">
       <AutoGen>True</AutoGen>
Index: unk/sources/HeuristicLab.Hive.Client.Console/3.2/RecurrentEvent.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Console/3.2/RecurrentEvent.cs	(revision 3021)
+++ 	(revision )
@@ -1,35 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Hive.Client.Console
-{
-  public class RecurrentEvent
-  {
-    public DateTime DateFrom { get; set; }
-    public DateTime DateTo { get; set; }
-    public bool AllDay { get; set; }
-    public int IncWeeks { get; set; }
-    public HashSet<DayOfWeek> WeekDays { get; set; }
-  }
-}
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 3022)
@@ -104,5 +104,5 @@
         DetermineAction(container);
       }
-      Console.WriteLine("ended!");
+      System.Console.WriteLine("ended");
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj	(revision 3022)
@@ -68,5 +68,5 @@
     <Reference Include="Calendar.DayView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\HeuristicLab.Hive.Client.Common\3.2\Calendar.DayView.dll</HintPath>
+      <HintPath>..\..\HeuristicLab.Hive.Contracts\3.2\Calendar.DayView.dll</HintPath>
     </Reference>
     <Reference Include="System" />
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/AppointmentDto.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/AppointmentDto.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/AppointmentDto.cs	(revision 3022)
@@ -0,0 +1,25 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Runtime.Serialization;
+using HeuristicLab.DataAccess;
+
+namespace HeuristicLab.Hive.Contracts.BusinessObjects {
+  
+  [DataContract]
+  public class AppointmentDto: PersistableObject {
+    [DataMember]
+    public DateTime StartDate { get; set; }
+    [DataMember]
+    public DateTime EndDate { get; set; }
+    [DataMember]
+    public bool AllDayEvent { get; set; }
+    [DataMember]
+    public bool Recurring { get; set; }
+    [DataMember]
+    public Guid RecurringId { get; set; }
+    [DataMember]
+    public Guid ResourceId { get; set; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 3022)
@@ -87,4 +87,5 @@
   <ItemGroup>
     <Compile Include="ApplicationConstants.cs" />
+    <Compile Include="BusinessObjects\AppointmentDto.cs" />
     <Compile Include="BusinessObjects\CachedHivePluginInfoDto.cs" />
     <Compile Include="BusinessObjects\ClientGroupDto.cs" />
@@ -100,4 +101,5 @@
     <Compile Include="BusinessObjects\ClientDto.cs" />
     <Compile Include="BusinessObjects\ClientConfigDto.cs" />
+    <Compile Include="RecurrentEvent.cs" />
     <Compile Include="ResponseSerializedJob.cs" />
     <Compile Include="MultiStream.cs" />
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IClientManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IClientManager.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IClientManager.cs	(revision 3022)
@@ -55,4 +55,9 @@
     [OperationContract]
     ResponseList<UpTimeStatisticsDto> GetAllUpTimeStatistics();
+    [OperationContract]
+    ResponseList<AppointmentDto> GetUptimeCalendarForResource(Guid guid);
+
+    [OperationContract]
+    Response SetUptimeCalendarForResource(Guid guid, IEnumerable<AppointmentDto> appointments);
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/RecurrentEvent.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/RecurrentEvent.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/RecurrentEvent.cs	(revision 3022)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Hive.Client.Console
+{
+  public class RecurrentEvent
+  {
+    public DateTime DateFrom { get; set; }
+    public DateTime DateTo { get; set; }
+    public bool AllDay { get; set; }
+    public int IncWeeks { get; set; }
+    public HashSet<DayOfWeek> WeekDays { get; set; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.Designer.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.Designer.cs	(revision 3022)
@@ -0,0 +1,233 @@
+﻿namespace HeuristicLab.Hive.Server.ServerConsole {
+  partial class CgCalendar {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      Calendar.DrawTool drawTool6 = new Calendar.DrawTool();
+      this.dvOnline = new Calendar.DayView();
+      this.btnSaveCal = new System.Windows.Forms.Button();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.txttimeTo = new System.Windows.Forms.DateTimePicker();
+      this.txttimeFrom = new System.Windows.Forms.DateTimePicker();
+      this.dtpTo = new System.Windows.Forms.DateTimePicker();
+      this.dtpFrom = new System.Windows.Forms.DateTimePicker();
+      this.chbade = new System.Windows.Forms.CheckBox();
+      this.btnRecurrence = new System.Windows.Forms.Button();
+      this.btbDelete = new System.Windows.Forms.Button();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.btCreate = new System.Windows.Forms.Button();
+      this.mcOnline = new System.Windows.Forms.MonthCalendar();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dvOnline
+      // 
+      drawTool6.DayView = this.dvOnline;
+      this.dvOnline.ActiveTool = drawTool6;
+      this.dvOnline.AmPmDisplay = false;
+      this.dvOnline.AppointmentDuration = Calendar.AppointmentSlotDuration.SixtyMinutes;
+      this.dvOnline.AppointmentHeightMode = Calendar.AppHeightDrawMode.TrueHeightAll;
+      this.dvOnline.DayHeadersHeight = 15;
+      this.dvOnline.DaysToShow = 7;
+      this.dvOnline.DrawAllAppBorder = false;
+      this.dvOnline.EnableDurationDisplay = false;
+      this.dvOnline.EnableRoundedCorners = false;
+      this.dvOnline.EnableShadows = false;
+      this.dvOnline.EnableTimeIndicator = false;
+      this.dvOnline.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
+      this.dvOnline.Location = new System.Drawing.Point(18, 185);
+      this.dvOnline.MinHalfHourApp = false;
+      this.dvOnline.Name = "dvOnline";
+      this.dvOnline.SelectionEnd = new System.DateTime(((long)(0)));
+      this.dvOnline.SelectionStart = new System.DateTime(((long)(0)));
+      this.dvOnline.Size = new System.Drawing.Size(823, 354);
+      this.dvOnline.StartDate = new System.DateTime(((long)(0)));
+      this.dvOnline.TabIndex = 42;
+      // 
+      // btnSaveCal
+      // 
+      this.btnSaveCal.Location = new System.Drawing.Point(642, 144);
+      this.btnSaveCal.Name = "btnSaveCal";
+      this.btnSaveCal.Size = new System.Drawing.Size(199, 23);
+      this.btnSaveCal.TabIndex = 45;
+      this.btnSaveCal.Text = "Save calender";
+      this.btnSaveCal.UseVisualStyleBackColor = true;
+      this.btnSaveCal.Click += new System.EventHandler(this.btnSaveCal_Click);
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.txttimeTo);
+      this.groupBox1.Controls.Add(this.txttimeFrom);
+      this.groupBox1.Controls.Add(this.dtpTo);
+      this.groupBox1.Controls.Add(this.dtpFrom);
+      this.groupBox1.Controls.Add(this.chbade);
+      this.groupBox1.Controls.Add(this.btnRecurrence);
+      this.groupBox1.Controls.Add(this.btbDelete);
+      this.groupBox1.Controls.Add(this.label2);
+      this.groupBox1.Controls.Add(this.label1);
+      this.groupBox1.Controls.Add(this.btCreate);
+      this.groupBox1.Location = new System.Drawing.Point(382, 13);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(254, 161);
+      this.groupBox1.TabIndex = 44;
+      this.groupBox1.TabStop = false;
+      // 
+      // txttimeTo
+      // 
+      this.txttimeTo.CustomFormat = "HH:00";
+      this.txttimeTo.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.txttimeTo.Location = new System.Drawing.Point(164, 45);
+      this.txttimeTo.Name = "txttimeTo";
+      this.txttimeTo.ShowUpDown = true;
+      this.txttimeTo.Size = new System.Drawing.Size(73, 20);
+      this.txttimeTo.TabIndex = 40;
+      // 
+      // txttimeFrom
+      // 
+      this.txttimeFrom.CustomFormat = "HH:00";
+      this.txttimeFrom.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.txttimeFrom.Location = new System.Drawing.Point(164, 12);
+      this.txttimeFrom.Name = "txttimeFrom";
+      this.txttimeFrom.ShowUpDown = true;
+      this.txttimeFrom.Size = new System.Drawing.Size(73, 20);
+      this.txttimeFrom.TabIndex = 39;
+      // 
+      // dtpTo
+      // 
+      this.dtpTo.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpTo.Location = new System.Drawing.Point(72, 45);
+      this.dtpTo.Name = "dtpTo";
+      this.dtpTo.Size = new System.Drawing.Size(89, 20);
+      this.dtpTo.TabIndex = 33;
+      // 
+      // dtpFrom
+      // 
+      this.dtpFrom.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpFrom.Location = new System.Drawing.Point(72, 12);
+      this.dtpFrom.Name = "dtpFrom";
+      this.dtpFrom.Size = new System.Drawing.Size(89, 20);
+      this.dtpFrom.TabIndex = 32;
+      // 
+      // chbade
+      // 
+      this.chbade.AutoSize = true;
+      this.chbade.Location = new System.Drawing.Point(135, 70);
+      this.chbade.Name = "chbade";
+      this.chbade.Size = new System.Drawing.Size(90, 17);
+      this.chbade.TabIndex = 31;
+      this.chbade.Text = "All Day Event";
+      this.chbade.UseVisualStyleBackColor = true;
+      this.chbade.CheckedChanged += new System.EventHandler(this.chbade_CheckedChanged);
+      // 
+      // btnRecurrence
+      // 
+      this.btnRecurrence.Location = new System.Drawing.Point(135, 129);
+      this.btnRecurrence.Name = "btnRecurrence";
+      this.btnRecurrence.Size = new System.Drawing.Size(113, 26);
+      this.btnRecurrence.TabIndex = 30;
+      this.btnRecurrence.Text = "Recurrence";
+      this.btnRecurrence.UseVisualStyleBackColor = true;
+      this.btnRecurrence.Click += new System.EventHandler(this.btnRecurrence_Click);
+      // 
+      // btbDelete
+      // 
+      this.btbDelete.Location = new System.Drawing.Point(8, 129);
+      this.btbDelete.Name = "btbDelete";
+      this.btbDelete.Size = new System.Drawing.Size(114, 26);
+      this.btbDelete.TabIndex = 25;
+      this.btbDelete.Text = "Delete";
+      this.btbDelete.UseVisualStyleBackColor = true;
+      this.btbDelete.Click += new System.EventHandler(this.btbDelete_Click);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(16, 46);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 23;
+      this.label2.Text = "End Time:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(16, 15);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(58, 13);
+      this.label1.TabIndex = 21;
+      this.label1.Text = "Start Time:";
+      // 
+      // btCreate
+      // 
+      this.btCreate.Location = new System.Drawing.Point(6, 93);
+      this.btCreate.Name = "btCreate";
+      this.btCreate.Size = new System.Drawing.Size(242, 26);
+      this.btCreate.TabIndex = 20;
+      this.btCreate.Text = "Save";
+      this.btCreate.UseVisualStyleBackColor = true;
+      this.btCreate.Click += new System.EventHandler(this.btCreate_Click);
+      // 
+      // mcOnline
+      // 
+      this.mcOnline.CalendarDimensions = new System.Drawing.Size(2, 1);
+      this.mcOnline.Location = new System.Drawing.Point(18, 18);
+      this.mcOnline.Name = "mcOnline";
+      this.mcOnline.TabIndex = 43;
+      this.mcOnline.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.mcOnline_DateChanged);
+      // 
+      // CgCalendar
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(859, 558);
+      this.Controls.Add(this.btnSaveCal);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.mcOnline);
+      this.Controls.Add(this.dvOnline);
+      this.Name = "CgCalendar";
+      this.Text = "CgCalendar";
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnSaveCal;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.DateTimePicker txttimeTo;
+    private System.Windows.Forms.DateTimePicker txttimeFrom;
+    private System.Windows.Forms.DateTimePicker dtpTo;
+    private System.Windows.Forms.DateTimePicker dtpFrom;
+    private System.Windows.Forms.CheckBox chbade;
+    private System.Windows.Forms.Button btnRecurrence;
+    private System.Windows.Forms.Button btbDelete;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Button btCreate;
+    private System.Windows.Forms.MonthCalendar mcOnline;
+    private Calendar.DayView dvOnline;
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.cs	(revision 3022)
@@ -0,0 +1,289 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Serialization;
+using Calendar;
+using HeuristicLab.Hive.Client.Console;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Contracts;
+using System.Collections;
+
+namespace HeuristicLab.Hive.Server.ServerConsole {
+
+  //delegate to write text in the textbox from another process
+  public delegate void AppendTextDelegate(String message);
+
+  //delegate to remove text in the textbox from another process
+  public delegate void RemoveTextDelegate(int newLength, int maxChars);
+
+  //delegate fired, if a dialog is being closed
+  public delegate void OnDialogClosedDelegate(RecurrentEvent e);
+
+  public partial class CgCalendar : Form {
+
+    public Guid ResourceId { get; set; }
+
+    [XmlArray("Appointments")]
+    [XmlArrayItem("Appointment", typeof(Appointment))]
+    public List<Appointment> onlineTimes = new List<Appointment>();
+
+    public CgCalendar(Guid resourceId) {
+      ResourceId = resourceId;
+      InitializeComponent();
+      InitCalender();
+      UpdateCalendar();
+    }
+
+    private void InitCalender() {
+      dvOnline.StartDate = DateTime.Now;
+      dvOnline.OnNewAppointment += new EventHandler<NewAppointmentEventArgs>(dvOnline_OnNewAppointment);
+      dvOnline.OnResolveAppointments += new EventHandler<ResolveAppointmentsEventArgs>(dvOnline_OnResolveAppointments);
+
+      //get calender from client
+      
+    }
+
+    private void UpdateCalendar() {
+      onlineTimes.Clear();
+      ResponseList<AppointmentDto> response = ServiceLocator.GetClientManager().GetUptimeCalendarForResource(ResourceId);
+      if(response.Success) {
+        foreach (AppointmentDto appointmentDto in response.List) {
+          onlineTimes.Add(new Appointment {
+                                            AllDayEvent = appointmentDto.AllDayEvent,
+                                            EndDate = appointmentDto.EndDate,
+                                            StartDate = appointmentDto.StartDate,
+                                            Recurring = appointmentDto.Recurring,
+                                            
+                                            RecurringId = appointmentDto.RecurringId,
+                                            BorderColor = Color.Red,
+                                            Locked = true,
+                                            Subject = "Online",
+                                          });
+        }
+        dvOnline.Invalidate();
+      }   
+    }
+
+    private bool CreateAppointment() {
+      DateTime from, to;
+
+      if (!string.IsNullOrEmpty(dtpFrom.Text) && !string.IsNullOrEmpty(dtpTo.Text)) {
+        if (chbade.Checked) {
+          //whole day appointment, only dates are visible
+          if (DateTime.TryParse(dtpFrom.Text, out from) && DateTime.TryParse(dtpTo.Text, out to) && from <= to)
+            onlineTimes.Add(CreateAppointment(from, to.AddDays(1), true));
+          else
+            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        } else if (!string.IsNullOrEmpty(txttimeFrom.Text) && !string.IsNullOrEmpty(txttimeTo.Text)) {
+          //Timeframe appointment
+          if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to) {
+            if (from.Date == to.Date)
+              onlineTimes.Add(CreateAppointment(from, to, false));
+            else {
+              //more than 1 day selected
+              while (from.Date != to.Date) {
+                onlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
+                from = from.AddDays(1);
+              }
+              onlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
+            }
+          } else
+            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+        dvOnline.Invalidate();
+        return true;
+      } else {
+        MessageBox.Show("Error in create appointment, please fill out all textboxes!", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        return false;
+      }
+    }
+
+    private Appointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay) {
+      Appointment App = new Appointment();
+      App.StartDate = startDate;
+      App.EndDate = endDate;
+      App.AllDayEvent = allDay;
+      App.BorderColor = Color.Red;
+      App.Locked = true;
+      App.Subject = "Online";
+      App.Recurring = false;
+      return App;
+    }
+
+    private Appointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay, bool recurring, Guid recurringId) {
+      Appointment App = new Appointment();
+      App.StartDate = startDate;
+      App.EndDate = endDate;
+      App.AllDayEvent = allDay;
+      App.BorderColor = Color.Red;
+      App.Locked = true;
+      App.Subject = "Online";
+      App.Recurring = recurring;
+      App.RecurringId = recurringId;
+      return App;
+    }
+
+    private void DeleteAppointment() {
+      onlineTimes.Remove(dvOnline.SelectedAppointment);
+    }
+
+    private void DeleteRecurringAppointment(Guid recurringId) {
+      onlineTimes.RemoveAll(a => a.RecurringId.ToString() == dvOnline.SelectedAppointment.RecurringId.ToString());
+    }
+
+    private void ChangeRecurrenceAppointment(Guid recurringId) {
+      int hourfrom = int.Parse(txttimeFrom.Text.Substring(0, txttimeFrom.Text.IndexOf(':')));
+      int hourTo = int.Parse(txttimeTo.Text.Substring(0, txttimeTo.Text.IndexOf(':')));
+      List<Appointment> recurringAppointments = onlineTimes.Where(appointment => appointment.RecurringId == recurringId).ToList();
+      recurringAppointments.ForEach(appointment => appointment.StartDate = new DateTime(appointment.StartDate.Year, appointment.StartDate.Month, appointment.StartDate.Day, hourfrom, 0, 0));
+      recurringAppointments.ForEach(appointment => appointment.EndDate = new DateTime(appointment.EndDate.Year, appointment.EndDate.Month, appointment.EndDate.Day, hourTo, 0, 0));
+
+      DeleteRecurringAppointment(recurringId);
+      onlineTimes.AddRange(recurringAppointments);
+    }
+
+    public void DialogClosed(RecurrentEvent e) {
+      CreateDailyRecurrenceAppointments(e.DateFrom, e.DateTo, e.AllDay, e.IncWeeks, e.WeekDays);
+    }
+
+    private void CreateDailyRecurrenceAppointments(DateTime dateFrom, DateTime dateTo, bool allDay, int incWeek, HashSet<DayOfWeek> daysOfWeek) {
+      DateTime incDate = dateFrom;
+      Guid guid = Guid.NewGuid();
+
+      while (incDate.Date <= dateTo.Date) {
+        if (daysOfWeek.Contains(incDate.Date.DayOfWeek))
+          onlineTimes.Add(CreateAppointment(incDate, new DateTime(incDate.Year, incDate.Month, incDate.Day, dateTo.Hour, dateTo.Minute, 0), allDay, true, guid));
+        incDate = incDate.AddDays(1);
+      }
+
+      dvOnline.Invalidate();
+    }
+
+    private void btbDelete_Click(object sender, EventArgs e) {
+      Appointment selectedAppointment = dvOnline.SelectedAppointment;
+      if (dvOnline.SelectedAppointment != null) {
+        if (!selectedAppointment.Recurring)
+          DeleteAppointment();
+        else {
+          DialogResult res = MessageBox.Show("Delete all events in this series?", "Delete recurrences", MessageBoxButtons.YesNo);
+          if (res != DialogResult.Yes)
+            DeleteAppointment();
+          else
+            DeleteRecurringAppointment(selectedAppointment.RecurringId);
+        }
+      }
+      dvOnline.Invalidate();
+    }
+
+    private void chbade_CheckedChanged(object sender, EventArgs e) {
+      txttimeFrom.Visible = !chbade.Checked;
+      txttimeTo.Visible = !chbade.Checked;
+    }
+
+    private void dvOnline_OnSelectionChanged(object sender, EventArgs e) {
+      //btCreate.Enabled = true;
+      if (dvOnline.Selection == SelectionType.DateRange) {
+        dtpFrom.Text = dvOnline.SelectionStart.ToShortDateString();
+        dtpTo.Text = dvOnline.SelectionEnd.Date.ToShortDateString();
+        txttimeFrom.Text = dvOnline.SelectionStart.ToShortTimeString();
+        txttimeTo.Text = dvOnline.SelectionEnd.ToShortTimeString();
+
+        btCreate.Text = "Save";
+      }
+
+      if (dvOnline.Selection == SelectionType.Appointment) {
+
+        dtpFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortDateString();
+        dtpTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortDateString();
+        txttimeFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortTimeString();
+        txttimeTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortTimeString();
+
+        if (dvOnline.SelectedAppointment.Recurring)
+          //btCreate.Enabled = false;
+          //also change the caption of the save button
+          btCreate.Text = "Save changes";
+      }
+
+      if (dvOnline.Selection == SelectionType.None) {
+        //also change the caption of the save button
+        btCreate.Text = "Save";
+      }
+
+    }
+
+    private void mcOnline_DateChanged(object sender, DateRangeEventArgs e) {
+      dvOnline.StartDate = mcOnline.SelectionStart;
+    }
+
+    private void btCreate_Click(object sender, EventArgs e) {
+      if (dvOnline.Selection != SelectionType.Appointment) {
+        CreateAppointment();
+      } else {
+        //now we want to change an existing appointment
+        if (!dvOnline.SelectedAppointment.Recurring) {
+          if (CreateAppointment())
+            DeleteAppointment();
+        } else {
+          //change recurring appointment
+          //check, if only selected appointment has to change or whole recurrence
+          DialogResult res = MessageBox.Show("Change all events in this series?", "Change recurrences", MessageBoxButtons.YesNo);
+          if (res != DialogResult.Yes) {
+            if (CreateAppointment())
+              DeleteAppointment();
+          } else
+            ChangeRecurrenceAppointment(dvOnline.SelectedAppointment.RecurringId);
+        }
+      }
+      dvOnline.Invalidate();
+    }
+
+    private void btnRecurrence_Click(object sender, EventArgs e) {
+      Recurrence recurrence = new Recurrence();
+      recurrence.dialogClosedDelegate = new OnDialogClosedDelegate(this.DialogClosed);
+      recurrence.Show();
+    }
+
+    private void btnSaveCal_Click(object sender, EventArgs e) {
+      List<AppointmentDto> appointments = new List<AppointmentDto>();
+      foreach(Appointment app in onlineTimes) {
+        AppointmentDto apdto = new AppointmentDto {
+                                                    AllDayEvent = app.AllDayEvent,
+                                                    EndDate = app.EndDate,
+                                                    Recurring = app.Recurring,
+                                                    RecurringId = app.RecurringId,
+                                                    StartDate = app.StartDate
+                                                  };
+        appointments.Add(apdto);
+      }
+      ServiceLocator.GetClientManager().SetUptimeCalendarForResource(ResourceId, appointments);      
+    }
+
+    private void dvOnline_OnResolveAppointments(object sender, ResolveAppointmentsEventArgs e) {
+      List<Appointment> Apps = new List<Appointment>();
+
+      foreach (Appointment m_App in onlineTimes)
+        if ((m_App.StartDate >= e.StartDate) &&
+            (m_App.StartDate <= e.EndDate))
+          Apps.Add(m_App);
+      e.Appointments = Apps;
+    }
+
+    private void dvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e) {
+      Appointment Appointment = new Appointment();
+
+      Appointment.StartDate = e.StartDate;
+      Appointment.EndDate = e.EndDate;
+
+      onlineTimes.Add(Appointment);
+    }
+  }
+}
+    
+  
+    
+
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.resx
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.resx	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/CgCalendar.resx	(revision 3022)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj	(revision 3022)
@@ -68,4 +68,8 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Calendar.DayView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.Hive.Contracts\3.2\Calendar.DayView.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -107,4 +111,10 @@
       <DependentUpon>AddProject.cs</DependentUpon>
     </Compile>
+    <Compile Include="CgCalendar.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CgCalendar.Designer.cs">
+      <DependentUpon>CgCalendar.cs</DependentUpon>
+    </Compile>
     <Compile Include="Changes.cs" />
     <Compile Include="HiveServerConsole.cs">
@@ -139,4 +149,7 @@
       <DependentUpon>AddProject.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="CgCalendar.resx">
+      <DependentUpon>CgCalendar.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="HiveServerConsole.resx">
       <DependentUpon>HiveServerConsole.cs</DependentUpon>
@@ -153,4 +166,8 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Recurrence.resx">
+      <DependentUpon>Recurrence.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
@@ -170,4 +187,10 @@
       <DependentUpon>Settings.settings</DependentUpon>
       <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Recurrence.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Recurrence.Designer.cs">
+      <DependentUpon>Recurrence.cs</DependentUpon>
     </Compile>
     <Compile Include="ServiceLocator.cs" />
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 3022)
@@ -88,4 +88,5 @@
       this.tcManagementConsole = new System.Windows.Forms.TabControl();
       this.checkBox1 = new System.Windows.Forms.CheckBox();
+      this.menuItemOpenCalendar = new System.Windows.Forms.ToolStripMenuItem();
       this.menuStrip1.SuspendLayout();
       this.plClientDetails.SuspendLayout();
@@ -130,5 +131,5 @@
             this.closeToolStripMenuItem});
       this.informationToolStripMenuItem.Name = "informationToolStripMenuItem";
-      this.informationToolStripMenuItem.Size = new System.Drawing.Size(81, 20);
+      this.informationToolStripMenuItem.Size = new System.Drawing.Size(90, 20);
       this.informationToolStripMenuItem.Text = "Management";
       // 
@@ -137,5 +138,5 @@
       this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem";
       this.refreshToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
-      this.refreshToolStripMenuItem.Size = new System.Drawing.Size(162, 22);
+      this.refreshToolStripMenuItem.Size = new System.Drawing.Size(154, 22);
       this.refreshToolStripMenuItem.Text = "Refresh";
       this.refreshToolStripMenuItem.Click += new System.EventHandler(this.Refresh_Click);
@@ -144,5 +145,5 @@
       // 
       this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
-      this.closeToolStripMenuItem.Size = new System.Drawing.Size(162, 22);
+      this.closeToolStripMenuItem.Size = new System.Drawing.Size(154, 22);
       this.closeToolStripMenuItem.Text = "Close";
       this.closeToolStripMenuItem.Click += new System.EventHandler(this.Close_Click);
@@ -155,5 +156,5 @@
             this.projectToolStripMenuItem});
       this.addToolStripMenuItem.Name = "addToolStripMenuItem";
-      this.addToolStripMenuItem.Size = new System.Drawing.Size(38, 20);
+      this.addToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
       this.addToolStripMenuItem.Text = "Add";
       // 
@@ -162,5 +163,5 @@
       this.jobToolStripMenuItem.Name = "jobToolStripMenuItem";
       this.jobToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.J)));
-      this.jobToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
+      this.jobToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
       this.jobToolStripMenuItem.Text = "Job";
       this.jobToolStripMenuItem.Click += new System.EventHandler(this.AddJob_Click);
@@ -170,5 +171,5 @@
       this.groupToolStripMenuItem.Name = "groupToolStripMenuItem";
       this.groupToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G)));
-      this.groupToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
+      this.groupToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
       this.groupToolStripMenuItem.Text = "Group";
       this.groupToolStripMenuItem.Click += new System.EventHandler(this.groupToolStripMenuItem_Click);
@@ -178,5 +179,5 @@
       this.projectToolStripMenuItem.Name = "projectToolStripMenuItem";
       this.projectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P)));
-      this.projectToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
+      this.projectToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
       this.projectToolStripMenuItem.Text = "Project";
       this.projectToolStripMenuItem.Click += new System.EventHandler(this.projectToolStripMenuItem_Click);
@@ -189,5 +190,5 @@
             this.listToolStripMenuItem});
       this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
-      this.viewToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
       this.viewToolStripMenuItem.Text = "View";
       // 
@@ -198,5 +199,5 @@
       this.largeIconsToolStripMenuItem.Name = "largeIconsToolStripMenuItem";
       this.largeIconsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D1)));
-      this.largeIconsToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.largeIconsToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
       this.largeIconsToolStripMenuItem.Text = "Large Icons";
       this.largeIconsToolStripMenuItem.Click += new System.EventHandler(this.largeIconsToolStripMenuItem_Click);
@@ -206,5 +207,5 @@
       this.smallIconsToolStripMenuItem.Name = "smallIconsToolStripMenuItem";
       this.smallIconsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D2)));
-      this.smallIconsToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.smallIconsToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
       this.smallIconsToolStripMenuItem.Text = "Small Icons";
       this.smallIconsToolStripMenuItem.Click += new System.EventHandler(this.smallIconsToolStripMenuItem_Click);
@@ -214,5 +215,5 @@
       this.listToolStripMenuItem.Name = "listToolStripMenuItem";
       this.listToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D3)));
-      this.listToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.listToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
       this.listToolStripMenuItem.Text = "List";
       this.listToolStripMenuItem.Click += new System.EventHandler(this.listToolStripMenuItem_Click);
@@ -547,10 +548,10 @@
             this.menuItemGetSnapshot});
       this.contextMenuJob.Name = "contextMenuJob";
-      this.contextMenuJob.Size = new System.Drawing.Size(151, 48);
+      this.contextMenuJob.Size = new System.Drawing.Size(145, 48);
       // 
       // menuItemAbortJob
       // 
       this.menuItemAbortJob.Name = "menuItemAbortJob";
-      this.menuItemAbortJob.Size = new System.Drawing.Size(150, 22);
+      this.menuItemAbortJob.Size = new System.Drawing.Size(144, 22);
       this.menuItemAbortJob.Text = "Abort";
       // 
@@ -558,5 +559,5 @@
       // 
       this.menuItemGetSnapshot.Name = "menuItemGetSnapshot";
-      this.menuItemGetSnapshot.Size = new System.Drawing.Size(150, 22);
+      this.menuItemGetSnapshot.Size = new System.Drawing.Size(144, 22);
       this.menuItemGetSnapshot.Text = "Get Snapshot";
       // 
@@ -653,12 +654,13 @@
       this.contextMenuGroup.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.menuItemAddGroup,
-            this.menuItemDeleteGroup});
+            this.menuItemDeleteGroup,
+            this.menuItemOpenCalendar});
       this.contextMenuGroup.Name = "contextMenuJob";
-      this.contextMenuGroup.Size = new System.Drawing.Size(149, 48);
+      this.contextMenuGroup.Size = new System.Drawing.Size(154, 92);
       // 
       // menuItemAddGroup
       // 
       this.menuItemAddGroup.Name = "menuItemAddGroup";
-      this.menuItemAddGroup.Size = new System.Drawing.Size(148, 22);
+      this.menuItemAddGroup.Size = new System.Drawing.Size(153, 22);
       this.menuItemAddGroup.Text = "Add Group";
       // 
@@ -666,5 +668,5 @@
       // 
       this.menuItemDeleteGroup.Name = "menuItemDeleteGroup";
-      this.menuItemDeleteGroup.Size = new System.Drawing.Size(148, 22);
+      this.menuItemDeleteGroup.Size = new System.Drawing.Size(153, 22);
       this.menuItemDeleteGroup.Text = "Delete Group";
       // 
@@ -703,4 +705,10 @@
       this.checkBox1.Text = "checkBox1";
       this.checkBox1.UseVisualStyleBackColor = true;
+      // 
+      // menuItemOpenCalendar
+      // 
+      this.menuItemOpenCalendar.Name = "menuItemOpenCalendar";
+      this.menuItemOpenCalendar.Size = new System.Drawing.Size(153, 22);
+      this.menuItemOpenCalendar.Text = "Open Calendar";
       // 
       // HiveServerManagementConsole
@@ -810,4 +818,5 @@
     private System.Windows.Forms.ToolStripMenuItem groupToolStripMenuItem;
     private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem menuItemOpenCalendar;
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 3022)
@@ -129,4 +129,12 @@
       };
 
+      menuItemOpenCalendar.Click += (s, e) => {
+                                      if (tvClientControl.SelectedNode != null) {
+                                        CgCalendar cal = new CgCalendar(((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id);                                        
+                                        cal.Show();
+                                      }
+                                    };
+
+
       // drag item to treeview
       lvClientControl.ItemDrag += delegate(object sender, ItemDragEventArgs e) {
@@ -683,4 +691,5 @@
           contextMenuGroup.Items.Add(menuItemAddGroup);
           contextMenuGroup.Items.Add(menuItemDeleteGroup);
+          contextMenuGroup.Items.Add(menuItemOpenCalendar);
         }
       } else {
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 3022)
@@ -129,5 +129,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo
-        FwAAAk1TRnQBSQFMAgEBBAEAAQkBAAEEAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        FwAAAk1TRnQBSQFMAgEBBAEAAQwBAAEMAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAAUADAAEBAQABCAYAASAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -239,5 +239,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAO
-        DgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DgAAAk1TRnQBSQFMAgEBAwEAAQwBAAEMAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAASADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -312,21 +312,21 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcQwAA
-        XEMBOS4mtwAAA5dJREFUSEullslPU1EUxtVVSyeGoOgWYWViomGB0YUbE7fGxODGuPEfMHFjgpowaDQy
-        KlAHlKlMKoNQKQomFUShDEKhtLSlkcgkiAMz9POcR1/7HlBotMmX3td77/m9c86953QvgD3ST2qrMo6e
-        E0iHSftkk8EfvDQ1Quq8fnrRIVvGAFZKiyKGVEsCK/29AvfMypDEa8V9Phsxol3R+EGamEhtVcDQr4N5
-        LBqW6QPono4JSbyW9/BetsG2SAeF6Pjevj6NJprdUWj7Fo2m0UjUO8NR51O9MwKvXRFocAdkpLFxdEMm
-        TyRax6LQPh4NE9lgWwSoFwA0iGf3DANa1I6Eo2hAjef9ahQPaFBi1aB0UIMykmFIiwqbFpXDG6omvbDr
-        8NKhwytSzYgOtfRCJk8Eyvq1YsjiGZDEbvGGwi9qPCPjDPgfiNEdLoYqiQHJGW1KPOlTC9oNUm7TkQes
-        gCefxi+h2XNc5klmu5K9SGbAzdxPSjzuVe0IMbnPYHLejDXvPNa9S5hdtKBn6hrsP3Ip1MA7zylZuPQW
-        FQNuCIAcAuh7VEEhH8auCEZ2+rz1nJTl5FF3WACQ3aFEQbdqW0idIxG/lp3ombyFJtcZ1DqOonPiKrxY
-        lfGaCSBNvN4iAWQRIN8HeCQJ1VNKeoPzNJ2mKCHpRb6TZf1+f4szDKiSnKwCOUAhAIJBpCerxXMec8tD
-        +Lk8LOjXigO/V5x4M5ogJF6EyACZHQrkEVGElAzEUkhuo3fyDn2nk9LQO5VGITor84TvCIvvSLnkjjCk
-        oEsSosyPCjwggAiptp3YEoLphS4K1X7/HeFwVdgOCYDtIPmbAbn0gwjZDOCE1tgTwTnhcNXYj8E2o4f5
-        62X/bd8MkQEyyAMGiJCqocQtHqx7lzGz2IeF1Qlhzj1XLSRdTPxmT2SA++0K5HRuAFiVPsCPJRsm/nTI
-        YF6swTqdg2Jr5I4lJY/siRct+a5ZgazPSj+kYjARjtlKunjRQuIN1iMwuS5Qks/BMBgbUknJkJSKpBQq
-        drmdAUhet07w5KEk8cEu4vbFUQ22yYXUX67zCJBNXkg9+RdIiVUNvcXf4eL9DYdLdml/GAr7+DQFwhUq
-        pJj6SMWQGuVWlViqNxqOr6P5W+ZjqoI1wxoYXRoqE1q/Gmnc6JLLSM+sJrcGdXYNnlC+tm2ZwZr+XWr6
-        rN2a/65NX/wH4APFUXIucrPgUh6ieC3viZPa4vFfU36gB1Ssto8AAAAASUVORK5CYII=
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcQgAA
+        XEIB62nEUwAAA3hJREFUSEu1ls1PE2EQxj229ouPVNErgZOJicZDjR68mHg1JgYvxov/gIlHxARBoxGU
+        KlJUVJDypVIQKkXBpIootoC0tLS0pZEIiILfikAfZ5Zuu9sWaDQ2edLt7vvOrzPzzsxuALBBquIeRR7p
+        CKmQVJSmeC3vyUu0FzNOD3NIFhJYpU8VuGBXpiVeK+6L2sgRQQKAbm4hTZ/pVcA8ooN9Ug/H7GY4Z3PS
+        Eq/lPbyXbbAttsm2RUB7CT3oDmXj+Ts9uiay0B7IQFtU7YFMPAxmoiMUl5WurRMrsoWz0DuZjb4pPWxk
+        g20RoF0A0EU+u2d2aWEZz8Adlxq3R9SodWlQ59bg7qgG9SSzR4tGrxZNYytqId3z6XDfr8MDUuu4Dhb6
+        Q7ZwJupHtGLI8hlQwG7xhpo3atwi4wz4F4g1lCGGqoABhWXPlbgxrBa0HqTBqyMPWHFPXk4dRXd4p8yT
+        8j4le1HIgCLjSyWuD6nWhNhC+zHz3Y6lyHcsR35h7qcDg+9PwjdvpFADT8J7ZeEyOVQMOCUAKghgGlSt
+        Cnk2eVwwstbncXiPLCfVzo1xwOV+JaqcqpSQNr8BXxYCGJw5ja7gflj82zEwfQIRLMp43QSQJt7kkAAu
+        EeBaFFAtCdVNSnpHYB+dpmwh6XeiJ8v94WKSMwxolpysKjlAIQBWg0hPVk/4ED4tePB5YUzQl99+fP0d
+        wKOJXULiRYgMUN6vQCURRUidK5dCchZDM+fou5RUgqH3JRSiAzJPuEZYXCMNkhphSNVrSYjKXyhwhQAi
+        pMW7OykEsz9eU6g2xWqEw9Xo3SoAUkGuJQKMdEOEJAI4oa0+AzgnHK5W3w54P5pgf3ssVu2JEBmgjDxg
+        gAhp9hiSPFiOLODjz2H8WJwWnoU+tQhJFxOf6IkMcLFPgYqBFQCrKQqY/+XF9Ld+GSyCJbhnK1Drzlqz
+        pVSSPbHQCs/bFbj0ShmDNI4a4J9rosLTC4k3u7fBFjxMST4I82huWi2lTNIqCoqp2RkH4pBKp07w5Kok
+        8asVYurmqAbb5EYaa9eVBLhMXkg9+RtInVsNkyM24fJjA4db9t2RjagZ5tMUD1e6kFqaI40eNRrcKrFV
+        rwycxJF5nbpg65gG1qCG2oQ2pk667gzKZaXfrK6QBm0+DW5QvlKOzCgkaeifp6HPWm/4rzv0/+dryx8H
+        ysmLkjulowAAAABJRU5ErkJggg==
 </value>
   </data>
@@ -342,5 +342,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy
-        DAAAAk1TRnQBSQFMAgEBBAEAAQkBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DAAAAk1TRnQBSQFMAgEBBAEAAQwBAAEMAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -398,7 +398,4 @@
 </value>
   </data>
-  <metadata name="updaterWoker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>388, 41</value>
-  </metadata>
   <metadata name="contextMenuJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>246, 40</value>
@@ -412,5 +409,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq
-        CQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        CQAAAk1TRnQBSQFMAgEBAwEAAQwBAAEMAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -455,3 +452,6 @@
 </value>
   </data>
+  <metadata name="updaterWoker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>388, 41</value>
+  </metadata>
 </root>
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.Designer.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.Designer.cs	(revision 3022)
@@ -0,0 +1,318 @@
+﻿namespace HeuristicLab.Hive.Client.Console
+{
+  partial class Recurrence
+  {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing)
+    {
+      if (disposing && (components != null))
+      {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent()
+    {
+      this.gbAppointment = new System.Windows.Forms.GroupBox();
+      this.chbade = new System.Windows.Forms.CheckBox();
+      this.dtpEnd = new System.Windows.Forms.DateTimePicker();
+      this.dtpToTime = new System.Windows.Forms.DateTimePicker();
+      this.label5 = new System.Windows.Forms.Label();
+      this.dtpStart = new System.Windows.Forms.DateTimePicker();
+      this.dtpFromTime = new System.Windows.Forms.DateTimePicker();
+      this.label6 = new System.Windows.Forms.Label();
+      this.txtDays = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.btSaveRecurrence = new System.Windows.Forms.Button();
+      this.btCancelRecurrence = new System.Windows.Forms.Button();
+      this.gbWeekly = new System.Windows.Forms.GroupBox();
+      this.cbSunday = new System.Windows.Forms.CheckBox();
+      this.cbSaturday = new System.Windows.Forms.CheckBox();
+      this.cbFriday = new System.Windows.Forms.CheckBox();
+      this.cbThursday = new System.Windows.Forms.CheckBox();
+      this.cbWednesday = new System.Windows.Forms.CheckBox();
+      this.cbTuesday = new System.Windows.Forms.CheckBox();
+      this.cbMonday = new System.Windows.Forms.CheckBox();
+      this.gbAppointment.SuspendLayout();
+      this.gbWeekly.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // gbAppointment
+      // 
+      this.gbAppointment.Controls.Add(this.chbade);
+      this.gbAppointment.Controls.Add(this.dtpEnd);
+      this.gbAppointment.Controls.Add(this.dtpToTime);
+      this.gbAppointment.Controls.Add(this.label5);
+      this.gbAppointment.Controls.Add(this.dtpStart);
+      this.gbAppointment.Controls.Add(this.dtpFromTime);
+      this.gbAppointment.Controls.Add(this.label6);
+      this.gbAppointment.Location = new System.Drawing.Point(2, 2);
+      this.gbAppointment.Name = "gbAppointment";
+      this.gbAppointment.Size = new System.Drawing.Size(386, 109);
+      this.gbAppointment.TabIndex = 39;
+      this.gbAppointment.TabStop = false;
+      this.gbAppointment.Text = "Appointment";
+      // 
+      // chbade
+      // 
+      this.chbade.AutoSize = true;
+      this.chbade.Location = new System.Drawing.Point(113, 86);
+      this.chbade.Name = "chbade";
+      this.chbade.Size = new System.Drawing.Size(90, 17);
+      this.chbade.TabIndex = 39;
+      this.chbade.Text = "All Day Event";
+      this.chbade.UseVisualStyleBackColor = true;
+      // 
+      // dtpEnd
+      // 
+      this.dtpEnd.Format = System.Windows.Forms.DateTimePickerFormat.Short;
+      this.dtpEnd.Location = new System.Drawing.Point(113, 56);
+      this.dtpEnd.Name = "dtpEnd";
+      this.dtpEnd.Size = new System.Drawing.Size(91, 20);
+      this.dtpEnd.TabIndex = 29;
+      // 
+      // dtpToTime
+      // 
+      this.dtpToTime.CustomFormat = "HH:00";
+      this.dtpToTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpToTime.Location = new System.Drawing.Point(226, 56);
+      this.dtpToTime.Name = "dtpToTime";
+      this.dtpToTime.ShowUpDown = true;
+      this.dtpToTime.Size = new System.Drawing.Size(73, 20);
+      this.dtpToTime.TabIndex = 38;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(58, 60);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(55, 13);
+      this.label5.TabIndex = 27;
+      this.label5.Text = "End Date:";
+      // 
+      // dtpStart
+      // 
+      this.dtpStart.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpStart.Location = new System.Drawing.Point(113, 19);
+      this.dtpStart.Name = "dtpStart";
+      this.dtpStart.Size = new System.Drawing.Size(89, 20);
+      this.dtpStart.TabIndex = 28;
+      // 
+      // dtpFromTime
+      // 
+      this.dtpFromTime.CustomFormat = "HH:00";
+      this.dtpFromTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpFromTime.Location = new System.Drawing.Point(226, 19);
+      this.dtpFromTime.Name = "dtpFromTime";
+      this.dtpFromTime.ShowUpDown = true;
+      this.dtpFromTime.Size = new System.Drawing.Size(73, 20);
+      this.dtpFromTime.TabIndex = 30;
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(58, 23);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(58, 13);
+      this.label6.TabIndex = 25;
+      this.label6.Text = "Start Date:";
+      // 
+      // txtDays
+      // 
+      this.txtDays.Location = new System.Drawing.Point(160, 13);
+      this.txtDays.Name = "txtDays";
+      this.txtDays.Size = new System.Drawing.Size(30, 20);
+      this.txtDays.TabIndex = 24;
+      this.txtDays.Text = "1";
+      this.txtDays.Visible = false;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(120, 16);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(34, 13);
+      this.label4.TabIndex = 23;
+      this.label4.Text = "Every";
+      this.label4.Visible = false;
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(196, 16);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(59, 13);
+      this.label7.TabIndex = 25;
+      this.label7.Text = "week(s) on";
+      this.label7.Visible = false;
+      // 
+      // btSaveRecurrence
+      // 
+      this.btSaveRecurrence.Location = new System.Drawing.Point(2, 217);
+      this.btSaveRecurrence.Name = "btSaveRecurrence";
+      this.btSaveRecurrence.Size = new System.Drawing.Size(147, 23);
+      this.btSaveRecurrence.TabIndex = 43;
+      this.btSaveRecurrence.Text = "Save";
+      this.btSaveRecurrence.UseVisualStyleBackColor = true;
+      this.btSaveRecurrence.Click += new System.EventHandler(this.btSaveRecurrence_Click);
+      // 
+      // btCancelRecurrence
+      // 
+      this.btCancelRecurrence.Location = new System.Drawing.Point(241, 217);
+      this.btCancelRecurrence.Name = "btCancelRecurrence";
+      this.btCancelRecurrence.Size = new System.Drawing.Size(147, 23);
+      this.btCancelRecurrence.TabIndex = 44;
+      this.btCancelRecurrence.Text = "Cancel";
+      this.btCancelRecurrence.UseVisualStyleBackColor = true;
+      this.btCancelRecurrence.Click += new System.EventHandler(this.btCancelRecurrence_Click);
+      // 
+      // gbWeekly
+      // 
+      this.gbWeekly.Controls.Add(this.label7);
+      this.gbWeekly.Controls.Add(this.cbSunday);
+      this.gbWeekly.Controls.Add(this.txtDays);
+      this.gbWeekly.Controls.Add(this.cbSaturday);
+      this.gbWeekly.Controls.Add(this.cbFriday);
+      this.gbWeekly.Controls.Add(this.cbThursday);
+      this.gbWeekly.Controls.Add(this.label4);
+      this.gbWeekly.Controls.Add(this.cbWednesday);
+      this.gbWeekly.Controls.Add(this.cbTuesday);
+      this.gbWeekly.Controls.Add(this.cbMonday);
+      this.gbWeekly.Location = new System.Drawing.Point(2, 111);
+      this.gbWeekly.Name = "gbWeekly";
+      this.gbWeekly.Size = new System.Drawing.Size(386, 100);
+      this.gbWeekly.TabIndex = 42;
+      this.gbWeekly.TabStop = false;
+      this.gbWeekly.Text = "Days of week";
+      // 
+      // cbSunday
+      // 
+      this.cbSunday.AutoSize = true;
+      this.cbSunday.Location = new System.Drawing.Point(199, 65);
+      this.cbSunday.Name = "cbSunday";
+      this.cbSunday.Size = new System.Drawing.Size(62, 17);
+      this.cbSunday.TabIndex = 6;
+      this.cbSunday.Text = "Sunday";
+      this.cbSunday.UseVisualStyleBackColor = true;
+      // 
+      // cbSaturday
+      // 
+      this.cbSaturday.AutoSize = true;
+      this.cbSaturday.Location = new System.Drawing.Point(122, 65);
+      this.cbSaturday.Name = "cbSaturday";
+      this.cbSaturday.Size = new System.Drawing.Size(68, 17);
+      this.cbSaturday.TabIndex = 5;
+      this.cbSaturday.Text = "Saturday";
+      this.cbSaturday.UseVisualStyleBackColor = true;
+      // 
+      // cbFriday
+      // 
+      this.cbFriday.AutoSize = true;
+      this.cbFriday.Location = new System.Drawing.Point(37, 65);
+      this.cbFriday.Name = "cbFriday";
+      this.cbFriday.Size = new System.Drawing.Size(54, 17);
+      this.cbFriday.TabIndex = 4;
+      this.cbFriday.Text = "Friday";
+      this.cbFriday.UseVisualStyleBackColor = true;
+      // 
+      // cbThursday
+      // 
+      this.cbThursday.AutoSize = true;
+      this.cbThursday.Location = new System.Drawing.Point(289, 40);
+      this.cbThursday.Name = "cbThursday";
+      this.cbThursday.Size = new System.Drawing.Size(70, 17);
+      this.cbThursday.TabIndex = 3;
+      this.cbThursday.Text = "Thursday";
+      this.cbThursday.UseVisualStyleBackColor = true;
+      // 
+      // cbWednesday
+      // 
+      this.cbWednesday.AutoSize = true;
+      this.cbWednesday.Location = new System.Drawing.Point(199, 42);
+      this.cbWednesday.Name = "cbWednesday";
+      this.cbWednesday.Size = new System.Drawing.Size(86, 17);
+      this.cbWednesday.TabIndex = 2;
+      this.cbWednesday.Text = "Wednesday ";
+      this.cbWednesday.UseVisualStyleBackColor = true;
+      // 
+      // cbTuesday
+      // 
+      this.cbTuesday.AutoSize = true;
+      this.cbTuesday.Location = new System.Drawing.Point(123, 42);
+      this.cbTuesday.Name = "cbTuesday";
+      this.cbTuesday.Size = new System.Drawing.Size(67, 17);
+      this.cbTuesday.TabIndex = 1;
+      this.cbTuesday.Text = "Tuesday";
+      this.cbTuesday.UseVisualStyleBackColor = true;
+      // 
+      // cbMonday
+      // 
+      this.cbMonday.AutoSize = true;
+      this.cbMonday.Location = new System.Drawing.Point(37, 42);
+      this.cbMonday.Name = "cbMonday";
+      this.cbMonday.Size = new System.Drawing.Size(64, 17);
+      this.cbMonday.TabIndex = 0;
+      this.cbMonday.Text = "Monday";
+      this.cbMonday.UseVisualStyleBackColor = true;
+      // 
+      // Recurrence
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(393, 243);
+      this.Controls.Add(this.gbWeekly);
+      this.Controls.Add(this.btCancelRecurrence);
+      this.Controls.Add(this.btSaveRecurrence);
+      this.Controls.Add(this.gbAppointment);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+      this.Name = "Recurrence";
+      this.Text = "Recurrence";
+      this.gbAppointment.ResumeLayout(false);
+      this.gbAppointment.PerformLayout();
+      this.gbWeekly.ResumeLayout(false);
+      this.gbWeekly.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox gbAppointment;
+    private System.Windows.Forms.TextBox txtDays;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.DateTimePicker dtpEnd;
+    private System.Windows.Forms.DateTimePicker dtpStart;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.Button btSaveRecurrence;
+    private System.Windows.Forms.Button btCancelRecurrence;
+    private System.Windows.Forms.DateTimePicker dtpFromTime;
+    private System.Windows.Forms.DateTimePicker dtpToTime;
+    private System.Windows.Forms.CheckBox chbade;
+    private System.Windows.Forms.GroupBox gbWeekly;
+    private System.Windows.Forms.CheckBox cbSunday;
+    private System.Windows.Forms.CheckBox cbSaturday;
+    private System.Windows.Forms.CheckBox cbFriday;
+    private System.Windows.Forms.CheckBox cbThursday;
+    private System.Windows.Forms.CheckBox cbWednesday;
+    private System.Windows.Forms.CheckBox cbTuesday;
+    private System.Windows.Forms.CheckBox cbMonday;
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.cs	(revision 3022)
@@ -0,0 +1,126 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Hive.Server.ServerConsole;
+
+namespace HeuristicLab.Hive.Client.Console
+{
+
+  public enum RecurrenceMode
+  {
+    Daily,
+    Weekly
+  }
+
+  public partial class Recurrence : Form
+  {
+
+    public OnDialogClosedDelegate dialogClosedDelegate;
+
+    public Recurrence()
+    {
+      InitializeComponent();
+    }
+
+    private void btCancelRecurrence_Click(object sender, EventArgs e)
+    {
+      this.Close();
+    }
+
+    private void btSaveRecurrence_Click(object sender, EventArgs e)
+    {
+      DateTime dateFrom, dateTo;
+      RecurrenceMode mode = RecurrenceMode.Daily;
+      int incWeek = 0;
+      HashSet<DayOfWeek> days = new HashSet<DayOfWeek>();
+
+      days = GetDays();
+
+      //check if valid
+      if (InputIsValid())
+      {
+        //set entity
+
+        dateFrom = DateTime.Parse(dtpStart.Text + " " + dtpFromTime.Text);
+        dateTo = DateTime.Parse(dtpEnd.Text + " " + dtpToTime.Text);
+
+        if (int.TryParse(txtDays.Text, out incWeek))
+          mode = RecurrenceMode.Weekly;
+        else
+          mode = RecurrenceMode.Daily;
+
+        RecurrentEvent recurrentEvent = new RecurrentEvent()
+        {
+          DateFrom = dateFrom,
+          DateTo = dateTo,
+          AllDay = chbade.Checked,
+          WeekDays = days,
+          IncWeeks = incWeek,
+        };
+
+        //fire delegate and close the dialog
+        dialogClosedDelegate(recurrentEvent);
+        this.Close();
+      }
+      else
+        MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+    }
+
+    private HashSet<DayOfWeek> GetDays()
+    {
+      HashSet<DayOfWeek> days = new HashSet<DayOfWeek>();
+
+      if (cbMonday.Checked)
+        days.Add(DayOfWeek.Monday);
+      if (cbTuesday.Checked)
+        days.Add(DayOfWeek.Tuesday);
+      if (cbWednesday.Checked)
+        days.Add(DayOfWeek.Wednesday);
+      if (cbThursday.Checked)
+        days.Add(DayOfWeek.Thursday);
+      if (cbFriday.Checked)
+        days.Add(DayOfWeek.Friday);
+      if (cbSaturday.Checked)
+        days.Add(DayOfWeek.Saturday);
+      if (cbSunday.Checked)
+        days.Add(DayOfWeek.Sunday);
+
+      return days;
+    }
+
+    private bool InputIsValid()
+    {
+      DateTime dateFrom, dateTo;
+      int i = 0;
+
+      dateFrom = DateTime.Parse(dtpStart.Text + " " + dtpFromTime.Text);
+      dateTo = DateTime.Parse(dtpEnd.Text + " " + dtpToTime.Text);
+
+      if (dateFrom < dateTo && dateFrom.TimeOfDay < dateTo.TimeOfDay && int.TryParse(txtDays.Text, out i))
+        return true;
+      else
+        return false;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.resx
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.resx	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/Recurrence.resx	(revision 3022)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientManager.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientManager.cs	(revision 3022)
@@ -1,3 +1,4 @@
 #region License Information
+
 /* HeuristicLab
  * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
@@ -18,4 +19,5 @@
  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
  */
+
 #endregion
 
@@ -33,12 +35,8 @@
 
 namespace HeuristicLab.Hive.Server.Core {
-  class ClientManager: IClientManager {
-    
-    //ISessionFactory factory;
-    List<ClientGroup> clientGroups;
+  internal class ClientManager : IClientManager {
+    private List<ClientGroup> clientGroups;
 
     public ClientManager() {
-      //factory = ServiceLocator.GetSessionFactory();
-      
       clientGroups = new List<ClientGroup>();
     }
@@ -51,23 +49,11 @@
     /// <returns></returns>
     public ResponseList<ClientDto> GetAllClients() {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        
-        IClientAdapter clientAdapter =
-          session.GetDataAdapter<ClientDto, IClientAdapter>();*/
-
-        ResponseList<ClientDto> response = new ResponseList<ClientDto>();
-
-        response.List = new List<ClientDto>(DaoLocator.ClientDao.FindAll());
-        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_ALL_CLIENTS;
-        response.Success = true;
-
-        return response;
-      /*}
-      finally {
-        if (session != null)
-          session.EndSession();
-      }*/
+      ResponseList<ClientDto> response = new ResponseList<ClientDto>();
+
+      response.List = new List<ClientDto>(DaoLocator.ClientDao.FindAll());
+      response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_ALL_CLIENTS;
+      response.Success = true;
+
+      return response;
     }
 
@@ -77,34 +63,23 @@
     /// <returns></returns>
     public ResponseList<ClientGroup> GetAllClientGroups() {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();
-        IClientAdapter clientAdapter =
-          session.GetDataAdapter<ClientDto, IClientAdapter>();*/
-        ResponseList<ClientGroup> response = new ResponseList<ClientGroup>();
-
-        List<ClientGroup> allClientGroups = new List<ClientGroup>(DaoLocator.ClientGroupDao.FindAllWithSubGroupsAndClients());
-        ClientGroup emptyClientGroup = new ClientGroup();
-        IEnumerable<ClientDto> groupLessClients = DaoLocator.ClientDao.FindAllClientsWithoutGroup();
-        if (groupLessClients != null) {
-          foreach (ClientDto currClient in groupLessClients) {
-            emptyClientGroup.Resources.Add(currClient);
-          }
+      ResponseList<ClientGroup> response = new ResponseList<ClientGroup>();
+
+      List<ClientGroup> allClientGroups =
+        new List<ClientGroup>(DaoLocator.ClientGroupDao.FindAllWithSubGroupsAndClients());
+      ClientGroup emptyClientGroup = new ClientGroup();
+      IEnumerable<ClientDto> groupLessClients = DaoLocator.ClientDao.FindAllClientsWithoutGroup();
+      if (groupLessClients != null) {
+        foreach (ClientDto currClient in groupLessClients) {
+          emptyClientGroup.Resources.Add(currClient);
         }
-        emptyClientGroup.Id = Guid.Empty;
-        allClientGroups.Add(emptyClientGroup);
-
-        response.List = allClientGroups;
-        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_ALL_CLIENTGROUPS;
-        response.Success = true;
-
-        return response;
-   /*   }
-      finally {
-        if (session != null)
-          session.EndSession();
-      }*/
+      }
+      emptyClientGroup.Id = Guid.Empty;
+      allClientGroups.Add(emptyClientGroup);
+
+      response.List = allClientGroups;
+      response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_ALL_CLIENTGROUPS;
+      response.Success = true;
+
+      return response;
     }
 
@@ -121,29 +96,19 @@
     /// <returns></returns>
     public ResponseObject<ClientGroup> AddClientGroup(ClientGroup clientGroup) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();*/
-
-        ResponseObject<ClientGroup> response = new ResponseObject<ClientGroup>();
-
-        if (clientGroup.Id != Guid.Empty) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_ID_MUST_NOT_BE_SET;
-        } else {
-          clientGroup = DaoLocator.ClientGroupDao.Insert(clientGroup);
-          //clientGroupAdapter.Update(clientGroup);
-          response.Obj = clientGroup;
-          response.Success = true;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_ADDED;
-        }
-
-        return response;
-      /*}
-      finally {
-        if (session != null)
-          session.EndSession();
-      } */
+      ResponseObject<ClientGroup> response = new ResponseObject<ClientGroup>();
+
+      if (clientGroup.Id != Guid.Empty) {
+        response.Success = false;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_ID_MUST_NOT_BE_SET;
+      }
+      else {
+        clientGroup = DaoLocator.ClientGroupDao.Insert(clientGroup);
+        //clientGroupAdapter.Update(clientGroup);
+        response.Obj = clientGroup;
+        response.Success = true;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_ADDED;
+      }
+
+      return response;
     }
 
@@ -155,134 +120,100 @@
     /// <returns></returns>
     public Response AddResourceToGroup(Guid clientGroupId, ResourceDto resource) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();*/
-
-        Response response = new Response();
-
-        ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
-        if (clientGroup == null) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
+      Response response = new Response();
+
+      ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
+      if (clientGroup == null) {
+        response.Success = false;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
+        return response;
+      }
+      clientGroup.Resources.Add(resource);
+      DaoLocator.ClientGroupDao.AddRessourceToClientGroup(resource.Id, clientGroup.Id);
+      //clientGroupAdapter.Update(clientGroup);
+
+      response.Success = true;
+      response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_ADDED_TO_GROUP;
+
+      return response;
+    }
+
+    /// <summary>
+    /// Remove a resource from a group
+    /// </summary>
+    /// <param name="clientGroupId"></param>
+    /// <param name="resourceId"></param>
+    /// <returns></returns>
+    public Response DeleteResourceFromGroup(Guid clientGroupId, Guid resourceId) {
+      Response response = new Response();
+
+      ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
+      if (clientGroup == null) {
+        response.Success = false;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
+        return response;
+      }
+      foreach (ResourceDto resource in clientGroup.Resources) {
+        if (resource.Id == resourceId) {
+          clientGroup.Resources.Remove(resource);
+          DaoLocator.ClientGroupDao.RemoveRessourceFromClientGroup(resource.Id, clientGroup.Id);
+          //clientGroupAdapter.Update(clientGroup);
+          response.Success = true;
+          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_REMOVED;
           return response;
         }
-        clientGroup.Resources.Add(resource);
-        DaoLocator.ClientGroupDao.AddRessourceToClientGroup(resource.Id, clientGroup.Id);          
-        //clientGroupAdapter.Update(clientGroup);
-
+      }
+      response.Success = false;
+      response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_NOT_FOUND;
+
+      return response;
+    }
+
+    public ResponseObject<List<ClientGroup>> GetAllGroupsOfResource(Guid resourceId) {
+      ResponseObject<List<ClientGroup>> response = new ResponseObject<List<ClientGroup>>();
+
+      ClientDto client = DaoLocator.ClientDao.FindById(resourceId);
+      if (client != null) {
+        List<ClientGroup> groupsOfClient = new List<ClientGroup>(DaoLocator.ClientGroupDao.MemberOf(client));
+        response.Obj = groupsOfClient;
         response.Success = true;
-        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_ADDED_TO_GROUP;
-
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_GROUPS_OF_CLIENT;
+      }
+      else {
+        response.Obj = new List<ClientGroup>();
+        response.Success = false;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_NOT_FOUND;
+      }
+
+      return response;
+    }
+
+    public Response DeleteClientGroup(Guid clientGroupId) {
+      Response response = new Response();
+
+      ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
+      if (clientGroup == null) {
+        response.Success = false;
+        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
         return response;
       }
-      /*finally {
-        if (session != null)
-          session.EndSession();
-      } 
-    }   */
-
-    /// <summary>
-    /// Remove a resource from a group
-    /// </summary>
-    /// <param name="clientGroupId"></param>
-    /// <param name="resourceId"></param>
-    /// <returns></returns>
-    public Response DeleteResourceFromGroup(Guid clientGroupId, Guid resourceId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();*/
-
-        Response response = new Response();
-
-        ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
-        if (clientGroup == null) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
-          return response;
-        }
-        foreach (ResourceDto resource in clientGroup.Resources) {
-          if (resource.Id == resourceId) {
-            clientGroup.Resources.Remove(resource);
-            DaoLocator.ClientGroupDao.RemoveRessourceFromClientGroup(resource.Id, clientGroup.Id);
-            //clientGroupAdapter.Update(clientGroup);
-            response.Success = true;
-            response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_REMOVED;
-            return response;
-          }
-        }
-        response.Success = false;
-        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_NOT_FOUND;
-
-        return response;
-      }
-      /*finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }   */
-
-    public ResponseObject<List<ClientGroup>> GetAllGroupsOfResource(Guid resourceId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();
-        IClientAdapter clientAdapter =
-          session.GetDataAdapter<ClientDto, IClientAdapter>();*/
-
-        ResponseObject<List<ClientGroup>> response = new ResponseObject<List<ClientGroup>>();
-
-        ClientDto client = DaoLocator.ClientDao.FindById(resourceId);
-        if (client != null) {
-          List<ClientGroup> groupsOfClient = new List<ClientGroup>(DaoLocator.ClientGroupDao.MemberOf(client));
-          response.Obj = groupsOfClient;
-          response.Success = true;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_GET_GROUPS_OF_CLIENT;
-        } else {
-          response.Obj = new List<ClientGroup>();
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_RESOURCE_NOT_FOUND;
-        }
-
-        return response;
-      }
-      /*finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }   */
-
-    public Response DeleteClientGroup(Guid clientGroupId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IClientGroupAdapter clientGroupAdapter =
-          session.GetDataAdapter<ClientGroup, IClientGroupAdapter>();*/
-
-        Response response = new Response();
-
-        ClientGroup clientGroup = DaoLocator.ClientGroupDao.FindById(clientGroupId);
-        if (clientGroup == null) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DOESNT_EXIST;
-          return response;
-        }
-
-        DaoLocator.ClientGroupDao.Delete(clientGroup);
-
-        response.Success = true;
-        response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DELETED;
-        return response;
-
-      }/* finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }    */
-
+
+      DaoLocator.ClientGroupDao.Delete(clientGroup);
+
+      response.Success = true;
+      response.StatusMessage = ApplicationConstants.RESPONSE_CLIENT_CLIENTGROUP_DELETED;
+      return response;
+    }
+
+    public ResponseList<AppointmentDto> GetUptimeCalendarForResource(Guid guid) {
+      ResponseList<AppointmentDto> response = new ResponseList<AppointmentDto>();
+      response.List = new List<AppointmentDto>(DaoLocator.UptimeCalendarDao.GetUptimeCalendarForResource(guid));
+      response.Success = true;
+      return response;
+    }
+
+    public Response SetUptimeCalendarForResource(Guid guid, IEnumerable<AppointmentDto> appointments) {
+      DaoLocator.UptimeCalendarDao.SetUptimeCalendarForResource(guid, appointments);
+      return new Response {Success = true};
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/DaoLocator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/DaoLocator.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/DaoLocator.cs	(revision 3022)
@@ -13,4 +13,5 @@
     [ThreadStatic] private static IJobDao jobDao;
     [ThreadStatic] private static IPluginInfoDao pluginInfoDao;
+    [ThreadStatic] private static IUptimeCalendarDao uptimeCalendarDao;
 
     public static IClientDao ClientDao {
@@ -54,4 +55,12 @@
     }
 
+    public static IUptimeCalendarDao UptimeCalendarDao {
+      get {
+        if (uptimeCalendarDao == null)
+          uptimeCalendarDao = new UptimeCalendarDao();
+        return uptimeCalendarDao;
+      }
+    }
+
     public static void DestroyContext() {
       if (ContextFactory.Context != null) {
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 3022)
@@ -172,4 +172,11 @@
     }
 
+    public ResponseList<AppointmentDto> GetUptimeCalendarForResource(Guid guid) {
+      return clientManager.GetUptimeCalendarForResource(guid);
+    }
+
+    public Response SetUptimeCalendarForResource(Guid guid, IEnumerable<AppointmentDto> appointments) {
+      return clientManager.SetUptimeCalendarForResource(guid, appointments);
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj	(revision 3022)
@@ -85,4 +85,5 @@
     <Compile Include="IPluginInfoDao.cs" />
     <Compile Include="IProjectAdapter.cs" />
+    <Compile Include="IUptimeCalendarDao.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="HiveServerDataAccessPlugin.cs" />
Index: /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IUptimeCalendarDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IUptimeCalendarDao.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IUptimeCalendarDao.cs	(revision 3022)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+
+namespace HeuristicLab.Hive.Server.DataAccess {
+  public interface IUptimeCalendarDao: IGenericDao<AppointmentDto> {
+    IEnumerable<AppointmentDto> GetUptimeCalendarForResource(Guid resourceId);
+    void SetUptimeCalendarForResource(Guid resourceId, IEnumerable<AppointmentDto> appointments);
+    
+  }
+}
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj	(revision 3022)
@@ -105,4 +105,5 @@
       <DependentUpon>Settings.settings</DependentUpon>
     </Compile>
+    <Compile Include="UptimeCalendarDao.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml	(revision 3022)
@@ -77,4 +77,5 @@
       <Association Name="Resource_ClientGroup_Resource" Member="ClientGroup_Resources" ThisKey="ResourceId" OtherKey="ResourceId" Type="ClientGroup_Resource" />
       <Association Name="Resource_Client" Member="Client" ThisKey="ResourceId" OtherKey="ResourceId" Type="Client" Cardinality="One" />
+      <Association Name="Resource_UptimeCalendar" Member="UptimeCalendars" ThisKey="ResourceId" OtherKey="ResourceId" Type="UptimeCalendar" />
     </Type>
   </Table>
@@ -120,3 +121,15 @@
     </Type>
   </Table>
+  <Table Name="dbo.UptimeCalendar" Member="UptimeCalendars">
+    <Type Name="UptimeCalendar">
+      <Column Name="UptimeCalendarId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ResourceId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
+      <Column Name="StartDate" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
+      <Column Name="EndDate" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
+      <Column Name="AllDayEvent" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
+      <Column Name="Recurring" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
+      <Column Name="RecurringId" Type="System.Guid" DbType="UniqueIdentifier" CanBeNull="false" />
+      <Association Name="Resource_UptimeCalendar" Member="Resource" ThisKey="ResourceId" OtherKey="ResourceId" Type="Resource" IsForeignKey="true" DeleteRule="CASCADE" DeleteOnNull="true" />
+    </Type>
+  </Table>
 </Database>
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml.layout
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml.layout	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml.layout	(revision 3022)
@@ -71,5 +71,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(4.4375 : 5.75); (4.4375 : 5.1362939453125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(4.78125 : 5.75); (4.78125 : 5.1362939453125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Resource/Resource_AssignedResource" />
       <nodes>
@@ -105,5 +105,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(4.5 : 6.94399251302083); (4.5 : 7.625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(4.78125 : 6.94399251302083); (4.78125 : 7.625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Resource/Resource_Client" />
       <nodes>
@@ -125,5 +125,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(10 : 6.5); (10 : 4.34375); (5.5 : 4.34375)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(10 : 6.5); (10 : 4.34375); (5.5 : 4.34375)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Job/Job_AssignedResource" />
       <nodes>
@@ -132,5 +132,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(11 : 9.37580485026042); (12 : 9.37580485026042)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(11 : 9.37580485026042); (12 : 9.37580485026042)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Job/Job_RequiredPlugin" />
       <nodes>
@@ -139,5 +139,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(5.625 : 8.91270182291667); (9 : 8.91270182291667)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(5.625 : 8.91270182291667); (9 : 8.91270182291667)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Client/Client_Job" />
       <nodes>
@@ -153,5 +153,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(8.25 : 11.0969962565104); (9.32336288461538 : 11.0969962565104); (9.32336288461538 : 10.0016097005208)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(8.25 : 11.0969962565104); (9.32336288461538 : 11.0969962565104); (9.32336288461538 : 10.0016097005208)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/Project/Project_Job" />
       <nodes>
@@ -160,4 +160,17 @@
       </nodes>
     </associationConnector>
+    <classShape Id="9ae82b5f-6e47-4a8e-8350-f7312381bb3b" absoluteBounds="0.625, 5.125, 2, 2.1554996744791666">
+      <DataClassMoniker Name="/HiveDataContext/UptimeCalendar" />
+      <nestedChildShapes>
+        <elementListCompartment Id="7469c6a3-4cb2-41c2-82b9-6999782218dd" absoluteBounds="0.64000000000000012, 5.585, 1.9700000000000002, 1.5954996744791665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(3.375 : 6.34699625651042); (2.625 : 6.34699625651042)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/HiveDataContext/Resource/Resource_UptimeCalendar" />
+      <nodes>
+        <classShapeMoniker Id="e44e8355-4290-42f0-8b46-4473e91e504b" />
+        <classShapeMoniker Id="9ae82b5f-6e47-4a8e-8350-f7312381bb3b" />
+      </nodes>
+    </associationConnector>
   </nestedChildShapes>
 </ordesignerObjectsDiagram>
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs	(revision 3021)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs	(revision 3022)
@@ -64,4 +64,7 @@
     partial void UpdateJob(Job instance);
     partial void DeleteJob(Job instance);
+    partial void InsertUptimeCalendar(UptimeCalendar instance);
+    partial void UpdateUptimeCalendar(UptimeCalendar instance);
+    partial void DeleteUptimeCalendar(UptimeCalendar instance);
     #endregion
 		
@@ -181,4 +184,12 @@
 			{
 				return this.GetTable<Job>();
+			}
+		}
+		
+		public System.Data.Linq.Table<UptimeCalendar> UptimeCalendars
+		{
+			get
+			{
+				return this.GetTable<UptimeCalendar>();
 			}
 		}
@@ -604,5 +615,5 @@
 		}
 		
-		[Column(Storage="_UpDownTimeCalendar", DbType="Xml", CanBeNull=true, UpdateCheck=UpdateCheck.Never)]
+		[Column(Storage="_UpDownTimeCalendar", DbType="Xml", UpdateCheck=UpdateCheck.Never)]
 		public System.Xml.Linq.XElement UpDownTimeCalendar
 		{
@@ -1499,4 +1510,6 @@
 		private EntityRef<Client> _Client;
 		
+		private EntitySet<UptimeCalendar> _UptimeCalendars;
+		
     #region Extensibility Method Definitions
     partial void OnLoaded();
@@ -1515,4 +1528,5 @@
 			this._ClientGroup_Resources = new EntitySet<ClientGroup_Resource>(new Action<ClientGroup_Resource>(this.attach_ClientGroup_Resources), new Action<ClientGroup_Resource>(this.detach_ClientGroup_Resources));
 			this._Client = default(EntityRef<Client>);
+			this._UptimeCalendars = new EntitySet<UptimeCalendar>(new Action<UptimeCalendar>(this.attach_UptimeCalendars), new Action<UptimeCalendar>(this.detach_UptimeCalendars));
 			OnCreated();
 		}
@@ -1642,4 +1656,17 @@
 		}
 		
+		[Association(Name="Resource_UptimeCalendar", Storage="_UptimeCalendars", ThisKey="ResourceId", OtherKey="ResourceId")]
+		public EntitySet<UptimeCalendar> UptimeCalendars
+		{
+			get
+			{
+				return this._UptimeCalendars;
+			}
+			set
+			{
+				this._UptimeCalendars.Assign(value);
+			}
+		}
+		
 		public event PropertyChangingEventHandler PropertyChanging;
 		
@@ -1681,4 +1708,16 @@
 		
 		private void detach_ClientGroup_Resources(ClientGroup_Resource entity)
+		{
+			this.SendPropertyChanging();
+			entity.Resource = null;
+		}
+		
+		private void attach_UptimeCalendars(UptimeCalendar entity)
+		{
+			this.SendPropertyChanging();
+			entity.Resource = this;
+		}
+		
+		private void detach_UptimeCalendars(UptimeCalendar entity)
 		{
 			this.SendPropertyChanging();
@@ -2278,5 +2317,5 @@
 		}
 		
-		[Column(Storage="_SerializedJob", DbType="VarBinary(MAX)", CanBeNull=true, UpdateCheck=UpdateCheck.Never)]
+		[Column(Storage="_SerializedJob", DbType="VarBinary(MAX)", UpdateCheck=UpdateCheck.Never)]
 		public System.Data.Linq.Binary SerializedJob
 		{
@@ -2659,4 +2698,251 @@
 		}
 	}
+	
+	[Table(Name="dbo.UptimeCalendar")]
+	public partial class UptimeCalendar : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private System.Guid _UptimeCalendarId;
+		
+		private System.Guid _ResourceId;
+		
+		private System.DateTime _StartDate;
+		
+		private System.DateTime _EndDate;
+		
+		private bool _AllDayEvent;
+		
+		private bool _Recurring;
+		
+		private System.Guid _RecurringId;
+		
+		private EntityRef<Resource> _Resource;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnUptimeCalendarIdChanging(System.Guid value);
+    partial void OnUptimeCalendarIdChanged();
+    partial void OnResourceIdChanging(System.Guid value);
+    partial void OnResourceIdChanged();
+    partial void OnStartDateChanging(System.DateTime value);
+    partial void OnStartDateChanged();
+    partial void OnEndDateChanging(System.DateTime value);
+    partial void OnEndDateChanged();
+    partial void OnAllDayEventChanging(bool value);
+    partial void OnAllDayEventChanged();
+    partial void OnRecurringChanging(bool value);
+    partial void OnRecurringChanged();
+    partial void OnRecurringIdChanging(System.Guid value);
+    partial void OnRecurringIdChanged();
+    #endregion
+		
+		public UptimeCalendar()
+		{
+			this._Resource = default(EntityRef<Resource>);
+			OnCreated();
+		}
+		
+		[Column(Storage="_UptimeCalendarId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+		public System.Guid UptimeCalendarId
+		{
+			get
+			{
+				return this._UptimeCalendarId;
+			}
+			set
+			{
+				if ((this._UptimeCalendarId != value))
+				{
+					this.OnUptimeCalendarIdChanging(value);
+					this.SendPropertyChanging();
+					this._UptimeCalendarId = value;
+					this.SendPropertyChanged("UptimeCalendarId");
+					this.OnUptimeCalendarIdChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_ResourceId", DbType="UniqueIdentifier NOT NULL")]
+		public System.Guid ResourceId
+		{
+			get
+			{
+				return this._ResourceId;
+			}
+			set
+			{
+				if ((this._ResourceId != value))
+				{
+					if (this._Resource.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnResourceIdChanging(value);
+					this.SendPropertyChanging();
+					this._ResourceId = value;
+					this.SendPropertyChanged("ResourceId");
+					this.OnResourceIdChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_StartDate", DbType="DateTime NOT NULL")]
+		public System.DateTime StartDate
+		{
+			get
+			{
+				return this._StartDate;
+			}
+			set
+			{
+				if ((this._StartDate != value))
+				{
+					this.OnStartDateChanging(value);
+					this.SendPropertyChanging();
+					this._StartDate = value;
+					this.SendPropertyChanged("StartDate");
+					this.OnStartDateChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_EndDate", DbType="DateTime NOT NULL")]
+		public System.DateTime EndDate
+		{
+			get
+			{
+				return this._EndDate;
+			}
+			set
+			{
+				if ((this._EndDate != value))
+				{
+					this.OnEndDateChanging(value);
+					this.SendPropertyChanging();
+					this._EndDate = value;
+					this.SendPropertyChanged("EndDate");
+					this.OnEndDateChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_AllDayEvent", DbType="Bit NOT NULL")]
+		public bool AllDayEvent
+		{
+			get
+			{
+				return this._AllDayEvent;
+			}
+			set
+			{
+				if ((this._AllDayEvent != value))
+				{
+					this.OnAllDayEventChanging(value);
+					this.SendPropertyChanging();
+					this._AllDayEvent = value;
+					this.SendPropertyChanged("AllDayEvent");
+					this.OnAllDayEventChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_Recurring", DbType="Bit NOT NULL")]
+		public bool Recurring
+		{
+			get
+			{
+				return this._Recurring;
+			}
+			set
+			{
+				if ((this._Recurring != value))
+				{
+					this.OnRecurringChanging(value);
+					this.SendPropertyChanging();
+					this._Recurring = value;
+					this.SendPropertyChanged("Recurring");
+					this.OnRecurringChanged();
+				}
+			}
+		}
+		
+		[Column(Storage="_RecurringId", DbType="UniqueIdentifier")]
+		public System.Guid RecurringId
+		{
+			get
+			{
+				return this._RecurringId;
+			}
+			set
+			{
+				if ((this._RecurringId != value))
+				{
+					this.OnRecurringIdChanging(value);
+					this.SendPropertyChanging();
+					this._RecurringId = value;
+					this.SendPropertyChanged("RecurringId");
+					this.OnRecurringIdChanged();
+				}
+			}
+		}
+		
+		[Association(Name="Resource_UptimeCalendar", Storage="_Resource", ThisKey="ResourceId", OtherKey="ResourceId", IsForeignKey=true, DeleteOnNull=true, DeleteRule="CASCADE")]
+		public Resource Resource
+		{
+			get
+			{
+				return this._Resource.Entity;
+			}
+			set
+			{
+				Resource previousValue = this._Resource.Entity;
+				if (((previousValue != value) 
+							|| (this._Resource.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Resource.Entity = null;
+						previousValue.UptimeCalendars.Remove(this);
+					}
+					this._Resource.Entity = value;
+					if ((value != null))
+					{
+						value.UptimeCalendars.Add(this);
+						this._ResourceId = value.ResourceId;
+					}
+					else
+					{
+						this._ResourceId = default(System.Guid);
+					}
+					this.SendPropertyChanged("Resource");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+	}
 }
 #pragma warning restore 1591
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs	(revision 3022)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs	(revision 3022)
@@ -0,0 +1,102 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Server.DataAccess;
+
+namespace HeuristicLab.Hive.Server.LINQDataAccess {
+  public class UptimeCalendarDao: BaseDao<AppointmentDto, UptimeCalendar>, IUptimeCalendarDao {
+    public override UptimeCalendar DtoToEntity(AppointmentDto source, UptimeCalendar target) {
+      if(source == null)
+        return null;
+      if (target == null)
+        target = new UptimeCalendar();
+
+      target.AllDayEvent = source.AllDayEvent;
+      target.EndDate = source.EndDate;
+      target.StartDate = source.StartDate;
+      target.Recurring = source.Recurring;
+      target.RecurringId = source.RecurringId;
+
+      target.ResourceId = source.ResourceId;
+
+      return target;
+      
+    }
+
+    public override AppointmentDto EntityToDto(UptimeCalendar source, AppointmentDto target) {
+      if (source == null)
+        return null;
+      if (target == null)
+        target = new AppointmentDto();
+      
+      target.AllDayEvent = source.AllDayEvent;
+      target.EndDate = source.EndDate;
+      target.StartDate = source.StartDate;
+      target.Recurring = source.Recurring;
+      target.RecurringId = source.RecurringId;
+
+      target.ResourceId = source.ResourceId;
+
+      return target;
+
+    }
+
+    #region IGenericDao<AppointmentDto> Members
+
+    public AppointmentDto FindById(Guid id) {
+      return (from app in Context.UptimeCalendars
+              where app.UptimeCalendarId.Equals(id)
+              select EntityToDto(app, null)).SingleOrDefault();
+    }
+
+    public IEnumerable<AppointmentDto> FindAll() {
+      return (from app in Context.UptimeCalendars              
+              select EntityToDto(app, null)).ToList();
+    }
+
+    public AppointmentDto Insert(AppointmentDto bObj) {
+      UptimeCalendar uc = DtoToEntity(bObj, null);
+      Context.UptimeCalendars.InsertOnSubmit(uc);
+      Context.SubmitChanges();
+      bObj.Id = uc.UptimeCalendarId;
+      return bObj;
+    }
+
+    public void Delete(AppointmentDto bObj) {
+      Context.UptimeCalendars.DeleteOnSubmit(Context.UptimeCalendars.SingleOrDefault(uc => uc.UptimeCalendarId.Equals(bObj.Id)));
+      Context.SubmitChanges();
+    }
+
+    public void Update(AppointmentDto bObj) {
+      UptimeCalendar cc = Context.UptimeCalendars.SingleOrDefault(c => c.UptimeCalendarId.Equals(bObj.Id));
+      DtoToEntity(bObj, cc);
+      Context.SubmitChanges();
+    }
+
+    public IEnumerable<AppointmentDto> GetUptimeCalendarForResource(Guid resourceId) {
+      return (from uc in Context.UptimeCalendars
+              where uc.ResourceId.Equals(resourceId)
+              select EntityToDto(uc, null)).ToList();
+    }
+
+    public void SetUptimeCalendarForResource(Guid resourceId, IEnumerable<AppointmentDto> appointments) {
+      var q = (from uc in Context.UptimeCalendars
+               where uc.ResourceId.Equals(resourceId)
+               select uc);
+      
+      Context.UptimeCalendars.DeleteAllOnSubmit(q);
+
+      foreach (AppointmentDto appdto in appointments) {      
+        UptimeCalendar uc = DtoToEntity(appdto, null);
+        uc.ResourceId = resourceId;
+        Context.UptimeCalendars.InsertOnSubmit(uc);
+      }
+
+      Context.SubmitChanges();            
+    }
+
+    #endregion
+  }
+}
