[tasque/viewmodel: 20/78] WiP



commit bf962aed38f5bedcf87d29f5d8d842781c211729
Author: Antonius Riha <antoniusriha gmail com>
Date:   Sat Jul 28 14:55:24 2012 +0200

    WiP
    
    * Dropped Logger.cs: now using System.Diagnostics.Debug
    and .Trace classes
    * Added a sample single instance solution for windows in
    WindowsSingleInstanceSolution.cs
    * Added a common startup project "tasque"

 build/build.csproj                                 |    3 +
 src/Addins/DummyBackend/DummyTask.cs               |    6 +-
 src/Addins/HiveminderBackend/HmBackend.cs          |   26 ++--
 src/Addins/HiveminderBackend/HmTask.cs             |   20 +-
 src/Addins/RtmBackend/RtmBackend.cs                |   90 +++++-----
 src/Addins/RtmBackend/RtmPreferencesWidget.cs      |   14 +-
 src/Addins/RtmBackend/RtmTask.cs                   |    6 +-
 src/Addins/SqliteBackend/Database.cs               |    8 +-
 src/Addins/SqliteBackend/SqliteBackend.cs          |    4 +-
 src/Addins/SqliteBackend/SqliteCategory.cs         |    2 +-
 src/Addins/SqliteBackend/SqliteTask.cs             |   12 +-
 src/Tasque.Gtk/Application.cs                      |  124 ++++----------
 src/Tasque.Gtk/GtkApplication.cs                   |   64 +++++++-
 src/Tasque.Gtk/NoteDialog.cs                       |   14 +-
 src/Tasque.Gtk/NoteWidget.cs                       |    6 +-
 src/Tasque.Gtk/Preferences.cs                      |    4 +-
 src/Tasque.Gtk/PreferencesDialog.cs                |   10 +-
 src/Tasque.Gtk/Properties/AssemblyInfo.cs          |    4 +-
 src/Tasque.Gtk/RemoteControl.cs                    |    2 +-
 src/Tasque.Gtk/TaskCalendar.cs                     |    4 +-
 src/Tasque.Gtk/TaskGroup.cs                        |    8 +-
 src/Tasque.Gtk/TaskTreeView.cs                     |   24 ++--
 src/Tasque.Gtk/TaskWindow.cs                       |   34 ++--
 src/Tasque.Gtk/Tasque.Gtk.csproj                   |    8 +-
 src/Tasque.Gtk/Utilities.cs                        |    2 +-
 src/Tasque.Gtk/WindowsSingleInstanceSolution.cs    |   89 ++++++++++
 src/Tasque.MonoMac/Properties/AssemblyInfo.cs      |    4 +-
 src/Tasque.MonoMac/Tasque.MonoMac.csproj           |    3 +-
 src/libtasque/Logger.cs                            |  179 --------------------
 src/libtasque/Task.cs                              |    7 +-
 src/libtasque/libtasque.csproj                     |    1 -
 .../Legacy/Commands/ComponentCommands.cs           |    8 +
 .../IRemoteInstance.cs}                            |   38 +----
 src/libtasqueui/Legacy/NativeApplication.cs        |   94 ++++++++++
 .../{NativeApplication.cs => UICommand.cs}         |   36 +----
 src/libtasqueui/libtasqueui.csproj                 |    4 +-
 .../NativeApplication.cs => tasque/Program.cs}     |   62 ++++---
 .../Properties/AssemblyInfo.cs}                    |   43 +----
 src/tasque/tasque.csproj                           |  137 +++++++++++++++
 tasque.sln                                         |   20 ++-
 40 files changed, 658 insertions(+), 566 deletions(-)
---
diff --git a/build/build.csproj b/build/build.csproj
index dcad8b3..4355cfe 100644
--- a/build/build.csproj
+++ b/build/build.csproj
@@ -158,6 +158,9 @@
     <None Include="..\src\Tasque.MonoMac\Tasque.MonoMac.csproj">
       <Link>Tasque.MonoMac.csproj</Link>
     </None>
+    <None Include="..\src\tasque\tasque.csproj">
+      <Link>tasque.csproj</Link>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="SetDataAtBuildTime.cs" />
diff --git a/src/Addins/DummyBackend/DummyTask.cs b/src/Addins/DummyBackend/DummyTask.cs
index 3f7f5f0..39614f0 100644
--- a/src/Addins/DummyBackend/DummyTask.cs
+++ b/src/Addins/DummyBackend/DummyTask.cs
@@ -37,21 +37,21 @@ namespace Tasque.Backends.Dummy
 		#region Public Methods
 		public override void Activate ()
 		{
-			Logger.Debug ("DummyTask.Activate ()");
+			Debug.WriteLine ("DummyTask.Activate ()");
 			CompletionDate = DateTime.MinValue;
 			State = TaskState.Active;
 		}
 		
 		public override void Complete ()
 		{
-			Logger.Debug ("DummyTask.Complete ()");
+			Debug.WriteLine ("DummyTask.Complete ()");
 			CompletionDate = DateTime.Now;
 			State = TaskState.Completed;
 		}
 		
 		public override void Delete ()
 		{
-			Logger.Debug ("DummyTask.Delete ()");
+			Debug.WriteLine ("DummyTask.Delete ()");
 			State = TaskState.Deleted;
 		}
 		#endregion
diff --git a/src/Addins/HiveminderBackend/HmBackend.cs b/src/Addins/HiveminderBackend/HmBackend.cs
index 958c2bc..4c66751 100644
--- a/src/Addins/HiveminderBackend/HmBackend.cs
+++ b/src/Addins/HiveminderBackend/HmBackend.cs
@@ -98,9 +98,9 @@ namespace Tasque.Backends.HmBackend
 
 		void HandleRowChanged(object o, Gtk.RowChangedArgs args)
 		{
-			Logger.Debug ("Handle Row Changed : Task Modified.");
+			Debug.WriteLine ("Handle Row Changed : Task Modified.");
 			HmTask task = (HmTask) taskStore.GetValue (args.Iter, 0);
-			Logger.Debug (task.Name);
+			Debug.WriteLine (task.Name);
 			
 		}
 		
@@ -172,11 +172,11 @@ namespace Tasque.Backends.HmBackend
 		
 		public void Refresh()
 		{
-			Logger.Debug("Refreshing data...");
+			Debug.WriteLine("Refreshing data...");
 
 			runRefreshEvent.Set();
 			
-			Logger.Debug("Done refreshing data!");
+			Debug.WriteLine("Done refreshing data!");
 		}
 		
 		public void Initialize()
@@ -188,11 +188,11 @@ namespace Tasque.Backends.HmBackend
 				this.hm = new Hiveminder.Hiveminder(username, password);
 				configured = true;
 			} catch (HiveminderAuthException e) {
-				Logger.Debug (e.ToString());
-				Logger.Error ("Hiveminder authentication failed.");
+				Debug.WriteLine (e.ToString());
+				Trace.TraceError ("Hiveminder authentication failed.");
 			} catch (Exception e) {
-				Logger.Debug (e.ToString());
-				Logger.Error ("Unable to connect to Hiveminder");
+				Debug.WriteLine (e.ToString());
+				Trace.TraceError ("Unable to connect to Hiveminder");
 			}
 			//
 			// Add in the "All" Category
@@ -203,7 +203,7 @@ namespace Tasque.Backends.HmBackend
 			
 			runningRefreshThread = true;
 			if (refreshThread == null || refreshThread.ThreadState == ThreadState.Running) {
-				Logger.Debug ("RtmBackend refreshThread already running");
+				Debug.WriteLine ("RtmBackend refreshThread already running");
 			} else {
 				if (!refreshThread.IsAlive) {
 					refreshThread  = new Thread(RefreshThreadLoop);
@@ -217,7 +217,7 @@ namespace Tasque.Backends.HmBackend
 		{
 			Gtk.TreeIter iter;
 
-			Logger.Debug ("Fetching tasks");
+			Debug.WriteLine ("Fetching tasks");
 
 			HmTask[] tasks = HmTask.GetTasks (this.hm.DownloadTasks(), this);
 
@@ -227,7 +227,7 @@ namespace Tasque.Backends.HmBackend
 				taskStore.SetValue (iter, 0, task);				
 			}
 
-			Logger.Debug ("Fetching tasks Completed");
+			Debug.WriteLine ("Fetching tasks Completed");
 		}
 
 		public void RefreshCategories ()
@@ -241,7 +241,7 @@ namespace Tasque.Backends.HmBackend
 				categoryListStore.SetValue (iter, 0, category);
 			}
 
-		    Logger.Debug ("Fetching Categories");
+		    Debug.WriteLine ("Fetching Categories");
 		}
 
 		public void Cleanup()
@@ -373,7 +373,7 @@ namespace Tasque.Backends.HmBackend
 
 		public void UpdateTask (HmTask task)
 		{
-			Logger.Debug ("Updating task : " + task.Id);
+			Debug.WriteLine ("Updating task : " + task.Id);
 			this.hm.UpdateTask (task.RemoteTask);
 		}
 
diff --git a/src/Addins/HiveminderBackend/HmTask.cs b/src/Addins/HiveminderBackend/HmTask.cs
index 4d592ea..56c568d 100644
--- a/src/Addins/HiveminderBackend/HmTask.cs
+++ b/src/Addins/HiveminderBackend/HmTask.cs
@@ -74,7 +74,7 @@ namespace Tasque.Backends.HmBackend
 		public override DateTime CompletionDate
 		{
 			get {return DateTime.Now;}
-			set {Logger.Info ("Not implemented");}
+			set {Trace.TraceInformation ("Not implemented");}
 		}
 		
 		public override bool IsComplete 
@@ -139,7 +139,7 @@ namespace Tasque.Backends.HmBackend
 		public override Category Category
 		{
 			get {return null;} 
-			set { Logger.Info ("Not implemented");}
+			set { Trace.TraceInformation ("Not implemented");}
 		}
 		
 		public override List<TaskNote> Notes
@@ -161,7 +161,7 @@ namespace Tasque.Backends.HmBackend
 		public uint TimerID
 		{
 			get { return 0; }
-			set {Logger.Info ("Not implemented"); }
+			set {Trace.TraceInformation ("Not implemented"); }
 		}
 
 		public string GroupId
@@ -208,7 +208,7 @@ namespace Tasque.Backends.HmBackend
 		#region Methods	
 		public override void Activate ()
 		{
-			Logger.Info ("Activate : Not implemented");
+			Trace.TraceInformation ("Activate : Not implemented");
 		}
 		
 		/// <summary>
@@ -216,7 +216,7 @@ namespace Tasque.Backends.HmBackend
 		/// </summary>
 		public override void Inactivate ()
 		{
-			Logger.Info ("Inactivate " + Name);
+			Trace.TraceInformation ("Inactivate " + Name);
 			this.task.IsComplete = true;
 			this.backend.UpdateTask (this);
 		}
@@ -226,7 +226,7 @@ namespace Tasque.Backends.HmBackend
 		/// </summary>
 		public override void Complete ()
 		{
-                       Logger.Debug ("Complete : " + Name);
+                       Debug.WriteLine ("Complete : " + Name);
                        this.task.IsComplete = true;
 		       this.backend.UpdateTask (this);
 		}
@@ -236,7 +236,7 @@ namespace Tasque.Backends.HmBackend
 		/// </summary>
 		public override void Delete ()
 		{
-			Logger.Info ("Delete : Not implemented");
+			Trace.TraceInformation ("Delete : Not implemented");
 		}
 		
 		/// <summary>
@@ -247,7 +247,7 @@ namespace Tasque.Backends.HmBackend
 		/// </param>
 		public override TaskNote CreateNote(string text)
 		{
-			Logger.Debug ("CreateNote : " + text);
+			Debug.WriteLine ("CreateNote : " + text);
 
 			HmNote hmNote = new HmNote (this.task);
 			hmNote.Text = text;
@@ -268,7 +268,7 @@ namespace Tasque.Backends.HmBackend
 		/// </param>
 		public override void DeleteNote(TaskNote note)
 		{
-		       Logger.Debug ("DeleteNote : " + note.Text);
+		       Debug.WriteLine ("DeleteNote : " + note.Text);
 
 		       foreach(HmNote hmNote in notes) {
 			       if(string.Equals (hmNote.Text, note.Text)) {
@@ -289,7 +289,7 @@ namespace Tasque.Backends.HmBackend
 		/// </param>
 		public override void SaveNote(TaskNote note)
 		{		
-			Logger.Debug ("SaveNote : " + note.Text);
+			Debug.WriteLine ("SaveNote : " + note.Text);
 
 			HmNote hmNote = new HmNote (this.task);
 			hmNote.Text = note.Text;
diff --git a/src/Addins/RtmBackend/RtmBackend.cs b/src/Addins/RtmBackend/RtmBackend.cs
index 881b77f..e52e66f 100644
--- a/src/Addins/RtmBackend/RtmBackend.cs
+++ b/src/Addins/RtmBackend/RtmBackend.cs
@@ -151,8 +151,8 @@ namespace Tasque.Backends.RtmBackend
 
 					rtmTask = UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set create task: " + taskName);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set create task: " + taskName);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 			else
@@ -179,8 +179,8 @@ namespace Tasque.Backends.RtmBackend
 						});
 					}
 				} catch(Exception e) {
-					Logger.Debug("Unable to delete task: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to delete task: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 			else
@@ -189,14 +189,14 @@ namespace Tasque.Backends.RtmBackend
 		
 		public void Refresh()
 		{
-			Logger.Debug("Refreshing data...");
+			Debug.WriteLine("Refreshing data...");
 
 			if (!runningRefreshThread)
 				StartThread();
 
 			runRefreshEvent.Set();
 			
-			Logger.Debug("Done refreshing data!");
+			Debug.WriteLine("Done refreshing data!");
 		}
 
 		public void Initialize()
@@ -207,13 +207,13 @@ namespace Tasque.Backends.RtmBackend
 			string authToken =
 				Application.Preferences.Get (Preferences.AuthTokenKey);
 			if (authToken != null ) {
-				Logger.Debug("Found AuthToken, checking credentials...");
+				Debug.WriteLine("Found AuthToken, checking credentials...");
 				try {
 					rtm = new Rtm(apiKey, sharedSecret, authToken);
 					rtmAuth = rtm.AuthCheckToken(authToken);
 					timeline = rtm.TimelineCreate();
-					Logger.Debug("RTM Auth Token is valid!");
-					Logger.Debug("Setting configured status to true");
+					Debug.WriteLine("RTM Auth Token is valid!");
+					Debug.WriteLine("Setting configured status to true");
 					configured = true;
 				} catch (RtmNet.RtmApiException e) {
 					
@@ -222,17 +222,17 @@ namespace Tasque.Backends.RtmBackend
 					Application.Preferences.Set (Preferences.UserNameKey, null);
 					rtm = null;
 					rtmAuth = null;
-					Logger.Error("Exception authenticating, reverting" + e.Message);
+					Trace.TraceError("Exception authenticating, reverting" + e.Message);
 				} 			
 				catch (RtmNet.RtmWebException e) {
 					rtm = null;
 					rtmAuth = null;
-					Logger.Error("Not connected to RTM, maybe proxy: #{0}", e.Message);
+					Trace.TraceError("Not connected to RTM, maybe proxy: #{0}", e.Message);
  				}
 				catch (System.Net.WebException e) {
 					rtm = null;
 					rtmAuth = null;
-					Logger.Error("Problem connecting to internet: #{0}", e.Message);
+					Trace.TraceError("Problem connecting to internet: #{0}", e.Message);
 				}
 			}
 
@@ -245,13 +245,13 @@ namespace Tasque.Backends.RtmBackend
 		public void StartThread()
 		{
 			if (!configured) {
-				Logger.Debug("Backend not configured, not starting thread");
+				Debug.WriteLine("Backend not configured, not starting thread");
 				return;
 			}
 			runningRefreshThread = true;
-			Logger.Debug("ThreadState: " + refreshThread.ThreadState);
+			Debug.WriteLine("ThreadState: " + refreshThread.ThreadState);
 			if (refreshThread.ThreadState == ThreadState.Running) {
-				Logger.Debug ("RtmBackend refreshThread already running");
+				Debug.WriteLine ("RtmBackend refreshThread already running");
 			} else {
 				if (!refreshThread.IsAlive) {
 					refreshThread  = new Thread(RefreshThreadLoop);
@@ -295,19 +295,19 @@ namespace Tasque.Backends.RtmBackend
 			string authToken =
 				Application.Preferences.Get (Preferences.AuthTokenKey);
 			if (authToken != null ) {
-				Logger.Debug("Found AuthToken, checking credentials...");
+				Debug.WriteLine("Found AuthToken, checking credentials...");
 				try {
 					rtm = new Rtm(apiKey, sharedSecret, authToken);
 					rtmAuth = rtm.AuthCheckToken(authToken);
 					timeline = rtm.TimelineCreate();
-					Logger.Debug("RTM Auth Token is valid!");
-					Logger.Debug("Setting configured status to true");
+					Debug.WriteLine("RTM Auth Token is valid!");
+					Debug.WriteLine("Setting configured status to true");
 					configured = true;
 					Refresh();
 				} catch (Exception e) {
 					rtm = null;
 					rtmAuth = null;				
-					Logger.Error("Exception authenticating, reverting" + e.Message);
+					Trace.TraceError("Exception authenticating, reverting" + e.Message);
 				}	
 			}
 		}
@@ -319,8 +319,8 @@ namespace Tasque.Backends.RtmBackend
 					List list = rtm.TasksSetName(timeline, task.ListID, task.SeriesTaskID, task.TaskTaskID, task.Name);		
 					UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set name on task: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set name on task: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 		}
@@ -336,8 +336,8 @@ namespace Tasque.Backends.RtmBackend
 						list = rtm.TasksSetDueDate(timeline, task.ListID, task.SeriesTaskID, task.TaskTaskID, task.DueDateString);
 					UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set due date on task: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set due date on task: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 		}
@@ -354,8 +354,8 @@ namespace Tasque.Backends.RtmBackend
 					List list = rtm.TasksSetPriority(timeline, task.ListID, task.SeriesTaskID, task.TaskTaskID, task.PriorityString);
 					UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set priority on task: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set priority on task: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 		}
@@ -369,8 +369,8 @@ namespace Tasque.Backends.RtmBackend
 						List list = rtm.TasksUncomplete(timeline, task.ListID, task.SeriesTaskID, task.TaskTaskID);
 						UpdateTaskFromResult(list);
 					} catch(Exception e) {
-						Logger.Debug("Unable to set Task as completed: " + task.Name);
-						Logger.Debug(e.ToString());
+						Debug.WriteLine("Unable to set Task as completed: " + task.Name);
+						Debug.WriteLine(e.ToString());
 					}
 				}
 			}
@@ -390,8 +390,8 @@ namespace Tasque.Backends.RtmBackend
 					List list = rtm.TasksComplete(timeline, task.ListID, task.SeriesTaskID, task.TaskTaskID);
 					UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set Task as completed: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set Task as completed: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}
 		}	
@@ -409,8 +409,8 @@ namespace Tasque.Backends.RtmBackend
 					List list = rtm.TasksMoveTo(timeline, task.ListID, id, task.SeriesTaskID, task.TaskTaskID);
 					UpdateTaskFromResult(list);
 				} catch(Exception e) {
-					Logger.Debug("Unable to set Task as completed: " + task.Name);
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to set Task as completed: " + task.Name);
+					Debug.WriteLine(e.ToString());
 				}
 			}					
 		}
@@ -472,8 +472,8 @@ namespace Tasque.Backends.RtmBackend
 					note = rtm.NotesAdd(timeline, rtmTask.ListID, rtmTask.SeriesTaskID, rtmTask.TaskTaskID, String.Empty, text);
 					rtmNote = new RtmNote(note);
 				} catch(Exception e) {
-					Logger.Debug("RtmBackend.CreateNote: Unable to create a new note");
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("RtmBackend.CreateNote: Unable to create a new note");
+					Debug.WriteLine(e.ToString());
 				}
 			}
 			else
@@ -489,8 +489,8 @@ namespace Tasque.Backends.RtmBackend
 				try {
 					rtm.NotesDelete(timeline, note.ID);
 				} catch(Exception e) {
-					Logger.Debug("RtmBackend.DeleteNote: Unable to delete note");
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("RtmBackend.DeleteNote: Unable to delete note");
+					Debug.WriteLine(e.ToString());
 				}
 			}
 			else
@@ -503,8 +503,8 @@ namespace Tasque.Backends.RtmBackend
 				try {
 					rtm.NotesEdit(timeline, note.ID, String.Empty, note.Text);
 				} catch(Exception e) {
-					Logger.Debug("RtmBackend.SaveNote: Unable to save note");
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("RtmBackend.SaveNote: Unable to save note");
+					Debug.WriteLine(e.ToString());
 				}
 			}
 			else
@@ -538,7 +538,7 @@ namespace Tasque.Backends.RtmBackend
 		/// </summary>		
 		private void UpdateCategories(Lists lists)
 		{
-			Logger.Debug("RtmBackend.UpdateCategories was called");
+			Debug.WriteLine("RtmBackend.UpdateCategories was called");
 			
 			try {
 				foreach(List list in lists.listCollection)
@@ -564,9 +564,9 @@ namespace Tasque.Backends.RtmBackend
 					}
 				}
 			} catch (Exception e) {
-				Logger.Debug("Exception in fetch " + e.Message);
+				Debug.WriteLine("Exception in fetch " + e.Message);
 			}
-			Logger.Debug("RtmBackend.UpdateCategories is done");			
+			Debug.WriteLine("RtmBackend.UpdateCategories is done");			
 		}
 
 		/// <summary>
@@ -575,7 +575,7 @@ namespace Tasque.Backends.RtmBackend
 		/// </summary>		
 		private void UpdateTasks(Lists lists)
 		{
-			Logger.Debug("RtmBackend.UpdateTasks was called");
+			Debug.WriteLine("RtmBackend.UpdateTasks was called");
 			
 			try {
 				foreach(List list in lists.listCollection)
@@ -584,7 +584,7 @@ namespace Tasque.Backends.RtmBackend
 					try {
 						tasks = rtm.TasksGetList(list.ID);
 					} catch (Exception tglex) {
-						Logger.Debug("Exception calling TasksGetList(list.ListID) " + tglex.Message);
+						Debug.WriteLine("Exception calling TasksGetList(list.ListID) " + tglex.Message);
 					}
 
 					if(tasks != null) {
@@ -617,10 +617,10 @@ namespace Tasque.Backends.RtmBackend
 					}
 				}
 			} catch (Exception e) {
-				Logger.Debug("Exception in fetch " + e.Message);
-				Logger.Debug(e.ToString());
+				Debug.WriteLine("Exception in fetch " + e.Message);
+				Debug.WriteLine(e.ToString());
 			}
-			Logger.Debug("RtmBackend.UpdateTasks is done");			
+			Debug.WriteLine("RtmBackend.UpdateTasks is done");			
 		}
 		
 		
diff --git a/src/Addins/RtmBackend/RtmPreferencesWidget.cs b/src/Addins/RtmBackend/RtmPreferencesWidget.cs
index 51f17b6..6ac0ae8 100644
--- a/src/Addins/RtmBackend/RtmPreferencesWidget.cs
+++ b/src/Addins/RtmBackend/RtmPreferencesWidget.cs
@@ -91,10 +91,10 @@ namespace Tasque.Backends.RtmBackend
 		{
 			string authToken = Tasque.Application.Preferences.Get(Preferences.AuthTokenKey);
 			if (authToken == null || authToken.Trim() == "") {
-				Logger.Debug("Rtm: Not authorized");
+				Debug.WriteLine("Rtm: Not authorized");
 				isAuthorized = false;
 			} else {
-				Logger.Debug("Rtm: Authorized");
+				Debug.WriteLine("Rtm: Authorized");
 				isAuthorized = true;
 			}
 		}
@@ -108,28 +108,28 @@ namespace Tasque.Backends.RtmBackend
 					try {
 						url = rtmBackend.GetAuthUrl();
 					} catch (Exception) {
-						Logger.Debug ("Failed to get auth URL from Remember the Milk. Try again later.");
+						Debug.WriteLine ("Failed to get auth URL from Remember the Milk. Try again later.");
 						authButton.Label = Catalog.GetString ("Remember the Milk not responding. Try again later.");
 						return;
 					}
-					Logger.Debug("Launching browser to authorize with Remember the Milk");
+					Debug.WriteLine("Launching browser to authorize with Remember the Milk");
 					try {
 						Application.Instance.NativeApplication.OpenUrlInBrowser (url);
 						authRequested = true;
 						authButton.Label = Catalog.GetString ("Click Here After Authorizing");
 					} catch (Exception ex) {
-						Logger.Error ("Exception opening URL: {0}",ex.Message);
+						Trace.TraceError ("Exception opening URL: {0}",ex.Message);
 						authButton.Label = Catalog.GetString ("Set the default browser and try again");						
 					}			
 				} else if (!isAuthorized && authRequested) {
 					authButton.Label = Catalog.GetString ("Processing...");
 					try {
 						rtmBackend.FinishedAuth();
-						Logger.Debug("Successfully authorized with Remember the Milk");
+						Debug.WriteLine("Successfully authorized with Remember the Milk");
 						isAuthorized = true;
 						authRequested = false;
 					} catch (RtmNet.RtmApiException) {
-						Logger.Debug("Failed to authorize with Remember the Milk");
+						Debug.WriteLine("Failed to authorize with Remember the Milk");
 						isAuthorized = false;
 						authRequested = true;
 						authButton.Label = Catalog.GetString ("Failed, Try Again");
diff --git a/src/Addins/RtmBackend/RtmTask.cs b/src/Addins/RtmBackend/RtmTask.cs
index 27bc03f..d092ce1 100644
--- a/src/Addins/RtmBackend/RtmTask.cs
+++ b/src/Addins/RtmBackend/RtmTask.cs
@@ -235,7 +235,7 @@ namespace Tasque.Backends.RtmBackend
 		/// </summary>
 		public override void Activate ()
 		{
-			Logger.Debug("Activating Task: " + Name);
+			Debug.WriteLine("Activating Task: " + Name);
 			state = TaskState.Active;
 			taskSeries.Task.Completed = DateTime.MinValue;
 			rtmBackend.UpdateTaskActive(this);
@@ -246,7 +246,7 @@ namespace Tasque.Backends.RtmBackend
 		/// </summary>
 		public override void Inactivate ()
 		{
-			Logger.Debug("Inactivating Task: " + Name);		
+			Debug.WriteLine("Inactivating Task: " + Name);		
 			state = TaskState.Inactive;
 			taskSeries.Task.Completed = DateTime.Now;
 			rtmBackend.UpdateTaskInactive(this);
@@ -257,7 +257,7 @@ namespace Tasque.Backends.RtmBackend
 		/// </summary>
 		public override void Complete ()
 		{
-			Logger.Debug("Completing Task: " + Name);			
+			Debug.WriteLine("Completing Task: " + Name);			
 			state = TaskState.Completed;
 			if(taskSeries.Task.Completed == DateTime.MinValue)
 				taskSeries.Task.Completed = DateTime.Now;
diff --git a/src/Addins/SqliteBackend/Database.cs b/src/Addins/SqliteBackend/Database.cs
index ce0fce9..a1609ce 100644
--- a/src/Addins/SqliteBackend/Database.cs
+++ b/src/Addins/SqliteBackend/Database.cs
@@ -116,7 +116,7 @@ namespace Tasque.Backends.Sqlite
 	        	dataReader.Close();
 	        	cmd.Dispose();
 			} catch (Exception e) {
-				Logger.Debug("Exception Thrown {0}", e);
+				Debug.WriteLine("Exception Thrown {0}", e);
 			}
         	return readString;
         }
@@ -132,7 +132,7 @@ namespace Tasque.Backends.Sqlite
 	        	else
 	        		dtValue = Database.ToDateTime(longValue);
 			} catch (Exception e) {
-				Logger.Debug("Exception Thrown {0}", e);
+				Debug.WriteLine("Exception Thrown {0}", e);
 				dtValue = DateTime.MinValue;
 			}
         	return dtValue;
@@ -152,7 +152,7 @@ namespace Tasque.Backends.Sqlite
 	        	dataReader.Close();
 	        	cmd.Dispose();
 			} catch (Exception e) {
-				Logger.Debug("Exception Thrown {0}", e);
+				Debug.WriteLine("Exception Thrown {0}", e);
 			}        	
         	return dtVal;
         }  
@@ -171,7 +171,7 @@ namespace Tasque.Backends.Sqlite
 	        	dataReader.Close();
 	        	cmd.Dispose();
 			} catch (Exception e) {
-				Logger.Debug("Exception Thrown {0}", e);
+				Debug.WriteLine("Exception Thrown {0}", e);
 			} 
         	return dtVal;
         }  
diff --git a/src/Addins/SqliteBackend/SqliteBackend.cs b/src/Addins/SqliteBackend/SqliteBackend.cs
index 7f1a831..68dfcd0 100644
--- a/src/Addins/SqliteBackend/SqliteBackend.cs
+++ b/src/Addins/SqliteBackend/SqliteBackend.cs
@@ -223,10 +223,10 @@ namespace Tasque.Backends.Sqlite
 			if (task.State == TaskState.Deleted) {
 				taskIters.Remove (task.SqliteId);
 				if (!taskStore.Remove (ref iter)) {
-					Logger.Debug ("Successfully deleted from taskStore: {0}",
+					Debug.WriteLine ("Successfully deleted from taskStore: {0}",
 						task.Name);
 				} else {
-					Logger.Debug ("Problem removing from taskStore: {0}",
+					Debug.WriteLine ("Problem removing from taskStore: {0}",
 						task.Name);
 				}
 			} else {
diff --git a/src/Addins/SqliteBackend/SqliteCategory.cs b/src/Addins/SqliteBackend/SqliteCategory.cs
index 146c077..0fdac61 100644
--- a/src/Addins/SqliteBackend/SqliteCategory.cs
+++ b/src/Addins/SqliteBackend/SqliteCategory.cs
@@ -48,7 +48,7 @@ namespace Tasque.Backends.Sqlite
 			this.backend = backend;
 			string command = String.Format("INSERT INTO Categories (Name, ExternalID) values ('{0}', '{1}'); SELECT last_insert_rowid();", name, string.Empty);
 			this.id = Convert.ToInt32 (backend.Database.ExecuteScalar(command));
-			//Logger.Debug("Inserted category named: {0} with id {1}", name, id);
+			//Debug.WriteLine("Inserted category named: {0} with id {1}", name, id);
 		}
 		
 		public SqliteCategory (SqliteBackend backend, int id)
diff --git a/src/Addins/SqliteBackend/SqliteTask.cs b/src/Addins/SqliteBackend/SqliteTask.cs
index 3f817ea..70fbeef 100644
--- a/src/Addins/SqliteBackend/SqliteTask.cs
+++ b/src/Addins/SqliteBackend/SqliteTask.cs
@@ -22,7 +22,7 @@ namespace Tasque.Backends.Sqlite
 		public SqliteTask(SqliteBackend backend, string name)
 		{
 			this.backend = backend;
-			Logger.Debug("Creating New Task Object : {0} (id={1})", name, id);
+			Debug.WriteLine("Creating New Task Object : {0} (id={1})", name, id);
 			name = backend.SanitizeText (name);
 			this.name = name;
 			this.dueDate =  Database.FromDateTime(DateTime.MinValue);
@@ -182,7 +182,7 @@ namespace Tasque.Backends.Sqlite
 		#region Public Methods
 		public override void Activate ()
 		{
-			// Logger.Debug ("SqliteTask.Activate ()");
+			// Debug.WriteLine ("SqliteTask.Activate ()");
 			CompletionDate = DateTime.MinValue;
 			LocalState = TaskState.Active;
 			backend.UpdateTask (this);
@@ -190,7 +190,7 @@ namespace Tasque.Backends.Sqlite
 		
 		public override void Inactivate ()
 		{
-			// Logger.Debug ("SqliteTask.Inactivate ()");
+			// Debug.WriteLine ("SqliteTask.Inactivate ()");
 			CompletionDate = DateTime.Now;
 			LocalState = TaskState.Inactive;
 			backend.UpdateTask (this);
@@ -198,7 +198,7 @@ namespace Tasque.Backends.Sqlite
 		
 		public override void Complete ()
 		{
-			//Logger.Debug ("SqliteTask.Complete ()");
+			//Debug.WriteLine ("SqliteTask.Complete ()");
 			CompletionDate = DateTime.Now;
 			LocalState = TaskState.Completed;
 			backend.UpdateTask (this);
@@ -206,14 +206,14 @@ namespace Tasque.Backends.Sqlite
 		
 		public override void Delete ()
 		{
-			//Logger.Debug ("SqliteTask.Delete ()");
+			//Debug.WriteLine ("SqliteTask.Delete ()");
 			LocalState = TaskState.Deleted;
 			backend.UpdateTask (this);
 		}
 		
 		public override TaskNote CreateNote(string text)
 		{
-			Logger.Debug("Creating New Note Object : {0} (id={1})", text, id);
+			Debug.WriteLine("Creating New Note Object : {0} (id={1})", text, id);
 			text = backend.SanitizeText (text);
 			string command = String.Format("INSERT INTO Notes (Task, Text) VALUES ('{0}','{1}'); SELECT last_insert_rowid();", id, text);
 			int taskId = Convert.ToInt32 (backend.Database.ExecuteScalar(command));
diff --git a/src/Tasque.Gtk/Application.cs b/src/Tasque.Gtk/Application.cs
index dc319eb..83c4f29 100644
--- a/src/Tasque.Gtk/Application.cs
+++ b/src/Tasque.Gtk/Application.cs
@@ -40,10 +40,13 @@ using Gtk;
 using Gdk;
 using Mono.Unix;
 using Mono.Unix.Native;
+using Tasque.UIModel.Legacy;
+using System.Diagnostics;
+
+
 #if ENABLE_NOTIFY_SHARP
 using Notifications;
 #endif
-using Tasque.Backends;
 
 namespace Tasque
 {
@@ -51,8 +54,8 @@ namespace Tasque
 	{
 		private static Tasque.Application application = null;
 		private static System.Object locker = new System.Object();
-		private INativeApplication nativeApp;
-#if !WIN32 && !OSX
+		private NativeApplication nativeApp;
+#if !WIN32
 		private RemoteControl remoteControl;
 #endif
 		private Gtk.StatusIcon trayIcon;	
@@ -72,21 +75,7 @@ namespace Tasque
 		
 		private Backend customBackend;
 
-		private UIManager uiManager;
-		private const string menuXml = @"
-<ui>
-	<popup name=""TrayIconMenu"">
-		<menuitem action=""NewTaskAction""/>
-		<separator/>
-		<menuitem action=""PreferencesAction""/>
-		<menuitem action=""AboutAction""/>
-		<separator/>
-		<menuitem action=""RefreshAction""/>
-		<separator/>
-		<menuitem action=""QuitAction""/>
-	</popup>
-</ui>
-";
+
 
 		public static Backend Backend
 		{ 
@@ -116,7 +105,7 @@ namespace Tasque
 			}
 		}
 
-		public INativeApplication NativeApplication
+		public NativeApplication NativeApplication
 		{
 			get
 			{
@@ -148,9 +137,7 @@ namespace Tasque
 
 		private void Init(string[] args)
 		{
-#if OSX
-			nativeApp = new OSXApplication ();
-#elif WIN32 || GTKLINUX
+#if WIN32 || GTKLINUX
 			nativeApp = new GtkApplication ();
 #else
 			nativeApp = new GnomeApplication ();
@@ -161,12 +148,12 @@ namespace Tasque
 
 			preferences = new Preferences (nativeApp.ConfDir);
 			
-#if !WIN32 && !OSX
+#if !WIN32
 			// Register Tasque RemoteControl
 			try {
 				remoteControl = RemoteControlProxy.Register ();
 				if (remoteControl != null) {
-					Logger.Debug ("Tasque remote control active.");
+					Debug.Write ("Tasque remote control active.");
 				} else {
 					// If Tasque is already running, open the tasks window
 					// so the user gets some sort of feedback when they
@@ -177,11 +164,11 @@ namespace Tasque
 						remote.ShowTasks ();
 					} catch {}
 
-					Logger.Debug ("Tasque is already running.  Exiting...");
+					Debug.WriteLine ("Tasque is already running.  Exiting...");
 					System.Environment.Exit (0);
 				}
 			} catch (Exception e) {
-				Logger.Debug ("Tasque remote control disabled (DBus exception): {0}",
+				Debug.WriteLine ("Tasque remote control disabled (DBus exception): {0}",
 				            e.Message);
 			}
 #endif
@@ -193,7 +180,7 @@ namespace Tasque
 					
 				case "--quiet":
 					quietStart = true;
-					Logger.Debug ("Starting quietly");
+					Debug.WriteLine ("Starting quietly");
 					break;
 					
 				case "--backend":
@@ -214,7 +201,7 @@ namespace Tasque
 			
 			// See if a specific backend is specified
 			if (potentialBackendClassName != null) {
-				Logger.Debug ("Backend specified: " +
+				Debug.WriteLine ("Backend specified: " +
 				              potentialBackendClassName);
 				
 				customBackend = null;
@@ -223,7 +210,7 @@ namespace Tasque
 					customBackend = (Backend)
 						asm.CreateInstance (potentialBackendClassName);
 				} catch (Exception e) {
-					Logger.Warn ("Backend specified on args not found: {0}\n\t{1}",
+					Trace.TraceWarning ("Backend specified on args not found: {0}\n\t{1}",
 						potentialBackendClassName, e.Message);
 				}
 			}
@@ -253,19 +240,19 @@ namespace Tasque
 			
 			// Look through the assemblies located in the same directory as
 			// Tasque.exe.
-			Logger.Debug ("Tasque.exe location:  {0}", tasqueAssembly.Location);
+			Debug.WriteLine ("Tasque.exe location:  {0}", tasqueAssembly.Location);
 			
 			DirectoryInfo loadPathInfo =
 				Directory.GetParent (tasqueAssembly.Location);
-			Logger.Info ("Searching for Backend DLLs in: {0}", loadPathInfo.FullName);
+			Trace.TraceInformation ("Searching for Backend DLLs in: {0}", loadPathInfo.FullName);
 			
 			foreach (FileInfo fileInfo in loadPathInfo.GetFiles ("*.dll")) {
-				Logger.Info ("\tReading {0}", fileInfo.FullName);
+				Trace.TraceInformation ("\tReading {0}", fileInfo.FullName);
 				Assembly asm = null;
 				try {
 					asm = Assembly.LoadFile (fileInfo.FullName);
 				} catch (Exception e) {
-					Logger.Debug ("Exception loading {0}: {1}",
+					Debug.WriteLine ("Exception loading {0}: {1}",
 								  fileInfo.FullName,
 								  e.Message);
 					continue;
@@ -279,7 +266,7 @@ namespace Tasque
 				if (availableBackends.ContainsKey (typeId))
 					continue;
 				
-				Logger.Debug ("Storing '{0}' = '{1}'", typeId, backend.Name);
+				Debug.WriteLine ("Storing '{0}' = '{1}'", typeId, backend.Name);
 				availableBackends [typeId] = backend;
 			}
 		}
@@ -293,7 +280,7 @@ namespace Tasque
 			try {
 				types = asm.GetTypes ();
 			} catch (Exception e) {
-				Logger.Warn ("Exception reading types from assembly '{0}': {1}",
+				Trace.TraceWarning ("Exception reading types from assembly '{0}': {1}",
 					asm.ToString (), e.Message);
 				return backends;
 			}
@@ -304,14 +291,14 @@ namespace Tasque
 				if (type.GetInterface ("Tasque.Backends.IBackend") == null) {
 					continue;
 				}
-				Logger.Debug ("Found Available Backend: {0}", type.ToString ());
+				Debug.WriteLine ("Found Available Backend: {0}", type.ToString ());
 				
 				Backend availableBackend = null;
 				try {
 					availableBackend = (Backend)
 						asm.CreateInstance (type.ToString ());
 				} catch (Exception e) {
-					Logger.Warn ("Could not instantiate {0}: {1}",
+					Trace.TraceWarning ("Could not instantiate {0}: {1}",
 								 type.ToString (),
 								 e.Message);
 					continue;
@@ -333,11 +320,11 @@ namespace Tasque
 				changingBackend = true;
 				// Cleanup the old backend
 				try {
-					Logger.Debug ("Cleaning up backend: {0}",
+					Debug.WriteLine ("Cleaning up backend: {0}",
 					              this.backend.Name);
 					this.backend.Cleanup ();
 				} catch (Exception e) {
-					Logger.Warn ("Exception cleaning up '{0}': {1}",
+					Trace.TraceWarning ("Exception cleaning up '{0}': {1}",
 					             this.backend.Name,
 					             e);
 				}
@@ -350,7 +337,7 @@ namespace Tasque
 				return;
 			}
 				
-			Logger.Info ("Using backend: {0} ({1})",
+			Trace.TraceInformation ("Using backend: {0} ({1})",
 			             this.backend.Name,
 			             this.backend.GetType ().ToString ());
 			this.backend.Initialize();
@@ -364,7 +351,7 @@ namespace Tasque
 			RebuildTooltipTaskGroupModels ();
 			RefreshTrayIconTooltip ();
 			
-			Logger.Debug("Configuration status: {0}",
+			Debug.WriteLine("Configuration status: {0}",
 			             this.backend.Configured.ToString());
 		}
 
@@ -377,7 +364,7 @@ namespace Tasque
 				// to use.  If so, use it, otherwise, pop open the preferences
 				// dialog so they can choose one.
 				string backendTypeString = Preferences.Get (Preferences.CurrentBackend);
-				Logger.Debug ("CurrentBackend specified in Preferences: {0}", backendTypeString);
+				Debug.WriteLine ("CurrentBackend specified in Preferences: {0}", backendTypeString);
 				if (backendTypeString != null
 						&& availableBackends.ContainsKey (backendTypeString)) {
 					Application.Backend = availableBackends [backendTypeString];
@@ -408,7 +395,7 @@ namespace Tasque
 					backend.Initialize();
 				}
 			} catch (Exception e) {
-				Logger.Error("{0}", e.Message);
+				Trace.TraceError("{0}", e.Message);
 			}
 			if (backend == null || !backend.Configured) {
 				return true;
@@ -420,7 +407,7 @@ namespace Tasque
 		private bool CheckForDaySwitch ()
 		{
 			if (DateTime.Today != currentDay) {
-				Logger.Debug ("Day has changed, reloading tasks");
+				Debug.WriteLine ("Day has changed, reloading tasks");
 				currentDay = DateTime.Today;
 				// Reinitialize window according to new date
 				if (TaskWindow.IsOpen)
@@ -531,7 +518,7 @@ namespace Tasque
 
 		private void OnPreferences (object sender, EventArgs args)
 		{
-			Logger.Info ("OnPreferences called");
+			Trace.TraceInformation ("OnPreferences called");
 			if (preferencesDialog == null) {
 				preferencesDialog = new PreferencesDialog ();
 				preferencesDialog.Hidden += OnPreferencesDialogHidden;
@@ -603,7 +590,7 @@ namespace Tasque
 
 		private void OnQuit (object sender, EventArgs args)
 		{
-			Logger.Info ("OnQuit called - terminating application");
+			Trace.TraceInformation ("OnQuit called - terminating application");
 			if (backend != null) {
 				UnhookFromTooltipTaskGroupModels ();
 				backend.Cleanup();
@@ -645,7 +632,7 @@ namespace Tasque
 			} 
 			catch (Exception e)
 			{
-				Tasque.Logger.Debug("Exception is: {0}", e);
+				Debug.WriteLine("Exception is: {0}", e);
 				Instance.NativeApplication.Exit (-1);
 			}
 		}
@@ -684,48 +671,5 @@ namespace Tasque
 		{
 			OnQuit (null, null);
 		}
-
-		private void RegisterUIManager ()
-		{
-			ActionGroup trayActionGroup = new ActionGroup ("Tray");
-			trayActionGroup.Add (new ActionEntry [] {
-				new ActionEntry ("NewTaskAction",
-				                 Stock.New,
-				                 Catalog.GetString ("New Task ..."),
-				                 null,
-				                 null,
-				                 OnNewTask),
-				
-				new ActionEntry ("ShowTasksAction",
-				                 null,
-				                 Catalog.GetString ("Show Tasks ..."),
-				                 null,
-				                 null,
-				                 OnShowTaskWindow),
-
-				new ActionEntry ("AboutAction",
-				                 Stock.About,
-				                 OnAbout),
-				
-				new ActionEntry ("PreferencesAction",
-				                 Stock.Preferences,
-				                 OnPreferences),
-				
-				new ActionEntry ("RefreshAction",
-				                 Stock.Execute,
-				                 Catalog.GetString ("Refresh Tasks ..."),
-				                 null,
-				                 null,
-				                 OnRefreshAction),
-				
-				new ActionEntry ("QuitAction",
-				                 Stock.Quit,
-				                 OnQuit)
-			});
-			
-			uiManager = new UIManager ();
-			uiManager.AddUiFromString (menuXml);
-			uiManager.InsertActionGroup (trayActionGroup, 0);
-		}
 	}
 }
diff --git a/src/Tasque.Gtk/GtkApplication.cs b/src/Tasque.Gtk/GtkApplication.cs
index f51aae5..a094d35 100644
--- a/src/Tasque.Gtk/GtkApplication.cs
+++ b/src/Tasque.Gtk/GtkApplication.cs
@@ -27,6 +27,9 @@
 
 using System;
 using System.IO;
+using Gtk;
+using Mono.Unix;
+using Tasque.UIModel.Legacy;
 
 namespace Tasque
 {
@@ -72,8 +75,67 @@ namespace Tasque
 			try {
 				System.Diagnostics.Process.Start (url);
 			} catch (Exception e) {
-				Logger.Error ("Error opening url [{0}]:\n{1}", url, e.ToString ());
+				Trace.TraceError ("Error opening url [{0}]:\n{1}", url, e.ToString ());
 			}
 		}
+		
+		void RegisterUIManager ()
+		{
+			ActionGroup trayActionGroup = new ActionGroup ("Tray");
+			trayActionGroup.Add (new ActionEntry [] {
+				new ActionEntry ("NewTaskAction",
+				                 Stock.New,
+				                 Catalog.GetString ("New Task ..."),
+				                 null,
+				                 null,
+				                 OnNewTask),
+				
+				new ActionEntry ("ShowTasksAction",
+				                 null,
+				                 Catalog.GetString ("Show Tasks ..."),
+				                 null,
+				                 null,
+				                 OnShowTaskWindow),
+
+				new ActionEntry ("AboutAction",
+				                 Stock.About,
+				                 OnAbout),
+				
+				new ActionEntry ("PreferencesAction",
+				                 Stock.Preferences,
+				                 OnPreferences),
+				
+				new ActionEntry ("RefreshAction",
+				                 Stock.Execute,
+				                 Catalog.GetString ("Refresh Tasks ..."),
+				                 null,
+				                 null,
+				                 OnRefreshAction),
+				
+				new ActionEntry ("QuitAction",
+				                 Stock.Quit,
+				                 OnQuit)
+			});
+			
+			uiManager = new UIManager ();
+			uiManager.AddUiFromString (MenuXml);
+			uiManager.InsertActionGroup (trayActionGroup, 0);
+		}
+		
+		UIManager uiManager;
+		const string MenuXml = @"
+<ui>
+	<popup name=""TrayIconMenu"">
+		<menuitem action=""NewTaskAction""/>
+		<separator/>
+		<menuitem action=""PreferencesAction""/>
+		<menuitem action=""AboutAction""/>
+		<separator/>
+		<menuitem action=""RefreshAction""/>
+		<separator/>
+		<menuitem action=""QuitAction""/>
+	</popup>
+</ui>
+";
 	}
 }
diff --git a/src/Tasque.Gtk/NoteDialog.cs b/src/Tasque.Gtk/NoteDialog.cs
index 7392ece..402dfcf 100644
--- a/src/Tasque.Gtk/NoteDialog.cs
+++ b/src/Tasque.Gtk/NoteDialog.cs
@@ -88,7 +88,7 @@ namespace Tasque
 		#region Public Methods
 		public void CreateNewNote()
 		{
-			Logger.Debug("Creating a new note");
+			Debug.WriteLine("Creating a new note");
 			NoteWidget noteWidget = new NoteWidget (null);
 			noteWidget.TextChanged += OnNoteTextChanged;
 			noteWidget.DeleteButtonClicked += OnDeleteButtonClicked;
@@ -120,8 +120,8 @@ namespace Tasque
 				task.DeleteNote(nWidget.Note);
 				targetVBox.Remove (nWidget);
 			} catch(Exception e) {
-				Logger.Debug("Unable to delete the note");
-				Logger.Debug(e.ToString());
+				Debug.WriteLine("Unable to delete the note");
+				Debug.WriteLine(e.ToString());
 			}
 		}
 
@@ -143,15 +143,15 @@ namespace Tasque
 					TaskNote note = task.CreateNote(nWidget.Text);
 					nWidget.Note = note;
 				} catch(Exception e) {
-					Logger.Debug("Unable to create a note");
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to create a note");
+					Debug.WriteLine(e.ToString());
 				}
 			} else {
 				try {
 					task.SaveNote(nWidget.Note);
 				} catch(Exception e) {
-					Logger.Debug("Unable to save note");
-					Logger.Debug(e.ToString());
+					Debug.WriteLine("Unable to save note");
+					Debug.WriteLine(e.ToString());
 				}
 			}
 		}
diff --git a/src/Tasque.Gtk/NoteWidget.cs b/src/Tasque.Gtk/NoteWidget.cs
index f454f3f..97830a5 100644
--- a/src/Tasque.Gtk/NoteWidget.cs
+++ b/src/Tasque.Gtk/NoteWidget.cs
@@ -264,7 +264,7 @@ namespace Tasque
 			try {
 				DeleteButtonClicked (this, EventArgs.Empty);
 			} catch (Exception e) {
-				Logger.Warn ("Exception in NoteWidget.DeleteButtonClicked handler: {0}", e.Message);
+				Trace.TraceWarning ("Exception in NoteWidget.DeleteButtonClicked handler: {0}", e.Message);
 			}
 		}
 		
@@ -285,7 +285,7 @@ namespace Tasque
 			try {
 				EditCanceled (this, EventArgs.Empty);
 			} catch (Exception e) {
-				Logger.Warn ("Exception in NoteWidget.DeleteButtonClicked handler: {0}", e.Message);
+				Trace.TraceWarning ("Exception in NoteWidget.DeleteButtonClicked handler: {0}", e.Message);
 			}
 		}
 		
@@ -304,7 +304,7 @@ namespace Tasque
 				try {
 					TextChanged (this, EventArgs.Empty);
 				} catch (Exception e) {
-					Logger.Debug ("Exception in NoteWidget.TextChanged handler: {0}", e.Message);
+					Debug.WriteLine ("Exception in NoteWidget.TextChanged handler: {0}", e.Message);
 				}
 			}
 		}
diff --git a/src/Tasque.Gtk/Preferences.cs b/src/Tasque.Gtk/Preferences.cs
index 874d1b3..4e2b23a 100644
--- a/src/Tasque.Gtk/Preferences.cs
+++ b/src/Tasque.Gtk/Preferences.cs
@@ -289,7 +289,7 @@ namespace Tasque
 		       Console.WriteLine(doc.OuterXml);
 */
 			} catch (Exception e) {
-				Logger.Debug("Exception thrown in Preferences {0}", e);
+				Debug.WriteLine("Exception thrown in Preferences {0}", e);
 				return;
 			}
 
@@ -309,7 +309,7 @@ namespace Tasque
 				try {
 					SettingChanged (this, settingKey);
 				} catch (Exception e) {
-					Logger.Warn ("Exception calling SettingChangedHandlers for setting '{0}': {1}",
+					Trace.TraceWarning ("Exception calling SettingChangedHandlers for setting '{0}': {1}",
 								 settingKey,
 								 e.Message);
 				}
diff --git a/src/Tasque.Gtk/PreferencesDialog.cs b/src/Tasque.Gtk/PreferencesDialog.cs
index 0b7651b..e6f31b3 100644
--- a/src/Tasque.Gtk/PreferencesDialog.cs
+++ b/src/Tasque.Gtk/PreferencesDialog.cs
@@ -92,7 +92,7 @@ namespace Tasque
 
 		private void Init()
 		{
-			Logger.Debug("Called Preferences Init");
+			Debug.WriteLine("Called Preferences Init");
 			this.Icon = Utilities.GetIcon ("tasque-16", 16);
 			// Update the window title
 			this.Title = string.Format (Catalog.GetString ("Tasque Preferences"));
@@ -374,7 +374,7 @@ namespace Tasque
 
 		private void LoadPreferences()
 		{
-			Logger.Debug("Loading preferences");
+			Debug.WriteLine("Loading preferences");
 			categoriesToHide =
 				Application.Preferences.GetStringList (Preferences.HideInAllCategory);
 			//if (categoriesToHide == null || categoriesToHide.Count == 0)
@@ -434,11 +434,11 @@ namespace Tasque
 				if (backendComboMap.ContainsKey (selectedBackend)) {
 					// Cleanup old backend
 					Backend oldBackend = backendComboMap [selectedBackend];
-					Logger.Info ("Cleaning up '{0}'...", oldBackend.Name);
+					Trace.TraceInformation ("Cleaning up '{0}'...", oldBackend.Name);
 					try {
 						oldBackend.Cleanup ();
 					} catch (Exception e) {
-						Logger.Warn ("Exception cleaning up '{0}': {2}",
+						Trace.TraceWarning ("Exception cleaning up '{0}': {2}",
 									 oldBackend.Name,
 									 e.Message);
 						
@@ -532,7 +532,7 @@ namespace Tasque
 		
 		void OnCategoryToggled (object sender, Gtk.ToggledArgs args)
 		{
-			Logger.Debug ("OnCategoryToggled");
+			Debug.WriteLine ("OnCategoryToggled");
 			Gtk.TreeIter iter;
 			Gtk.TreePath path = new Gtk.TreePath (args.Path);
 			if (!categoriesTree.Model.GetIter (out iter, path))
diff --git a/src/Tasque.Gtk/Properties/AssemblyInfo.cs b/src/Tasque.Gtk/Properties/AssemblyInfo.cs
index a52ab14..2554e8a 100644
--- a/src/Tasque.Gtk/Properties/AssemblyInfo.cs
+++ b/src/Tasque.Gtk/Properties/AssemblyInfo.cs
@@ -25,6 +25,6 @@
 // THE SOFTWARE.
 using System.Reflection;
 
-[assembly: AssemblyTitle("Tasque")]
-[assembly: AssemblyDescription("Simple Tasque Management")]
+[assembly: AssemblyTitle("Tasque.Gtk")]
+[assembly: AssemblyDescription("Gtk# UI for Tasque")]
 [assembly: AssemblyCopyright("MIT")]
diff --git a/src/Tasque.Gtk/RemoteControl.cs b/src/Tasque.Gtk/RemoteControl.cs
index a818102..97b2969 100644
--- a/src/Tasque.Gtk/RemoteControl.cs
+++ b/src/Tasque.Gtk/RemoteControl.cs
@@ -117,7 +117,7 @@ namespace Tasque
 				if (taskDueDate != DateTime.MinValue)
 					task.DueDate = taskDueDate;
 			} catch (Exception e) {
-				Logger.Error ("Exception calling Application.Backend.CreateTask from RemoteControl: {0}", e.Message);
+				Trace.TraceError ("Exception calling Application.Backend.CreateTask from RemoteControl: {0}", e.Message);
 				return string.Empty;
 			}
 			
diff --git a/src/Tasque.Gtk/TaskCalendar.cs b/src/Tasque.Gtk/TaskCalendar.cs
index a96f923..8c256d0 100644
--- a/src/Tasque.Gtk/TaskCalendar.cs
+++ b/src/Tasque.Gtk/TaskCalendar.cs
@@ -133,7 +133,7 @@ namespace Tasque
 
 		private void OnButtonPressed(object o, ButtonPressEventArgs args)
 		{
-			//Logger.Debug("OnButtonPressed");
+			//Debug.WriteLine("OnButtonPressed");
 			if (popup != null) {
 				HideCalendar(false);
 			}
@@ -160,7 +160,7 @@ namespace Tasque
 
 		private void OnCalendarKeyPressed(object o, KeyPressEventArgs args)
 		{
-			//Logger.Debug("OnCalendarKeyPressed");
+			//Debug.WriteLine("OnCalendarKeyPressed");
 			switch (args.Event.Key) {
 			case Gdk.Key.Escape:
 				HideCalendar(false);
diff --git a/src/Tasque.Gtk/TaskGroup.cs b/src/Tasque.Gtk/TaskGroup.cs
index 7432a89..b989fa3 100644
--- a/src/Tasque.Gtk/TaskGroup.cs
+++ b/src/Tasque.Gtk/TaskGroup.cs
@@ -308,9 +308,9 @@ namespace Tasque
 				pos++;
 			} while (model.IterNext (ref tempIter));
 
-//Logger.Debug ("pos: {0}", pos);
-//Logger.Debug ("height: {0}", height);			
-//Logger.Debug ("returning: {0}", pos * height + header.Requisition.Height + 10);
+//Debug.WriteLine ("pos: {0}", pos);
+//Debug.WriteLine ("height: {0}", height);			
+//Debug.WriteLine ("returning: {0}", pos * height + header.Requisition.Height + 10);
 			// + 10 is for the spacing added on when packing the header
 			return pos * height + header.Requisition.Height;
 		}
@@ -419,7 +419,7 @@ namespace Tasque
 		#region Event Handlers
 		void OnNumberOfTasksChanged (object sender, EventArgs args)
 		{
-			//Logger.Debug ("TaskGroup (\"{0}\").OnNumberOfTasksChanged ()", DisplayName);
+			//Debug.WriteLine ("TaskGroup (\"{0}\").OnNumberOfTasksChanged ()", DisplayName);
 			// Check to see whether this group should be hidden or shown.
 			if (treeView.GetNumberOfTasks () == 0
 				&& (!filteredTasks.ShowCompletedTasks || hideWhenEmpty))
diff --git a/src/Tasque.Gtk/TaskTreeView.cs b/src/Tasque.Gtk/TaskTreeView.cs
index eb74e46..fac72b7 100644
--- a/src/Tasque.Gtk/TaskTreeView.cs
+++ b/src/Tasque.Gtk/TaskTreeView.cs
@@ -524,15 +524,15 @@ namespace Tasque
 			// convert to milliseconds for more granularity
 			long timeout = timerSeconds * 1000;
 			
-			//Logger.Debug ("TaskTimerCellDataFunc ()\n\tNow.Ticks: {0}\n\tCompletionDate.Ticks: {1}",
+			//Debug.WriteLine ("TaskTimerCellDataFunc ()\n\tNow.Ticks: {0}\n\tCompletionDate.Ticks: {1}",
 			//				DateTime.Now.Ticks, task.CompletionDate.Ticks);
 			long elapsedTicks = DateTime.Now.Ticks - task.CompletionDate.Ticks;
-			//Logger.Debug ("\tElapsed Ticks: {0}", elapsedTicks);
+			//Debug.WriteLine ("\tElapsed Ticks: {0}", elapsedTicks);
 			long elapsedMillis = elapsedTicks / 10000;
-			//Logger.Debug ("\tElapsed Milliseconds: {0}", elapsedMillis);
+			//Debug.WriteLine ("\tElapsed Milliseconds: {0}", elapsedMillis);
 			
 			double percentComplete = (double)elapsedMillis / (double)timeout;
-			//Logger.Debug ("\tPercent Complete: {0}", percentComplete);
+			//Debug.WriteLine ("\tPercent Complete: {0}", percentComplete);
 			
 			Gdk.Pixbuf pixbuf = GetIconForPercentage (percentComplete * 100);
 			crp.Pixbuf = pixbuf;
@@ -549,10 +549,10 @@ namespace Tasque
 		
 		protected static int GetIconNumForPercentage (double timeoutPercent)
 		{
-			//Logger.Debug ("GetIconNumForPercentage: {0}", timeoutPercent);
+			//Debug.WriteLine ("GetIconNumForPercentage: {0}", timeoutPercent);
 			int numOfIcons = 12;
 			double percentIncrement = (double)100 / (double)numOfIcons;
-			//Logger.Debug ("\tpercentIncrement: {0}", percentIncrement);
+			//Debug.WriteLine ("\tpercentIncrement: {0}", percentIncrement);
 			
 			if (timeoutPercent < percentIncrement)
 				return 0;
@@ -589,12 +589,12 @@ namespace Tasque
 			Task task = model.GetValue (iter, 0) as Task;
 
 			if (task == null) {
-				Logger.Error ("FilterFunc: task at iter was null");
+				Trace.TraceError ("FilterFunc: task at iter was null");
 				return false;
 			}
 			
 			if (task.State == TaskState.Deleted) {
-				//Logger.Debug ("TaskTreeView.FilterFunc:\n\t{0}\n\t{1}\n\tReturning false", task.Name, task.State);  
+				//Debug.WriteLine ("TaskTreeView.FilterFunc:\n\t{0}\n\t{1}\n\tReturning false", task.Name, task.State);  
 				return false;
 			}
 			
@@ -608,7 +608,7 @@ namespace Tasque
 		#region EventHandlers
 		void OnTaskToggled (object sender, Gtk.ToggledArgs args)
 		{
-			Logger.Debug ("OnTaskToggled");
+			Debug.WriteLine ("OnTaskToggled");
 			Gtk.TreeIter iter;
 			Gtk.TreePath path = new Gtk.TreePath (args.Path);
 			if (!Model.GetIter (out iter, path))
@@ -638,7 +638,7 @@ namespace Tasque
 					// Read the inactivate timeout from a preference
 					int timeout =
 						Application.Preferences.GetInt (Preferences.InactivateTimeoutKey);
-					Logger.Debug ("Read timeout from prefs: {0}", timeout);
+					Debug.WriteLine ("Read timeout from prefs: {0}", timeout);
 					InactivateTimer timer =
 						new InactivateTimer (this, iter, task, (uint) timeout);
 					timer.StartTimer ();
@@ -717,7 +717,7 @@ namespace Tasque
 		void OnDateEdited (object sender, Gtk.EditedArgs args)
 		{
 			if (args.NewText == null) {
-				Logger.Debug ("New date text null, not setting date");
+				Debug.WriteLine ("New date text null, not setting date");
 				return;
 			}
 			
@@ -860,7 +860,7 @@ namespace Tasque
 
 			public static void CancelTimer(Task task)
 			{
-				Logger.Debug ("Timeout Canceled for task: " + task.Name);
+				Debug.WriteLine ("Timeout Canceled for task: " + task.Name);
 				InactivateTimer timer = null;
 				uint timerId = task.TimerID;
 				if(timerId != 0) {
diff --git a/src/Tasque.Gtk/TaskWindow.cs b/src/Tasque.Gtk/TaskWindow.cs
index 65ead96..a2e1419 100644
--- a/src/Tasque.Gtk/TaskWindow.cs
+++ b/src/Tasque.Gtk/TaskWindow.cs
@@ -489,7 +489,7 @@ namespace Tasque
 		public static void ShowStatus (string statusText, uint dwellTime)
 		{
 			if (taskWindow == null) {
-				Logger.Warn ("Cannot set status when taskWindow is null");
+				Trace.TraceWarning ("Cannot set status when taskWindow is null");
 				return;
 			}
 
@@ -588,39 +588,39 @@ namespace Tasque
 			
 			foreach (TaskGroup taskGroup in taskGroups) {
 				
-				//Logger.Debug("taskGroupHeights: {0}", taskGroupHeights);
+				//Debug.WriteLine("taskGroupHeights: {0}", taskGroupHeights);
 				TreePath start;
 				TreePath end;
 				if (taskGroup.TreeView.GetVisibleRange (out start, out end)) {
-					Logger.Debug ("TaskGroup '{0}' range: {1} - {2}",
+					Debug.WriteLine ("TaskGroup '{0}' range: {1} - {2}",
 						taskGroup.DisplayName,
 						start.ToString (),
 						end.ToString ());
 				} else {
-					Logger.Debug ("TaskGroup range not visible: {0}", taskGroup.DisplayName);
+					Debug.WriteLine ("TaskGroup range not visible: {0}", taskGroup.DisplayName);
 				}
 				
 				if (taskGroup.ContainsTask (task, out iter)) {
-					Logger.Debug ("Found new task group: {0}", taskGroup.DisplayName);
+					Debug.WriteLine ("Found new task group: {0}", taskGroup.DisplayName);
 					
 					// Get the header height
 					int headerHeight = taskGroup.HeaderHeight;
 				
 					// Get the total number items in the TaskGroup
 					int nChildren = taskGroup.GetNChildren(iter);
-					//Logger.Debug("n children: {0}", nChildren);
+					//Debug.WriteLine("n children: {0}", nChildren);
 
 					// Calculate size of each item
 					double itemSize = (double)(taskGroup.Requisition.Height-headerHeight) / nChildren;
-					//Logger.Debug("item size: {0}", itemSize);
+					//Debug.WriteLine("item size: {0}", itemSize);
 				
 					// Get the index of the new item within the TaskGroup
 					int newTaskIndex = taskGroup.GetIterIndex (iter);
-					//Logger.Debug("new task index: {0}", newTaskIndex);
+					//Debug.WriteLine("new task index: {0}", newTaskIndex);
 						
 					// Calculate the scrolling distance
 					double scrollDistance = (itemSize*newTaskIndex)+taskGroupHeights;
-					//Logger.Debug("Scroll distance = ({0}*{1})+{2}+{3}: {4}", itemSize, newTaskIndex, taskGroupHeights, headerHeight, scrollDistance);
+					//Debug.WriteLine("Scroll distance = ({0}*{1})+{2}+{3}: {4}", itemSize, newTaskIndex, taskGroupHeights, headerHeight, scrollDistance);
 	
 					//scroll to the new task
 					scrolledWindow.Vadjustment.Value = scrollDistance;
@@ -683,7 +683,7 @@ namespace Tasque
 			Gtk.TreeIter iter;
 			foreach (TaskGroup taskGroup in taskGroups) {
 				if (taskGroup.ContainsTask (task, out iter)) {
-					Logger.Debug ("Found new task group: {0}", taskGroup.DisplayName);
+					Debug.WriteLine ("Found new task group: {0}", taskGroup.DisplayName);
 					
 					// Get the header height
 					taskGroup.EnterEditMode (task, iter);
@@ -766,7 +766,7 @@ namespace Tasque
 			Task task = backend.CreateTask (taskText, category);
 			
 			if (task == null) {
-				Logger.Debug ("Error creating a new task!");
+				Debug.WriteLine ("Error creating a new task!");
 				// Show error status
 				status = Catalog.GetString ("Error creating a new task");
 				TaskWindow.ShowStatus (status);
@@ -835,7 +835,7 @@ namespace Tasque
 			Application.Preferences.SetInt("MainWindowWidth", width);
 			Application.Preferences.SetInt("MainWindowHeight", height);
 
-			Logger.Debug("WindowDeleted was called");
+			Debug.WriteLine("WindowDeleted was called");
 			taskWindow = null;
 		}
 
@@ -1102,7 +1102,7 @@ namespace Tasque
 					popupMenu.ShowAll();
 					popupMenu.Popup ();
 				
-					// Logger.Debug ("Right clicked on task: " + task.Name);
+					// Debug.WriteLine ("Right clicked on task: " + task.Name);
 					break;
 			}
 		}
@@ -1140,16 +1140,16 @@ namespace Tasque
 		{
 			NoteDialog dialog = sender as NoteDialog;
 			if (dialog == null) {
-				Logger.Warn ("OnNoteDialogHidden (), sender is not NoteDialog, it's: {0}", sender.GetType ().ToString ());
+				Trace.TraceWarning ("OnNoteDialogHidden (), sender is not NoteDialog, it's: {0}", sender.GetType ().ToString ());
 				return;
 			}
 			
 			if (!noteDialogs.ContainsKey (dialog.Task)) {
-				Logger.Warn ("Closed NoteDialog not found in noteDialogs");
+				Trace.TraceWarning ("Closed NoteDialog not found in noteDialogs");
 				return;
 			}
 			
-			Logger.Debug ("Removing NoteDialog from noteDialogs");
+			Debug.WriteLine ("Removing NoteDialog from noteDialogs");
 			noteDialogs.Remove (dialog.Task);
 			
 			dialog.Destroy ();
@@ -1169,7 +1169,7 @@ namespace Tasque
 		
 		private void OnBackendSyncFinished ()
 		{
-			Logger.Debug("Backend sync finished");
+			Debug.WriteLine("Backend sync finished");
 			if (Application.Backend.Configured) {
 				string now = DateTime.Now.ToString ();
 				// Translators: This status shows the date and time when the task list was last refreshed
diff --git a/src/Tasque.Gtk/Tasque.Gtk.csproj b/src/Tasque.Gtk/Tasque.Gtk.csproj
index 63dbc23..20a28b1 100644
--- a/src/Tasque.Gtk/Tasque.Gtk.csproj
+++ b/src/Tasque.Gtk/Tasque.Gtk.csproj
@@ -6,11 +6,8 @@
     <ProjectGuid>{B19B9840-669D-4984-9772-E1F55193A67F}</ProjectGuid>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <OutputType>WinExe</OutputType>
-    <NoStandardLibraries>false</NoStandardLibraries>
-    <AssemblyName>Tasque</AssemblyName>
-    <FileAlignment>512</FileAlignment>
-    <NoWin32Manifest>True</NoWin32Manifest>
+    <OutputType>Library</OutputType>
+    <AssemblyName>Tasque.Gtk</AssemblyName>
     <RootNamespace>Tasque</RootNamespace>
     <ReleaseVersion>0.1.10</ReleaseVersion>
   </PropertyGroup>
@@ -146,6 +143,7 @@
     <Compile Include="TaskTreeView.cs" />
     <Compile Include="TaskWindow.cs" />
     <Compile Include="Utilities.cs" />
+    <Compile Include="WindowsSingleInstanceSolution.cs" />
   </ItemGroup>
   <ItemGroup Condition=" '$(Configuration)' == 'GnomeDebug' or '$(Configuration)' == 'GnomeRelease' ">
     <Compile Include="GnomeApplication.cs" />
diff --git a/src/Tasque.Gtk/Utilities.cs b/src/Tasque.Gtk/Utilities.cs
index 85030e6..f4bafa6 100644
--- a/src/Tasque.Gtk/Utilities.cs
+++ b/src/Tasque.Gtk/Utilities.cs
@@ -59,7 +59,7 @@ namespace Tasque
 				return ret.ScaleSimple (size, size, Gdk.InterpType.Bilinear);
 			} catch (ArgumentException) { }
 
-			Logger.Debug ("Unable to load icon '{0}'.", iconName);
+			Debug.WriteLine ("Unable to load icon '{0}'.", iconName);
 			return null;
 		}
 		
diff --git a/src/Tasque.Gtk/WindowsSingleInstanceSolution.cs b/src/Tasque.Gtk/WindowsSingleInstanceSolution.cs
new file mode 100644
index 0000000..9a47cc0
--- /dev/null
+++ b/src/Tasque.Gtk/WindowsSingleInstanceSolution.cs
@@ -0,0 +1,89 @@
+// 
+// WindowsSingleInstanceSolution.cs
+//  
+// Author:
+//       Antonius Riha <antoniusriha gmail com>
+// 
+// Copyright (c) 2012 Antonius Riha
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Threading;
+
+namespace ConsoleApplication9
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            CheckIfRunning();
+
+            Console.WriteLine("Press ENTER to begin exiting");
+            Console.ReadLine();
+            exiting = true;
+            Console.WriteLine("Exiting has begun");
+
+            waitHandle.Set();
+            Console.WriteLine("Porter thread has been released.");
+            waitHandle.Dispose();
+            waitHandle = null;
+
+            Console.Write("Press any key to exit...");
+            Console.ReadKey();
+        }
+
+        static void CheckIfRunning()
+        {
+            try
+            {
+                waitHandle = EventWaitHandle.OpenExisting(waitHandleName);
+                waitHandle.Set();
+                Console.WriteLine("Running instance found and notified.");
+                Console.WriteLine("Exiting");
+                Environment.Exit(0);
+            }
+            catch (WaitHandleCannotBeOpenedException)
+            {
+                waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, waitHandleName);
+                Console.WriteLine("Event wait handle created");
+
+                var portier = new Thread(new ThreadStart(WaitForAnotherInstanceThread));
+                portier.Start();
+            }
+        }
+
+        static void WaitForAnotherInstanceThread()
+        {
+            while (!exiting)
+            {
+                waitHandle.WaitOne();
+                if (!exiting)
+                {
+                    Console.WriteLine("Another app instance has just knocked on the door.");
+                    Console.WriteLine("Show window!");
+                    Thread.Sleep(2000);
+                }
+            }
+        }
+
+        static bool exiting;
+        static EventWaitHandle waitHandle;
+        static readonly string waitHandleName = "Tasque." + Environment.UserName;
+    }
+}
diff --git a/src/Tasque.MonoMac/Properties/AssemblyInfo.cs b/src/Tasque.MonoMac/Properties/AssemblyInfo.cs
index a52ab14..4bb5c38 100644
--- a/src/Tasque.MonoMac/Properties/AssemblyInfo.cs
+++ b/src/Tasque.MonoMac/Properties/AssemblyInfo.cs
@@ -25,6 +25,6 @@
 // THE SOFTWARE.
 using System.Reflection;
 
-[assembly: AssemblyTitle("Tasque")]
-[assembly: AssemblyDescription("Simple Tasque Management")]
+[assembly: AssemblyTitle("Tasque.MonoMac")]
+[assembly: AssemblyDescription("MonoMac UI for Tasque")]
 [assembly: AssemblyCopyright("MIT")]
diff --git a/src/Tasque.MonoMac/Tasque.MonoMac.csproj b/src/Tasque.MonoMac/Tasque.MonoMac.csproj
index 65bc5fc..0735043 100644
--- a/src/Tasque.MonoMac/Tasque.MonoMac.csproj
+++ b/src/Tasque.MonoMac/Tasque.MonoMac.csproj
@@ -6,8 +6,7 @@
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{1F6FC2AE-0BB5-4536-939F-1D9FE893F7DD}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <NoWin32Manifest>True</NoWin32Manifest>
+    <OutputType>Library</OutputType>
     <RootNamespace>Tasque</RootNamespace>
     <AssemblyName>Tasque</AssemblyName>
     <ReleaseVersion>0.1.10</ReleaseVersion>
diff --git a/src/libtasque/Task.cs b/src/libtasque/Task.cs
index 130c56b..99bd4fb 100644
--- a/src/libtasque/Task.cs
+++ b/src/libtasque/Task.cs
@@ -26,6 +26,7 @@
 using System;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
+using System.Diagnostics;
 
 namespace Tasque
 {
@@ -60,7 +61,7 @@ namespace Tasque
 			get { return dueDate; }
 			set {
 				if (value != dueDate) {
-					Logger.Debug ("Setting new task due date");
+					Debug.WriteLine ("Setting new task due date");
 					dueDate = value;
 					OnDueDateChanged ();
 					OnPropertyChanged ("DueDate");
@@ -73,7 +74,7 @@ namespace Tasque
 			get { return completionDate; }
 			protected set {
 				if (value != completionDate) {
-					Logger.Debug ("Setting new task completion date");
+					Debug.WriteLine ("Setting new task completion date");
 					completionDate = value;
 					OnCompletionDateChanged ();
 					OnPropertyChanged ("CompletionDate");
@@ -96,7 +97,7 @@ namespace Tasque
 			get { return priority; }
 			set {
 				if (value != priority) {
-					Logger.Debug ("Setting new task priority");
+					Debug.WriteLine ("Setting new task priority");
 					priority = value;
 					OnPriorityChanged ();
 					OnPropertyChanged ("Priority");
diff --git a/src/libtasque/libtasque.csproj b/src/libtasque/libtasque.csproj
index ccc5297..c10a481 100644
--- a/src/libtasque/libtasque.csproj
+++ b/src/libtasque/libtasque.csproj
@@ -142,7 +142,6 @@
     <Compile Include="TaskCompletionDateComparer.cs" />
     <Compile Include="SortedNotifyCollection.cs" />
     <Compile Include="ReadOnlySortedNotifyCollection.cs" />
-    <Compile Include="Logger.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="System" />
diff --git a/src/libtasqueui/Legacy/Commands/ComponentCommands.cs b/src/libtasqueui/Legacy/Commands/ComponentCommands.cs
index 7fa3b64..f8998e2 100644
--- a/src/libtasqueui/Legacy/Commands/ComponentCommands.cs
+++ b/src/libtasqueui/Legacy/Commands/ComponentCommands.cs
@@ -59,4 +59,12 @@ namespace Tasque.UIModel.Legacy
 		Task task;
 		MainWindowContextMenuModel contextMenu;
 	}
+	
+	class ShowMainWindowCommand : CommandBase
+	{
+		public override void Execute ()
+		{
+			throw new System.NotImplementedException ();
+		}
+	}
 }
diff --git a/src/libtasqueui/NativeApplication.cs b/src/libtasqueui/Legacy/IRemoteInstance.cs
similarity index 63%
copy from src/libtasqueui/NativeApplication.cs
copy to src/libtasqueui/Legacy/IRemoteInstance.cs
index 47136e8..1e76295 100644
--- a/src/libtasqueui/NativeApplication.cs
+++ b/src/libtasqueui/Legacy/IRemoteInstance.cs
@@ -1,5 +1,5 @@
 // 
-// NativeApplication.cs
+// IRemoteInstance.cs
 //  
 // Author:
 //       Antonius Riha <antoniusriha gmail com>
@@ -23,41 +23,11 @@
 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
-using System;
-using System.Diagnostics;
 
-namespace Tasque
+namespace Tasque.UIModel.Legacy
 {
-	public abstract class NativeApplication
+	public interface IRemoteInstance
 	{
-		public abstract string ConfDir { get; }
-
-		public void Exit (int exitcode)
-		{
-			OnExit (exitcode);
-
-			if (Exiting != null)
-				Exiting (this, EventArgs.Empty);
-
-			Environment.Exit (exitcode);
-		}
-
-		public abstract void Initialize (string[] args);
-
-		public virtual void InitializeIdle () {}
-
-		protected virtual void OnExit (int exitCode) {}
-
-		public virtual void OpenUrlInBrowser (string url)
-		{
-			Process.Start (url);
-		}
-
-		public abstract void QuitMainLoop ();
-
-		public abstract void StartMainLoop ();
-
-		public event EventHandler Exiting;
+		UICommand ShowMainWindow { get; }
 	}
 }
-
diff --git a/src/libtasqueui/Legacy/NativeApplication.cs b/src/libtasqueui/Legacy/NativeApplication.cs
new file mode 100644
index 0000000..84f4ab0
--- /dev/null
+++ b/src/libtasqueui/Legacy/NativeApplication.cs
@@ -0,0 +1,94 @@
+// 
+// NativeApplication.cs
+//  
+// Author:
+//       Antonius Riha <antoniusriha gmail com>
+// 
+// Copyright (c) 2012 Antonius Riha
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Diagnostics;
+using System.Collections.ObjectModel;
+
+namespace Tasque.UIModel.Legacy
+{
+	public abstract class NativeApplication : IDisposable
+	{
+		public Backend CurrentBackend { get; }
+		
+		public ReadOnlyCollection<Backend> AvailableBackends { get; }
+		
+		public MainWindowModel MainWindowModel { get; }
+		
+		public abstract string ConfDir { get; }
+
+		public void Exit (int exitcode)
+		{
+			OnExit (exitcode);
+
+			if (Exiting != null)
+				Exiting (this, EventArgs.Empty);
+
+			Environment.Exit (exitcode);
+		}
+
+		public virtual void Initialize (string[] args)
+		{
+			var runningInstance = GetRemoteInstance ();
+			if (runningInstance != null && runningInstance.ShowMainWindow.CanExecute)
+				runningInstance.ShowMainWindow.Execute ();
+		}
+
+		public virtual void InitializeIdle () {}
+
+		protected virtual void OnExit (int exitCode) {}
+
+		public virtual void OpenUrlInBrowser (string url)
+		{
+			Process.Start (url);
+		}
+
+		public abstract void QuitMainLoop ();
+
+		public abstract void StartMainLoop ();
+
+		public event EventHandler Exiting;
+
+		//DOCS: Tasque is a single instance app. If Tasque is already started in the current user's
+		// domain, don't start it again, but retreive the running instance and invoke its Show command.
+		// returns null if no instance found
+		protected abstract IRemoteInstance GetRemoteInstance ();
+
+		#region IDisposable implementation
+		public void Dispose ()
+		{
+			Dispose (true);
+			GC.SuppressFinalize (this);
+		}
+		
+		protected virtual void Dispose (bool disposing) {}
+		
+		~NativeApplication ()
+		{
+			Dispose (false);
+		}
+		#endregion
+	}
+}
diff --git a/src/libtasqueui/NativeApplication.cs b/src/libtasqueui/UICommand.cs
similarity index 64%
copy from src/libtasqueui/NativeApplication.cs
copy to src/libtasqueui/UICommand.cs
index 47136e8..222609f 100644
--- a/src/libtasqueui/NativeApplication.cs
+++ b/src/libtasqueui/UICommand.cs
@@ -1,5 +1,5 @@
 // 
-// NativeApplication.cs
+// UICommand.cs
 //  
 // Author:
 //       Antonius Riha <antoniusriha gmail com>
@@ -23,41 +23,13 @@
 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
-using System;
-using System.Diagnostics;
 
-namespace Tasque
+namespace Tasque.UIModel
 {
-	public abstract class NativeApplication
+	public abstract class UICommand : CommandBase
 	{
-		public abstract string ConfDir { get; }
-
-		public void Exit (int exitcode)
+		public UICommand ()
 		{
-			OnExit (exitcode);
-
-			if (Exiting != null)
-				Exiting (this, EventArgs.Empty);
-
-			Environment.Exit (exitcode);
 		}
-
-		public abstract void Initialize (string[] args);
-
-		public virtual void InitializeIdle () {}
-
-		protected virtual void OnExit (int exitCode) {}
-
-		public virtual void OpenUrlInBrowser (string url)
-		{
-			Process.Start (url);
-		}
-
-		public abstract void QuitMainLoop ();
-
-		public abstract void StartMainLoop ();
-
-		public event EventHandler Exiting;
 	}
 }
-
diff --git a/src/libtasqueui/libtasqueui.csproj b/src/libtasqueui/libtasqueui.csproj
index 560c287..1f1606e 100644
--- a/src/libtasqueui/libtasqueui.csproj
+++ b/src/libtasqueui/libtasqueui.csproj
@@ -116,7 +116,6 @@
     <Compile Include="..\..\build\GlobalDefines.cs">
       <Link>Properties\GlobalDefines.cs</Link>
     </Compile>
-    <Compile Include="NativeApplication.cs" />
     <Compile Include="Legacy\MainWindowModel.cs" />
     <Compile Include="Legacy\PreferencesDialogModel.cs" />
     <Compile Include="Legacy\AboutDialogModel.cs" />
@@ -138,6 +137,9 @@
     <Compile Include="Legacy\MainWindowContextMenuModel.cs" />
     <Compile Include="Legacy\Commands\ComponentCommands.cs" />
     <Compile Include="Legacy\Commands\TaskCommands.cs" />
+    <Compile Include="Legacy\NativeApplication.cs" />
+    <Compile Include="Legacy\IRemoteInstance.cs" />
+    <Compile Include="UICommand.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/src/libtasqueui/NativeApplication.cs b/src/tasque/Program.cs
similarity index 62%
copy from src/libtasqueui/NativeApplication.cs
copy to src/tasque/Program.cs
index 47136e8..a80827b 100644
--- a/src/libtasqueui/NativeApplication.cs
+++ b/src/tasque/Program.cs
@@ -1,5 +1,5 @@
 // 
-// NativeApplication.cs
+// Program.cs
 //  
 // Author:
 //       Antonius Riha <antoniusriha gmail com>
@@ -25,39 +25,47 @@
 // THE SOFTWARE.
 using System;
 using System.Diagnostics;
+using Tasque.UIModel.Legacy;
 
 namespace Tasque
 {
-	public abstract class NativeApplication
+	class Program
 	{
-		public abstract string ConfDir { get; }
-
-		public void Exit (int exitcode)
+		static NativeApplication CreateApplication ()
 		{
-			OnExit (exitcode);
-
-			if (Exiting != null)
-				Exiting (this, EventArgs.Empty);
-
-			Environment.Exit (exitcode);
+			NativeApplication app;
+#if OSX
+			app = new OSXApplication ();
+#else
+			app = new GtkApplication ();
+#endif
+			return app;
 		}
-
-		public abstract void Initialize (string[] args);
-
-		public virtual void InitializeIdle () {}
-
-		protected virtual void OnExit (int exitCode) {}
-
-		public virtual void OpenUrlInBrowser (string url)
+		
+		static void Main (string[] args)
 		{
-			Process.Start (url);
+			try {
+				lock (lockObject) {
+					if (application != null)
+						return;
+					
+					application = CreateApplication ();
+				}
+				
+				application.Initialize (args);
+				application.StartMainLoop ();
+			} catch (Exception e) {
+				Debug.WriteLine ("Exception is: {0}", e);
+				application.Exit (-1);
+			} finally {
+				lock (lockObject) {
+					if (application != null)
+						application.Dispose ();
+				}
+			}
 		}
-
-		public abstract void QuitMainLoop ();
-
-		public abstract void StartMainLoop ();
-
-		public event EventHandler Exiting;
+		
+		static NativeApplication application;
+		static object lockObject = new object ();
 	}
 }
-
diff --git a/src/libtasqueui/NativeApplication.cs b/src/tasque/Properties/AssemblyInfo.cs
similarity index 63%
rename from src/libtasqueui/NativeApplication.cs
rename to src/tasque/Properties/AssemblyInfo.cs
index 47136e8..a52ab14 100644
--- a/src/libtasqueui/NativeApplication.cs
+++ b/src/tasque/Properties/AssemblyInfo.cs
@@ -1,5 +1,5 @@
 // 
-// NativeApplication.cs
+// AssemblyInfo.cs
 //  
 // Author:
 //       Antonius Riha <antoniusriha gmail com>
@@ -23,41 +23,8 @@
 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
-using System;
-using System.Diagnostics;
-
-namespace Tasque
-{
-	public abstract class NativeApplication
-	{
-		public abstract string ConfDir { get; }
-
-		public void Exit (int exitcode)
-		{
-			OnExit (exitcode);
-
-			if (Exiting != null)
-				Exiting (this, EventArgs.Empty);
-
-			Environment.Exit (exitcode);
-		}
-
-		public abstract void Initialize (string[] args);
-
-		public virtual void InitializeIdle () {}
-
-		protected virtual void OnExit (int exitCode) {}
-
-		public virtual void OpenUrlInBrowser (string url)
-		{
-			Process.Start (url);
-		}
-
-		public abstract void QuitMainLoop ();
-
-		public abstract void StartMainLoop ();
-
-		public event EventHandler Exiting;
-	}
-}
+using System.Reflection;
 
+[assembly: AssemblyTitle("Tasque")]
+[assembly: AssemblyDescription("Simple Tasque Management")]
+[assembly: AssemblyCopyright("MIT")]
diff --git a/src/tasque/tasque.csproj b/src/tasque/tasque.csproj
new file mode 100644
index 0000000..5936cce
--- /dev/null
+++ b/src/tasque/tasque.csproj
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">GnomeDebug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A70BD496-A280-4EF5-BBE8-254E0CA89C62}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>Tasque</RootNamespace>
+    <AssemblyName>tasque</AssemblyName>
+    <ReleaseVersion>0.1.10</ReleaseVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GnomeDebug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GnomeRelease|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\LinuxRelease</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="BeforeBuild" command="./autogen.sh --prefix=${SolutionDir}/build/bin/" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Build" command="make" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Clean" command="make clean" workingdir="${SolutionDir}" externalConsole="true" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GtkLinuxDebug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;GTKLINUX</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GtkLinuxRelease|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\LinuxRelease</OutputPath>
+    <DefineConstants>TRACE;GTKLINUX</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="BeforeBuild" command="./autogen.sh --prefix=${SolutionDir}/build/bin/" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Build" command="make" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Clean" command="make clean" workingdir="${SolutionDir}" externalConsole="true" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GtkWinDebug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;WIN32</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'GtkWinRelease|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\LinuxRelease</OutputPath>
+    <DefineConstants>TRACE;WIN32</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="BeforeBuild" command="./autogen.sh --prefix=${SolutionDir}/build/bin/" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Build" command="make" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Clean" command="make clean" workingdir="${SolutionDir}" externalConsole="true" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'MonoMacDebug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;OSX</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'MonoMacRelease|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\LinuxRelease</OutputPath>
+    <DefineConstants>TRACE;OSX</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="BeforeBuild" command="./autogen.sh --prefix=${SolutionDir}/build/bin/" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Build" command="make" workingdir="${SolutionDir}" externalConsole="true" />
+        <Command type="Clean" command="make clean" workingdir="${SolutionDir}" externalConsole="true" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="..\..\build\CommonAssemblyInfo.cs">
+      <Link>Properties\CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\build\GlobalDefines.cs">
+      <Link>Properties\GlobalDefines.cs</Link>
+    </Compile>
+    <Compile Include="Program.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Tasque.MonoMac\Tasque.MonoMac.csproj">
+      <Project>{1F6FC2AE-0BB5-4536-939F-1D9FE893F7DD}</Project>
+      <Name>Tasque.MonoMac</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Tasque.Gtk\Tasque.Gtk.csproj">
+      <Project>{B19B9840-669D-4984-9772-E1F55193A67F}</Project>
+      <Name>Tasque.Gtk</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\libtasqueui\libtasqueui.csproj">
+      <Project>{DB8F01D5-0161-48E0-B68A-14AEFD22328F}</Project>
+      <Name>libtasqueui</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
diff --git a/tasque.sln b/tasque.sln
index b7bf9c1..a2ea171 100644
--- a/tasque.sln
+++ b/tasque.sln
@@ -39,6 +39,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeModelListAdapter", "src
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RtmNet", "src\RtmNet\RtmNet.csproj", "{0AA1B96E-03DE-4D26-B4FD-507E988FD9B7}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tasque", "src\tasque\tasque.csproj", "{A70BD496-A280-4EF5-BBE8-254E0CA89C62}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		GnomeDebug|Any CPU = GnomeDebug|Any CPU
@@ -233,6 +235,22 @@ Global
 		{A5AAD70F-F4E8-4CAE-A000-01C2D0A10B92}.MonoMacDebug|Any CPU.Build.0 = MonoMacDebug|Any CPU
 		{A5AAD70F-F4E8-4CAE-A000-01C2D0A10B92}.MonoMacRelease|Any CPU.ActiveCfg = MonoMacRelease|Any CPU
 		{A5AAD70F-F4E8-4CAE-A000-01C2D0A10B92}.MonoMacRelease|Any CPU.Build.0 = MonoMacRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GnomeDebug|Any CPU.ActiveCfg = GnomeDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GnomeDebug|Any CPU.Build.0 = GnomeDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GnomeRelease|Any CPU.ActiveCfg = GnomeRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GnomeRelease|Any CPU.Build.0 = GnomeRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkLinuxDebug|Any CPU.ActiveCfg = GtkLinuxDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkLinuxDebug|Any CPU.Build.0 = GtkLinuxDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkLinuxRelease|Any CPU.ActiveCfg = GtkLinuxRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkLinuxRelease|Any CPU.Build.0 = GtkLinuxRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkWinDebug|Any CPU.ActiveCfg = GtkWinDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkWinDebug|Any CPU.Build.0 = GtkWinDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkWinRelease|Any CPU.ActiveCfg = GtkWinRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.GtkWinRelease|Any CPU.Build.0 = GtkWinRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.MonoMacDebug|Any CPU.ActiveCfg = MonoMacDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.MonoMacDebug|Any CPU.Build.0 = MonoMacDebug|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.MonoMacRelease|Any CPU.ActiveCfg = MonoMacRelease|Any CPU
+		{A70BD496-A280-4EF5-BBE8-254E0CA89C62}.MonoMacRelease|Any CPU.Build.0 = MonoMacRelease|Any CPU
 		{A8D75EEC-63FE-4A18-8ACF-120870056E4E}.GnomeDebug|Any CPU.ActiveCfg = GnomeDebug|Any CPU
 		{A8D75EEC-63FE-4A18-8ACF-120870056E4E}.GnomeDebug|Any CPU.Build.0 = GnomeDebug|Any CPU
 		{A8D75EEC-63FE-4A18-8ACF-120870056E4E}.GnomeRelease|Any CPU.ActiveCfg = GnomeRelease|Any CPU
@@ -309,7 +327,7 @@ Global
 		{95B669DC-0F9F-4C26-B31E-34CFA54112E8} = {575AA970-031A-4E4A-8409-75D749D3C23E}
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
-		StartupItem = src\Tasque.Gtk\Tasque.Gtk.csproj
+		StartupItem = src\tasque\tasque.csproj
 		Policies = $0
 		$0.StandardHeader = $1
 		$1.Text = @\n${FileName}\n \nAuthor:\n      ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR O
 THER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]