[longomatch] Decouple UI completetly from the backend



commit 2c3562bc47cc2776f1efc2c47f5ccc98073c90ce
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Sun Aug 18 21:24:58 2013 +0200

    Decouple UI completetly from the backend

 LongoMatch.Addins/AddinsManager.cs                 |    4 +-
 LongoMatch.Core/Common/Enums.cs                    |    7 +
 LongoMatch.Core/Handlers/Handlers.cs               |   12 +-
 .../GUI/{IMainWindow.cs => IAnalysisWindow.cs}     |   38 +-
 LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs      |   11 +-
 LongoMatch.Core/Interfaces/GUI/IMainController.cs  |   50 ++
 .../Interfaces/GUI/IProjectOptionsController.cs    |   35 +
 LongoMatch.Core/LongoMatch.Core.mdp                |    6 +-
 LongoMatch.GUI/Gui/Component/AnalysisComponent.cs  |  664 ++++++++++++++++
 LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs   |    1 +
 .../Gui/Component/SubcategoiesTagsEditor.cs        |  131 ++++
 LongoMatch.GUI/Gui/GUIToolkit.cs                   |   27 +-
 LongoMatch.GUI/Gui/MainWindow.cs                   |  791 +++-----------------
 LongoMatch.GUI/LongoMatch.GUI.mdp                  |    4 +-
 .../LongoMatch.Gui.Component.AnalysisComponent.cs  |  176 +++++
 .../LongoMatch.Gui.Component.Stats.Plotter.cs      |    1 -
 ...goMatch.Gui.Component.SubcategoiesTagsEditor.cs |  197 +++++
 .../gtk-gui/LongoMatch.Gui.MainWindow.cs           |  185 +-----
 LongoMatch.GUI/gtk-gui/gui.stetic                  |  385 +++++-----
 LongoMatch.GUI/gtk-gui/objects.xml                 |   32 +
 LongoMatch.Services/LongoMatch.Services.mdp        |    1 +
 LongoMatch.Services/Services/Core.cs               |   61 +--
 LongoMatch.Services/Services/DataBaseManager.cs    |    2 +-
 LongoMatch.Services/Services/EventsManager.cs      |   94 ++-
 LongoMatch.Services/Services/GameUnitsManager.cs   |   48 +-
 LongoMatch.Services/Services/HotKeysManager.cs     |   37 +-
 LongoMatch.Services/Services/PlaylistManager.cs    |   53 +-
 .../Services/ProjectOptionsManager.cs              |   91 +++
 LongoMatch.Services/Services/ProjectsManager.cs    |  230 ++----
 .../Services/RenderingJobsManager.cs               |    4 +-
 LongoMatch.Services/Services/ToolsManager.cs       |  172 +++++
 .../Services/VideoDrawingsManager.cs               |   26 +-
 LongoMatch/Main.cs                                 |    4 +-
 33 files changed, 2168 insertions(+), 1412 deletions(-)
---
diff --git a/LongoMatch.Addins/AddinsManager.cs b/LongoMatch.Addins/AddinsManager.cs
index 1be19be..8829b39 100644
--- a/LongoMatch.Addins/AddinsManager.cs
+++ b/LongoMatch.Addins/AddinsManager.cs
@@ -48,7 +48,7 @@ namespace LongoMatch.Addins
                        }
                }
                
-               public void LoadExportProjectAddins(IMainWindow mainWindow) {
+               public void LoadExportProjectAddins(IMainController mainWindow) {
                        foreach (IExportProject exportProject in 
AddinManager.GetExtensionObjects<IExportProject> ()) {
                                try {
                                        mainWindow.AddExportEntry(exportProject.GetMenuEntryName(), 
exportProject.GetMenuEntryShortName(),
@@ -60,7 +60,7 @@ namespace LongoMatch.Addins
                        }
                }
                
-               public void LoadImportProjectAddins(IMainWindow mainWindow) {
+               public void LoadImportProjectAddins(IMainController mainWindow) {
                        foreach (IImportProject importProject in 
AddinManager.GetExtensionObjects<IImportProject> ()) {
                                try{
                                        mainWindow.AddImportEntry(importProject.GetMenuEntryName(), 
importProject.GetMenuEntryShortName(),
diff --git a/LongoMatch.Core/Common/Enums.cs b/LongoMatch.Core/Common/Enums.cs
index 3e0f291..dc57dc4 100644
--- a/LongoMatch.Core/Common/Enums.cs
+++ b/LongoMatch.Core/Common/Enums.cs
@@ -131,4 +131,11 @@ namespace LongoMatch.Common
                VideoEdition,
                VideoConversion
        }
+       
+       public enum VideoAnalysisMode {
+               PredefinedTagging,
+               ManualTagging,
+               Timeline,
+               GameUnits,
+       }
 }
diff --git a/LongoMatch.Core/Handlers/Handlers.cs b/LongoMatch.Core/Handlers/Handlers.cs
index e2c70bb..bc79da7 100644
--- a/LongoMatch.Core/Handlers/Handlers.cs
+++ b/LongoMatch.Core/Handlers/Handlers.cs
@@ -54,13 +54,15 @@ namespace LongoMatch.Handlers
        
        /* Project Events */
        public delegate void SaveProjectHandler(Project project, ProjectType projectType);
-       public delegate void OpenedProjectChangedHandler(Project project, ProjectType projectType, 
PlaysFilter filter);
+       public delegate void OpenedProjectChangedHandler(Project project, ProjectType projectType, 
PlaysFilter filter,
+                                                        IAnalysisWindow analysisWindow, 
IProjectOptionsController projectOptions);
        public delegate void OpenProjectHandler();
-       public delegate void CloseOpenendProjectHandler(bool save);
+       public delegate void CloseOpenendProjectHandler();
        public delegate void NewProjectHandler();
        public delegate void ImportProjectHandler(string name, string filterName, string filter,
                                                  Func <string, Project> importProjectFunc, bool 
requiresNewFile);
        public delegate void ExportProjectHandler();
+       public delegate void QuitApplicationHandler ();
        
        /* GUI */
        public delegate void ManageJobsHandler();
@@ -147,4 +149,10 @@ namespace LongoMatch.Handlers
        
        /* Show project stats */
        public delegate void ShowProjectStats(Project project);
+       
+       public delegate void ShowFullScreenHandler (bool fullscreen);
+       public delegate void PlaylistVisibiltyHandler (bool visible);
+       public delegate void AnalysisWidgetsVisibilityHandler (bool visible);
+       public delegate void AnalysisModeChangedHandler (VideoAnalysisMode mode);
+       public delegate void TagSubcategoriesChangedHandler (bool tagsubcategories);
 }
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
similarity index 71%
rename from LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
rename to LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
index f247fff..1674e9a 100644
--- a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
@@ -25,7 +25,7 @@ using LongoMatch.Store.Templates;
 
 namespace LongoMatch.Interfaces.GUI
 {
-       public interface IMainWindow
+       public interface IAnalysisWindow
        {       
                /* Tags */
                event NewTagHandler NewTagEvent;
@@ -51,25 +51,6 @@ namespace LongoMatch.Interfaces.GUI
                /* Snapshots */
                event SnapshotSeriesHandler SnapshotSeriesEvent;
                
-               /* Projects */
-               event SaveProjectHandler SaveProjectEvent;
-               event NewProjectHandler NewProjectEvent;
-               event OpenProjectHandler OpenProjectEvent;
-               event CloseOpenendProjectHandler CloseOpenedProjectEvent;
-               event ImportProjectHandler ImportProjectEvent;
-               event ExportProjectHandler ExportProjectEvent;
-               
-               /* Managers */
-               event ManageJobsHandler ManageJobsEvent; 
-               event ManageTeamsHandler ManageTeamsEvent;
-               event ManageCategoriesHandler ManageCategoriesEvent;
-               event ManageProjects ManageProjectsEvent;
-               event ManageDatabases ManageDatabasesEvent;
-               event EditPreferences EditPreferencesEvent;
-               
-               /* Stats */
-               event ShowProjectStats ShowProjectStatsEvent;
-               
                /* Game Units events */
                event GameUnitHandler GameUnitEvent;
                event UnitChangedHandler UnitChanged;
@@ -77,27 +58,28 @@ namespace LongoMatch.Interfaces.GUI
                event UnitsDeletedHandler UnitDeleted;
                event UnitAddedHandler UnitAdded;
                
-               event KeyHandler KeyPressed;
+               /* Error handling */
+               event CloseOpenendProjectHandler CloseOpenedProjectEvent;
                
-               /* Convert Video Files */
-               event ConvertVideoFilesHandler ConvertVideoFilesEvent;
+               event KeyHandler KeyPressed;
                
                void SetProject(Project project, ProjectType projectType, CaptureSettings props, PlaysFilter 
filter);
+               void CloseOpenedProject ();
                void AddPlay(Play play);
                void UpdateSelectedPlay (Play play);
                void UpdateCategories (Categories categories);
                void DeletePlays (List<Play> plays);
                void UpdateGameUnits (GameUnitsList gameUnits);
                
-               IRenderingStateBar RenderingStateBar{get;}
+               bool Fullscreen {set;}
+               bool WidgetsVisible {set;}
+               bool PlaylistVisible {set;}
+               VideoAnalysisMode AnalysisMode {set;}
+               
                IPlayer Player{get;}
                ICapturer Capturer{get;}
                IPlaylistWidget Playlist{get;}
                ITemplatesService TemplatesService{set;}
-               
-               void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit> 
exportAction);
-               void AddImportEntry (string name, string shortName, string filterName, string filter,
-                                    Func<string, Project> importFunc, bool requiresNewFile);
        }
 }
 
diff --git a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
index 0adb8d7..4f1f4eb 100644
--- a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
@@ -30,9 +30,12 @@ namespace LongoMatch.Interfaces.GUI
 {
        public interface IGUIToolkit
        {
-               IMainWindow MainWindow {get;}
+               IMainController MainController {get;}
+               IRenderingStateBar RenderingStateBar {get;}
                Version Version {get;}
        
+               void Quit ();
+               
                /* Messages */
                void InfoMessage(string message, Widget parent=null);
                void WarningMessage(string message, Widget parent=null);
@@ -54,6 +57,12 @@ namespace LongoMatch.Interfaces.GUI
                List<EditionJob> ConfigureRenderingJob (IPlayList playlist);
                void ExportFrameSeries(Project openenedProject, Play play, string snapshotDir);
                
+               void OpenProject (Project project, ProjectType projectType, 
+                                 CaptureSettings props, PlaysFilter filter,
+                                 out IAnalysisWindow analysisWindow,
+                                 out IProjectOptionsController projectOptionsController);
+               void CloseProject ();
+                                            
                ProjectDescription SelectProject(List<ProjectDescription> projects);
                ProjectType SelectNewProjectType();
                
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainController.cs 
b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
new file mode 100644
index 0000000..84e8f46
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
@@ -0,0 +1,50 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Handlers;
+using LongoMatch.Store;
+
+namespace LongoMatch.Interfaces.GUI
+{
+       public interface IMainController
+       {
+               /* Projects */
+               event NewProjectHandler NewProjectEvent;
+               event OpenProjectHandler OpenProjectEvent;
+               event ImportProjectHandler ImportProjectEvent;
+               event ExportProjectHandler ExportProjectEvent;
+               event QuitApplicationHandler QuitApplicationEvent;
+               
+               /* Managers */
+               event ManageJobsHandler ManageJobsEvent; 
+               event ManageTeamsHandler ManageTeamsEvent;
+               event ManageCategoriesHandler ManageCategoriesEvent;
+               event ManageProjects ManageProjectsEvent;
+               event ManageDatabases ManageDatabasesEvent;
+               event EditPreferences EditPreferencesEvent;
+               
+               /* Convert Video Files */
+               event ConvertVideoFilesHandler ConvertVideoFilesEvent;
+               
+               void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit> 
exportAction);
+               void AddImportEntry (string name, string shortName, string filterName,
+                                    string filter, Func<string, Project> importFunc,
+                                    bool requiresNewFile);
+       }
+}
+
diff --git a/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs 
b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
new file mode 100644
index 0000000..021fe10
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
@@ -0,0 +1,35 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Handlers;
+
+namespace LongoMatch.Interfaces.GUI
+{
+       public interface IProjectOptionsController
+       {
+               event SaveProjectHandler SaveProjectEvent;
+               event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+               event ShowFullScreenHandler ShowFullScreenEvent;
+               event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+               event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+               event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+               event ShowProjectStats ShowProjectStatsEvent;
+               event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
+       }
+}
+
diff --git a/LongoMatch.Core/LongoMatch.Core.mdp b/LongoMatch.Core/LongoMatch.Core.mdp
index d229c42..f1c5e79 100644
--- a/LongoMatch.Core/LongoMatch.Core.mdp
+++ b/LongoMatch.Core/LongoMatch.Core.mdp
@@ -74,7 +74,7 @@
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IRenderingStateBar.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlayer.cs" />
     <File subtype="Code" buildaction="Compile" name="Handlers/Multimedia.cs" />
-    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainWindow.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IAnalysisWindow.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/ICapturer.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlaylistWidget.cs" />
     <File subtype="Directory" buildaction="Compile" name="Interfaces" />
@@ -107,6 +107,8 @@
     <File subtype="Code" buildaction="Compile" name="Common/EncodingQuality.cs" />
     <File subtype="Code" buildaction="Compile" name="Common/Gettext.cs" />
     <File subtype="Code" buildaction="Compile" name="Common/Exceptions.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainController.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IProjectOptionsController.cs" />
     <File subtype="Code" buildaction="EmbedAsResource" name="../images/field_background.svg" />
     <File subtype="Code" buildaction="EmbedAsResource" name="../images/goal_background.svg" />
     <File subtype="Code" buildaction="EmbedAsResource" name="../images/half_field_background.svg" />
@@ -120,4 +122,4 @@
     <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
     <ProjectReference type="Gac" localcopy="True" refto="System.Drawing, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a" />
   </References>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs 
b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
new file mode 100644
index 0000000..df79861
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
@@ -0,0 +1,664 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Interfaces.GUI;
+using LongoMatch.Handlers;
+using LongoMatch.Common;
+using LongoMatch.Store;
+using LongoMatch.Interfaces;
+using LongoMatch.Store.Templates;
+using System.Collections.Generic;
+using Gdk;
+using Gtk;
+using LongoMatch.Gui.Helpers;
+using Mono.Posix;
+
+namespace LongoMatch.Gui.Component
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class AnalysisComponent : Gtk.Bin, IAnalysisWindow
+       {
+               /* Error handling */
+               public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+               
+               /* Tags */
+               public event NewTagHandler NewTagEvent;
+               public event NewTagStartHandler NewTagStartEvent;
+               public event NewTagStopHandler NewTagStopEvent;
+               public event NewTagCancelHandler NewTagCancelEvent;
+               public event PlaySelectedHandler PlaySelectedEvent;
+               public event NewTagAtFrameHandler NewTagAtFrameEvent;
+               public event TagPlayHandler TagPlayEvent;
+               public event PlaysDeletedHandler PlaysDeletedEvent;
+               public event TimeNodeChangedHandler TimeNodeChanged;
+               public event PlayCategoryChangedHandler PlayCategoryChanged;
+               public event DuplicatePlayHandler DuplicatePlay;
+               
+               /* Playlist */
+               public event RenderPlaylistHandler RenderPlaylistEvent;
+               public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
+               public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
+               public event OpenPlaylistHandler OpenPlaylistEvent;
+               public event NewPlaylistHandler NewPlaylistEvent;
+               public event SavePlaylistHandler SavePlaylistEvent; 
+               
+               /* Snapshots */
+               public event SnapshotSeriesHandler SnapshotSeriesEvent;
+               
+               /* Game Units events */
+               public event GameUnitHandler GameUnitEvent;
+               public event UnitChangedHandler UnitChanged;
+               public event UnitSelectedHandler UnitSelected;
+               public event UnitsDeletedHandler UnitDeleted;
+               public event UnitAddedHandler UnitAdded;
+               
+               public event KeyHandler KeyPressed;
+
+               static Project openedProject;
+               ProjectType projectType;
+               TimeNode selectedTimeNode;              
+               TimeLineWidget timeline;
+               bool gameUnitsActionVisible, detachedPlayer;
+               GameUnitsTimelineWidget guTimeline;
+               IGUIToolkit guiToolKit;
+               Gtk.Window playerWindow;
+               VideoAnalysisMode analysisMode;
+               
+               public AnalysisComponent ()
+               {
+                       this.Build ();
+                       projectType = ProjectType.None;
+
+                       timeline = new TimeLineWidget();
+                       downbox.PackStart(timeline, true, true, 0);
+                       
+                       guTimeline = new GameUnitsTimelineWidget ();
+                       downbox.PackStart(guTimeline, true, true, 0);
+                       
+                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+                       playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
+                       playercapturer.LogoMode = true;
+                       playercapturer.Tick += OnTick;
+                       playercapturer.Detach += DetachPlayer;
+                       playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
+                       playercapturer.CaptureFinished += (sender, e) => {
+                               EmitCloseOpenedProject();
+                               (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
+                               (downbox[buttonswidget] as Box.BoxChild).Expand = false;
+                       };
+                       
+                       buttonswidget.Mode = TagMode.Predifined;
+                       ConnectSignals();
+                       AnalysisMode = VideoAnalysisMode.PredefinedTagging;
+                       
+                       postagger.SetMode (false);
+               }
+               
+               public IPlayer Player{
+                       get {
+                               return playercapturer;
+                       }
+               }
+               
+               public ICapturer Capturer{
+                       get {
+                               return playercapturer;
+                       }
+               }
+               
+               public IPlaylistWidget Playlist{
+                       get {
+                               return playlist;
+                       }
+               }
+               
+               public ITemplatesService TemplatesService {
+                       set {
+                               playsSelection.TemplatesService = value;
+                       }
+               }
+               
+               public bool Fullscreen {
+                       set {
+                               playercapturer.FullScreen = value;
+                       }
+               }
+               
+               public bool WidgetsVisible {
+                       set {
+                               if(openedProject == null)
+                                       return;
+                       
+                               leftbox.Visible = value;
+                               timeline.Visible = value && AnalysisMode == VideoAnalysisMode.Timeline;
+                               buttonswidget.Visible = value && (AnalysisMode == 
VideoAnalysisMode.ManualTagging ||
+                                                                 AnalysisMode == 
VideoAnalysisMode.PredefinedTagging);
+                               if (Config.UseGameUnits) {
+                                       guTimeline.Visible = value && AnalysisMode == 
VideoAnalysisMode.GameUnits;
+                                       gameunitstaggerwidget1.Visible = value && (
+                                               AnalysisMode == VideoAnalysisMode.GameUnits ||
+                                               AnalysisMode == VideoAnalysisMode.PredefinedTagging ||
+                                               AnalysisMode == VideoAnalysisMode.ManualTagging);
+                               }
+                               if(value) {
+                                       SetTagsBoxVisibility (false);
+                               } else {
+                                       if (selectedTimeNode != null)
+                                               SetTagsBoxVisibility (true);
+                               }
+                       }
+               }
+               
+               public bool PlaylistVisible {
+                       set {
+                               SetPlaylistVisibility (value);
+                               playsSelection.PlayListLoaded = value;
+                       }
+               }
+               
+               public VideoAnalysisMode AnalysisMode {
+                       set {
+                               buttonswidget.Visible = (value == VideoAnalysisMode.ManualTagging) ||
+                                       (value == VideoAnalysisMode.PredefinedTagging);
+                               timeline.Visible = value == VideoAnalysisMode.Timeline;
+                               if (Config.UseGameUnits) {
+                                       guTimeline.Visible = value == VideoAnalysisMode.GameUnits;
+                                       gameunitstaggerwidget1.Visible = buttonswidget.Visible || 
guTimeline.Visible;
+                               }
+                               if(value == VideoAnalysisMode.ManualTagging)
+                                       buttonswidget.Mode = TagMode.Free;
+                               else if (value == VideoAnalysisMode.ManualTagging)
+                                       buttonswidget.Mode = TagMode.Predifined;
+                               analysisMode = value;
+                               
+                       }
+                       protected get {
+                               return analysisMode;
+                       }
+               }
+               
+               public void AddPlay(Play play) {
+                       playsSelection.AddPlay(play);
+                       timeline.AddPlay(play);
+                       timeline.QueueDraw();
+               }
+               
+               public void UpdateSelectedPlay (Play play) {
+                       selectedTimeNode = play;
+                       timeline.SelectedTimeNode = play;
+                       postagger.LoadPlay (play, false);
+                       SetTagsBoxVisibility (true);
+                       notes.Play= play;
+               }
+
+               public void UpdateCategories (Categories categories) {
+                       buttonswidget.Categories = openedProject.Categories;
+               }
+               
+               public void DeletePlays (List<Play> plays) {
+                       playsSelection.RemovePlays(plays);
+                       timeline.RemovePlays(plays);
+                       timeline.QueueDraw();
+               }
+               
+               public void UpdateGameUnits (GameUnitsList gameUnits) {
+                       gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
+                       //GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
+                       if (gameUnits == null) {
+                               gameunitstaggerwidget1.Visible = false;
+                               return;
+                       }
+                       gameunitstaggerwidget1.Visible = true;
+                       gameunitstaggerwidget1.GameUnits = gameUnits;
+               }
+               
+               private void ConnectSignals() {
+                       /* Adding Handlers for each event */
+
+                       /* Connect new mark event */
+                       buttonswidget.NewMarkEvent += EmitNewTag;;
+                       buttonswidget.NewMarkStartEvent += EmitNewTagStart;
+                       
+                       buttonswidget.NewMarkStopEvent += EmitNewTagStop;
+                       buttonswidget.NewMarkCancelEvent += EmitNewTagCancel;
+                       timeline.NewMarkEvent += EmitNewTagAtFrame;
+
+                       /* Connect TimeNodeChanged events */
+                       timeline.TimeNodeChanged += EmitTimeNodeChanged;
+                       notes.TimeNodeChanged += EmitTimeNodeChanged;
+
+                       /* Connect TimeNodeDeleted events */
+                       playsSelection.PlaysDeleted += EmitPlaysDeleted;
+                       timeline.TimeNodeDeleted += EmitPlaysDeleted;
+
+                       /* Connect TimeNodeSelected events */
+                       playsSelection.PlaySelected += OnTimeNodeSelected;
+                       timeline.TimeNodeSelected += OnTimeNodeSelected;
+                       
+                       /* Connect TimeNodeChangedEvent */
+                       playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
+
+                       /* Connect PlayCategoryChanged events */
+                       playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
+
+                       /* Connect playlist events */
+                       playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
+                       playlist.NewPlaylistEvent += EmitNewPlaylist;
+                       playlist.OpenPlaylistEvent += EmitOpenPlaylist;
+                       playlist.SavePlaylistEvent += EmitSavePlaylist;
+
+                       /* Connect PlayListNodeAdded events */
+                       playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
+                       timeline.PlayListNodeAdded += OnPlayListNodeAdded;
+
+                       /* Connect duplicate plays */
+                       playsSelection.DuplicatePlay += EmitDuplicatePlay;
+
+                       /* Connect tags events */
+                       playsSelection.TagPlay += EmitTagPlay;
+                       timeline.TagPlay += EmitTagPlay;
+
+                       /* Connect SnapshotSeries events */
+                       playsSelection.SnapshotSeries += EmitSnapshotSeries;
+                       timeline.SnapshotSeries += EmitSnapshotSeries;
+
+                       playlist.RenderPlaylistEvent += EmitRenderPlaylist;
+                       playsSelection.RenderPlaylist += EmitRenderPlaylist;
+                       timeline.RenderPlaylist += EmitRenderPlaylist;
+                       
+                       /* Game Units event */
+                       gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
+                       guTimeline.UnitAdded += EmitUnitAdded;;
+                       guTimeline.UnitDeleted += EmitUnitDeleted;
+                       guTimeline.UnitSelected += EmitUnitSelected;
+                       guTimeline.UnitChanged += EmitUnitChanged;
+                       
+                       playercapturer.Error += OnMultimediaError;
+                       playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
+                       
+                       KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key, 
(int)args.Event.State));
+               }
+               
+               void DetachPlayer (bool detach) {
+                       if (detach == detachedPlayer)
+                               return;
+                               
+                       detachedPlayer = detach;
+                       
+                       if (detach) {
+                               EventBox box;
+                               Log.Debug("Detaching player");
+                               
+                               playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
+                               playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch", 
IconSize.Button);
+                               playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
+                               box = new EventBox();
+                               
+                               box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
+                               playerWindow.Add(box);
+                               
+                               box.Show();
+                               playerWindow.Show();
+                               
+                               playercapturer.Reparent(box);
+                               videowidgetsbox.Visible = false;
+                               if (openedProject != null) {
+                                       buttonswidget.Visible = true;
+                                       timeline.Visible = true;
+                                       if (Config.UseGameUnits) {
+                                               guTimeline.Visible = true;
+                                               gameunitstaggerwidget1.Visible = true;
+                                       }
+                               }
+                       } else {
+                               Log.Debug("Attaching player again");
+                               videowidgetsbox.Visible = true;
+                               playercapturer.Reparent(this.videowidgetsbox);
+                               playerWindow.Destroy();
+                               
+                               AnalysisMode = analysisMode;
+                       }
+                       playercapturer.Detached = detach;
+               }
+               
+               public void CloseOpenedProject () {
+                       openedProject = null;
+                       projectType = ProjectType.None;
+                       ResetGUI ();
+                       return;
+               }
+               
+               public void SetProject(Project project, ProjectType projectType, CaptureSettings props, 
PlaysFilter filter)
+               {
+                       bool isLive = false;
+                       
+                       /* Update tabs labels */
+                       var desc = project.Description;
+                       
+                       if(projectType == ProjectType.FileProject) {
+                               playercapturer.LogoMode = false;
+                               timeline.SetProject (project, filter);
+                               guTimeline.Project = project;
+
+                       } else {
+                               isLive = true;
+                               if(projectType == ProjectType.FakeCaptureProject) {
+                                       playercapturer.Type = CapturerType.Fake;
+                                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
+                               } else {
+                                       playercapturer.Mode = 
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
+                               }
+                       }
+                       
+                       if(projectType == ProjectType.FakeCaptureProject) {
+#if OS_TYPE_LINUX
+                               /* This deadlocks in Windows and OS X */
+                               (downbox[videowidgetsbox] as Box.BoxChild).Expand = false;
+#endif
+                               (downbox[buttonswidget] as Box.BoxChild).Expand = true;
+                       }
+                       
+                       openedProject = project;
+                       this.projectType = projectType;
+                       
+                       playsSelection.SetProject(project, isLive, filter);
+                       buttonswidget.Categories = project.Categories;
+                       ShowWidgets ();
+                       postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
+                                                  openedProject.Categories.HalfFieldBackground,
+                                                  openedProject.Categories.GoalBackground);
+                       ShowWidgets();
+               }
+               
+               void SetPlaylistVisibility (bool visible) {
+                       if (visible) {
+                               righthbox.Visible = true;
+                               playlist.Visible = true;
+                       } else {
+                               playlist.Visible = false;
+                               if (!tagsvbox.Visible)
+                                       righthbox.Visible = false;
+                       }
+               }
+               
+               void SetTagsBoxVisibility (bool visible) {
+                       if (visible) {
+                               righthbox.Visible = true;
+                               tagsvbox.Visible = true;
+                       } else {
+                               tagsvbox.Visible = false;
+                               if (!playlist.Visible)
+                                       righthbox.Visible = false;
+                       }
+               }
+               
+               private void ResetGUI() {
+                       bool playlistVisible = playlist.Visible;
+                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+                       playercapturer.LogoMode = true;
+                       ClearWidgets();
+                       HideWidgets();
+                       SetPlaylistVisibility (playlistVisible);
+                       SetTagsBoxVisibility (false);
+                       selectedTimeNode = null;
+                       if (detachedPlayer)
+                               DetachPlayer(false);
+               }
+               
+               private void ShowWidgets() {
+                       leftbox.Show();
+                       if(analysisMode == VideoAnalysisMode.ManualTagging ||
+                          analysisMode == VideoAnalysisMode.PredefinedTagging) {
+                               buttonswidget.Show();
+                               gameunitstaggerwidget1.Show();
+                       } else if (analysisMode == VideoAnalysisMode.Timeline) {
+                               timeline.Show();
+                       } else if (analysisMode == VideoAnalysisMode.GameUnits) {
+                               gameunitstaggerwidget1.Show();
+                               guTimeline.Show();
+                       }
+               }
+
+               private void HideWidgets() {
+                       leftbox.Hide();
+                       SetTagsBoxVisibility (false);
+                       buttonswidget.Hide();
+                       timeline.Hide();
+                       gameunitstaggerwidget1.Hide();
+                       guTimeline.Hide();
+               }
+
+               private void ClearWidgets() {
+                       buttonswidget.Categories = null;
+                       playsSelection.Clear();
+               }
+               
+               protected override bool OnKeyPressEvent(EventKey evnt)
+               {
+                       Gdk.Key key = evnt.Key;
+                       Gdk.ModifierType modifier = evnt.State;
+                       bool ret;
+
+                       ret = base.OnKeyPressEvent(evnt);
+
+                       if(openedProject == null && !playercapturer.Opened)
+                               return ret;
+
+                       if(projectType != ProjectType.CaptureProject &&
+                          projectType != ProjectType.URICaptureProject &&
+                          projectType != ProjectType.FakeCaptureProject) {
+                               switch(key) {
+                               case Constants.SEEK_FORWARD:
+                                       if(modifier == Constants.STEP)
+                                               playercapturer.StepForward();
+                                       else
+                                               playercapturer.SeekToNextFrame(selectedTimeNode != null);
+                                       break;
+                               case Constants.SEEK_BACKWARD:
+                                       if(modifier == Constants.STEP)
+                                               playercapturer.StepBackward();
+                                       else
+                                               playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
+                                       break;
+                               case Constants.FRAMERATE_UP:
+                                       playercapturer.FramerateUp();
+                                       break;
+                               case Constants.FRAMERATE_DOWN:
+                                       playercapturer.FramerateDown();
+                                       break;
+                               case Constants.TOGGLE_PLAY:
+                                       playercapturer.TogglePlay();
+                                       break;
+                               }
+                       } else {
+                               switch(key) {
+                               case Constants.TOGGLE_PLAY:
+                                       playercapturer.TogglePause();
+                                       break;
+                               }
+                       }
+                       return ret;
+               }
+
+               protected virtual void OnTimeNodeSelected(Play play)
+               {
+                       SetTagsBoxVisibility (true);
+                       if (PlaySelectedEvent != null)
+                               PlaySelectedEvent(play);
+               }
+
+               protected virtual void OnSegmentClosedEvent()
+               {
+                       SetTagsBoxVisibility (false);
+                       timeline.SelectedTimeNode = null;
+                       selectedTimeNode = null;
+               }
+               
+               protected virtual void OnTick(object o, long currentTime, long streamLength,
+                       float currentPosition, bool seekable)
+               {
+                       if(currentTime != 0 && timeline != null && openedProject != null) {
+                               uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
+                               timeline.CurrentFrame = frame;
+                               guTimeline.CurrentFrame = frame;
+                       }
+                       gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
+               }
+               
+               protected virtual void OnMultimediaError(object o, string message)
+               {
+                       MessagesHelpers.ErrorMessage (this,
+                               Catalog.GetString("The following error happened and" +
+                               " the current project will be closed:")+"\n" + message);
+                       EmitCloseOpenedProject ();
+               }
+               
+               private void EmitCloseOpenedProject () {
+                       if (CloseOpenedProjectEvent != null)
+                               CloseOpenedProjectEvent ();
+               }
+               
+               private void EmitPlaySelected(Play play)
+               {
+                       if (PlaySelectedEvent != null)
+                               PlaySelectedEvent(play);
+               }
+
+               private void EmitTimeNodeChanged(TimeNode tNode, object val)
+               {
+                       if (TimeNodeChanged != null)
+                               TimeNodeChanged(tNode, val);
+               }
+
+               private void EmitPlaysDeleted(List<Play> plays)
+               {
+                       if (PlaysDeletedEvent != null)
+                               PlaysDeletedEvent(plays);
+               }
+               
+               protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
+               {
+                       if(PlayCategoryChanged != null)
+                               PlayCategoryChanged(play, cat);
+               }
+
+               private void OnPlayListNodeAdded(List<Play> plays)
+               {
+                       if (PlayListNodeAddedEvent != null)
+                               PlayListNodeAddedEvent(plays);
+               }
+
+               private void EmitPlayListNodeSelected(PlayListPlay plNode)
+               {
+                       if (PlayListNodeSelectedEvent != null)
+                               PlayListNodeSelectedEvent(plNode);
+               }
+
+               private void EmitSnapshotSeries(Play play) {
+                       if (SnapshotSeriesEvent != null)
+                               SnapshotSeriesEvent (play);
+               }
+
+               private void EmitNewTagAtFrame(Category category, int frame) {
+                       if (NewTagAtFrameEvent != null)
+                               NewTagAtFrameEvent(category, frame);
+               }
+
+               private void EmitNewTag(Category category) {
+                       if (NewTagEvent != null)
+                               NewTagEvent(category);
+               }
+
+               private void EmitNewTagStart(Category category) {
+                       if (NewTagStartEvent != null)
+                               NewTagStartEvent (category);
+               }
+
+               private void EmitNewTagStop(Category category) {
+                       if (NewTagStopEvent != null)
+                               NewTagStopEvent (category);
+               }
+               
+               private void EmitNewTagCancel(Category category) {
+                       if (NewTagCancelEvent != null)
+                               NewTagCancelEvent (category);
+               }
+               
+               private void EmitRenderPlaylist(IPlayList playlist) {
+                       if (RenderPlaylistEvent != null)
+                               RenderPlaylistEvent(playlist);
+               }
+               
+               private void EmitTagPlay(Play play) {
+                       if (TagPlayEvent != null)
+                               TagPlayEvent (play);
+               }
+               
+               private void EmitNewPlaylist() {
+                       if (NewPlaylistEvent != null)
+                               NewPlaylistEvent();
+               }
+               
+               private void EmitOpenPlaylist() {
+                       if (OpenPlaylistEvent != null)
+                               OpenPlaylistEvent();
+               }
+               
+               private void EmitSavePlaylist() {
+                       if (SavePlaylistEvent != null)
+                               SavePlaylistEvent();
+               }
+               
+               private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
+                       if (GameUnitEvent != null)
+                               GameUnitEvent(gameUnit, eType);
+               }
+               
+               private void EmitUnitAdded(GameUnit gameUnit, int frame) {
+                       if (UnitAdded != null)
+                               UnitAdded(gameUnit, frame);
+               }
+               
+               private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
+                       if (UnitDeleted != null)
+                               UnitDeleted(gameUnit, units);
+               }
+               
+               private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
+                       if (UnitSelected != null)
+                               UnitSelected(gameUnit, unit);
+               }
+               
+               private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
+                       if (UnitChanged != null)
+                               UnitChanged(gameUnit, unit, time);
+               }
+               
+               private void EmitKeyPressed(object sender, int key, int modifier) {
+                       if (KeyPressed != null)
+                               KeyPressed(sender, key, modifier);
+               }
+
+               void EmitDuplicatePlay (Play play)
+               {
+                       if (DuplicatePlay != null)
+                               DuplicatePlay (play);
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
index 30bae1d..b035011 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
@@ -67,6 +67,7 @@ namespace LongoMatch.Gui.Component
                }
                
                void UpdateGui () {
+               
                        homelabel.Text = stats.LocalTeam;
                        awaylabel.Text = stats.VisitorTeam;
                        GetMaxSize(out catsMaxSize, out subcatsMaxSize);
diff --git a/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs 
b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..47374f6
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
@@ -0,0 +1,131 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Store;
+using System.Collections.Generic;
+using Gdk;
+using Gtk;
+
+namespace LongoMatch.Gui.Component
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class SubcategoiesTagsEditor : Gtk.Bin
+       {
+               TagSubCategory template;
+               Dictionary<string, Widget>  tagsDict;
+               Color templateExistsColor;
+               
+               public SubcategoiesTagsEditor ()
+               {
+                       this.Build ();
+                       Gdk.Color.Parse("red", ref templateExistsColor);
+                       tagsDict = new Dictionary<string, Widget>();
+                       addtagbutton.Clicked += OnAddTag;
+                       tagentry.Activated += OnAddTag;
+                       nameentry.Changed += OnNameChanged;
+                       multicheckbutton.Toggled += OnMultiToggled;
+                       fastcheckbutton.Toggled += OnFastToggled;
+                       TemplatesNames = new List<string>();
+               }
+               
+               public List<string> TemplatesNames {
+                       get;
+                       set;
+               }
+               
+               public TagSubCategory Template {
+                       set{
+                               template = value;
+                               nameentry.Text = template.Name;
+                               fastcheckbutton.Active = template.FastTag;
+                               multicheckbutton.Active = template.AllowMultiple;
+                               
+                               foreach (string tag in template)
+                                       AddTag(tag, false);
+                       }
+                       get {
+                               return template;
+                       }
+               }
+               
+               public bool CheckName {
+                       set;
+                       get;
+               }
+               
+               private void RemoveTag (string tag) {
+                       tagsbox.Remove(tagsDict[tag]);
+                       tagsDict.Remove(tag);
+                       template.Remove(tag);
+               }
+               
+               private void AddTag(string tag, bool update) {
+                       HBox box;
+                       Label label;
+                       Button button;
+                       
+                       if (tagsDict.ContainsKey(tag))
+                               return;
+                       
+                       box = new HBox();
+                       label = new Label(tag);
+                       label.Justify = Justification.Left;
+                       button = new Button("gtk-delete");
+                       button.Clicked += delegate {
+                               RemoveTag(tag);
+                       };
+                       box.PackStart(label, true, false, 0);
+                       box.PackStart(button, false, false, 0);
+                       
+                       tagsbox.PackStart(box, false, false, 0);
+                       box.ShowAll();
+                       
+                       tagsDict.Add(tag, box);
+                       if (update)
+                               template.Add(tag);
+               }
+               
+               protected virtual void OnNameChanged (object sender, EventArgs e)
+               {
+                       if ((CheckName && TemplatesNames.Contains(nameentry.Text)) ||
+                           nameentry.Text == "") {
+                               nameentry.ModifyText(StateType.Normal, templateExistsColor);
+                       } else { 
+                               nameentry.ModifyText(StateType.Normal);
+                               template.Name = nameentry.Text;
+                       }
+               }
+               
+               protected virtual void OnMultiToggled (object sender, System.EventArgs e)
+               {
+                       template.AllowMultiple = multicheckbutton.Active;
+               }
+               
+               protected virtual void OnFastToggled (object sender, System.EventArgs e)
+               {
+                       template.FastTag = fastcheckbutton.Active;
+                       
+               }
+               
+               protected virtual void OnAddTag (object sender, System.EventArgs e)
+               {
+                       AddTag(tagentry.Text, true);
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/GUIToolkit.cs b/LongoMatch.GUI/Gui/GUIToolkit.cs
index 2c3c180..3574b8a 100644
--- a/LongoMatch.GUI/Gui/GUIToolkit.cs
+++ b/LongoMatch.GUI/Gui/GUIToolkit.cs
@@ -40,7 +40,7 @@ namespace LongoMatch.Gui
        public class GUIToolkit: IGUIToolkit
        {
                static GUIToolkit instance;
-               IMainWindow mainWindow;
+               MainWindow mainWindow;
                
                public GUIToolkit (Version version)
                {
@@ -56,12 +56,18 @@ namespace LongoMatch.Gui
                        }
                }
                
-               public IMainWindow MainWindow{
+               public IMainController MainController {
                        get {
                                return mainWindow;
                        }
                }
                
+               public IRenderingStateBar RenderingStateBar {
+                       get {
+                               return mainWindow.RenderingStateBar;
+                       }
+               }
+               
                public Version Version {
                        get;
                        set;
@@ -367,6 +373,23 @@ namespace LongoMatch.Gui
                        return remuxer.Remux (mainWindow as Gtk.Window);
                }
                
+               public void OpenProject (Project project, ProjectType projectType, 
+                                        CaptureSettings props, PlaysFilter filter,
+                                            out IAnalysisWindow analysisWindow,
+                                            out IProjectOptionsController projectOptionsController)
+               {
+                       analysisWindow = mainWindow.SetProject (project, projectType, props, filter);
+                       projectOptionsController = mainWindow;
+               }
+               
+               public void CloseProject ()
+               {
+                       mainWindow.CloseProject ();
+               }
+               
+               public void Quit () {
+                       Gtk.Application.Quit ();
+               }
        }
 }
 
diff --git a/LongoMatch.GUI/Gui/MainWindow.cs b/LongoMatch.GUI/Gui/MainWindow.cs
index e416b93..f275f8e 100644
--- a/LongoMatch.GUI/Gui/MainWindow.cs
+++ b/LongoMatch.GUI/Gui/MainWindow.cs
@@ -42,72 +42,37 @@ namespace LongoMatch.Gui
 {
        [System.ComponentModel.Category("LongoMatch")]
        [System.ComponentModel.ToolboxItem(false)]
-       public partial class MainWindow : Gtk.Window, IMainWindow
+       public partial class MainWindow : Gtk.Window, IMainController, IProjectOptionsController
        {
-       
-               /* Tags */
-               public event NewTagHandler NewTagEvent;
-               public event NewTagStartHandler NewTagStartEvent;
-               public event NewTagStopHandler NewTagStopEvent;
-               public event NewTagCancelHandler NewTagCancelEvent;
-               public event PlaySelectedHandler PlaySelectedEvent;
-               public event NewTagAtFrameHandler NewTagAtFrameEvent;
-               public event TagPlayHandler TagPlayEvent;
-               public event PlaysDeletedHandler PlaysDeletedEvent;
-               public event TimeNodeChangedHandler TimeNodeChanged;
-               public event PlayCategoryChangedHandler PlayCategoryChanged;
-               public event DuplicatePlayHandler DuplicatePlay;
-               
-               /* Playlist */
-               public event RenderPlaylistHandler RenderPlaylistEvent;
-               public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
-               public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
-               public event OpenPlaylistHandler OpenPlaylistEvent;
-               public event NewPlaylistHandler NewPlaylistEvent;
-               public event SavePlaylistHandler SavePlaylistEvent; 
-               
-               /* Video Converter */
-               public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
-               
-               /* Snapshots */
-               public event SnapshotSeriesHandler SnapshotSeriesEvent;
-               
-               /* Projects */
-               public event SaveProjectHandler SaveProjectEvent;
+               /* IMainController */
                public event NewProjectHandler NewProjectEvent;
                public event OpenProjectHandler OpenProjectEvent;
-               public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
                public event ImportProjectHandler ImportProjectEvent;
                public event ExportProjectHandler ExportProjectEvent;
-               public event ShowProjectStats ShowProjectStatsEvent;
+               public event QuitApplicationHandler QuitApplicationEvent;
                
-               /* Managers */
                public event ManageJobsHandler ManageJobsEvent; 
                public event ManageTeamsHandler ManageTeamsEvent;
                public event ManageCategoriesHandler ManageCategoriesEvent;
                public event ManageProjects ManageProjectsEvent;
                public event ManageDatabases ManageDatabasesEvent;
                public event EditPreferences EditPreferencesEvent;
+               public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
                
-               /* Game Units events */
-               public event GameUnitHandler GameUnitEvent;
-               public event UnitChangedHandler UnitChanged;
-               public event UnitSelectedHandler UnitSelected;
-               public event UnitsDeletedHandler UnitDeleted;
-               public event UnitAddedHandler UnitAdded;
+               /* IProjectOptionsController */
+               public event SaveProjectHandler SaveProjectEvent;
+               public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+               public event ShowProjectStats ShowProjectStatsEvent;
+               public event ShowFullScreenHandler ShowFullScreenEvent;
+               public event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+               public event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+               public event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+               public event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
                
-               public event KeyHandler KeyPressed;
-
-               private static Project openedProject;
-               private ProjectType projectType;
-               private TimeNode selectedTimeNode;              
-
-               TimeLineWidget timeline;
-               bool gameUnitsActionVisible;
-               GameUnitsTimelineWidget guTimeline;
                IGUIToolkit guiToolKit;
-               Gtk.Window playerWindow;
-               bool detachedPlayer;
+               IAnalysisWindow analysisWindow;
+               Project openedProject;
+               ProjectType projectType;
 
                #region Constructors
                public MainWindow(IGUIToolkit guiToolkit) :
@@ -116,30 +81,11 @@ namespace LongoMatch.Gui
                        Screen screen;
                        
                        this.Build();
-                       Title = Constants.SOFTWARE_NAME;
-
                        this.guiToolKit = guiToolkit;
-                       
-                       projectType = ProjectType.None;
-
-                       timeline = new TimeLineWidget();
-                       downbox.PackStart(timeline, true, true, 0);
-                       
-                       guTimeline = new GameUnitsTimelineWidget ();
-                       downbox.PackStart(guTimeline, true, true, 0);
-                       
+                       Title = Constants.SOFTWARE_NAME;
                        TagSubcategoriesAction.Active = !Config.FastTagging;
+                       projectType = ProjectType.None;
                        
-                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                       playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
-                       playercapturer.LogoMode = true;
-                       playercapturer.Tick += OnTick;
-                       playercapturer.Detach += DetachPlayer;
-
-                       playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
-                       playercapturer.CaptureFinished += (sender, e) => {CloseCaptureProject();};
-                       
-                       buttonswidget.Mode = TagMode.Predifined;
                        ConnectSignals();
                        ConnectMenuSignals();
                        
@@ -154,77 +100,18 @@ namespace LongoMatch.Gui
                                       false);
                        screen = Display.Default.DefaultScreen;
                        this.Resize(screen.Width * 80 / 100, screen.Height * 80 / 100);
-                       postagger.SetMode (false);
+                       analysisWindow = new AnalysisComponent();
                }
 
                #endregion
                
                #region Plubic Methods
-               public void AddPlay(Play play) {
-                       playsSelection.AddPlay(play);
-                       timeline.AddPlay(play);
-                       timeline.QueueDraw();
-               }
-               
-               public void UpdateSelectedPlay (Play play) {
-                       selectedTimeNode = play;
-                       timeline.SelectedTimeNode = play;
-                       postagger.LoadPlay (play, false);
-                       SetTagsBoxVisibility (true);
-                       notes.Play= play;
-               }
-
-               public void UpdateCategories (Categories categories) {
-                       buttonswidget.Categories = openedProject.Categories;
-               }
-               
-               public void DeletePlays (List<Play> plays) {
-                       playsSelection.RemovePlays(plays);
-                       timeline.RemovePlays(plays);
-                       timeline.QueueDraw();
-               }
-               
                public IRenderingStateBar RenderingStateBar{
                        get {
                                return renderingstatebar1;
                        }
                }
                
-               public IPlayer Player{
-                       get {
-                               return playercapturer;
-                       }
-               }
-               
-               public ICapturer Capturer{
-                       get {
-                               return playercapturer;
-                       }
-               }
-               
-               public IPlaylistWidget Playlist{
-                       get {
-                               return playlist;
-                       }
-               }
-               
-               public ITemplatesService TemplatesService {
-                       set {
-                               playsSelection.TemplatesService = value;
-                       }
-               }
-               
-               public void UpdateGameUnits (GameUnitsList gameUnits) {
-                       gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
-                       GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
-                       if (gameUnits == null) {
-                               gameunitstaggerwidget1.Visible = false;
-                               return;
-                       }
-                       gameunitstaggerwidget1.Visible = true;
-                       gameunitstaggerwidget1.GameUnits = gameUnits;
-               }
-               
                public void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit> 
exportAction) {
                        MenuItem parent = (MenuItem) 
this.UIManager.GetWidget("/menubar1/ToolsAction/ExportProjectAction1");
                        
@@ -243,6 +130,32 @@ namespace LongoMatch.Gui
                        item.Show();
                        (parent.Submenu as Menu).Append(item);
                }
+               
+               public IAnalysisWindow SetProject(Project project, ProjectType projectType, CaptureSettings 
props, PlaysFilter filter)
+               {
+                       ExportProjectAction1.Sensitive = true;
+                       
+                       openedProject = project;
+                       if (projectType == ProjectType.FileProject) {
+                               Title = System.IO.Path.GetFileNameWithoutExtension(
+                                       openedProject.Description.File.FilePath) + " - " + 
Constants.SOFTWARE_NAME;
+                       } else {
+                               Title = Constants.SOFTWARE_NAME;
+                       }
+                       MakeActionsSensitive(true, projectType);
+                       analysisWindow.SetProject (project, projectType, props, filter);
+                       (analysisWindow as Gtk.Widget).Show();
+                       centralbox.PackStart (analysisWindow as Gtk.Widget, true, true, 0);
+                       return analysisWindow;
+               }
+               
+               public void CloseProject () {
+                       openedProject = null;
+                       projectType = ProjectType.None;
+                       centralbox.Remove (analysisWindow as Gtk.Widget);
+                       ResetGUI ();
+               }
+               
                #endregion
                
                #region Private Methods
@@ -255,77 +168,13 @@ namespace LongoMatch.Gui
                
                private void ConnectSignals() {
                        /* Adding Handlers for each event */
-
-                       /* Connect new mark event */
-                       buttonswidget.NewMarkEvent += EmitNewTag;;
-                       buttonswidget.NewMarkStartEvent += EmitNewTagStart;
-                       buttonswidget.NewMarkStopEvent += EmitNewTagStop;
-                       buttonswidget.NewMarkCancelEvent += EmitNewTagCancel;
-                       timeline.NewMarkEvent += EmitNewTagAtFrame;
-
-                       /* Connect TimeNodeChanged events */
-                       timeline.TimeNodeChanged += EmitTimeNodeChanged;
-                       notes.TimeNodeChanged += EmitTimeNodeChanged;
-
-                       /* Connect TimeNodeDeleted events */
-                       playsSelection.PlaysDeleted += EmitPlaysDeleted;
-                       timeline.TimeNodeDeleted += EmitPlaysDeleted;
-
-                       /* Connect TimeNodeSelected events */
-                       playsSelection.PlaySelected += OnTimeNodeSelected;
-                       timeline.TimeNodeSelected += OnTimeNodeSelected;
-                       
-                       /* Connect TimeNodeChangedEvent */
-                       playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
-
-                       /* Connect PlayCategoryChanged events */
-                       playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
-
-                       /* Connect playlist events */
-                       playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
-                       playlist.NewPlaylistEvent += EmitNewPlaylist;
-                       playlist.OpenPlaylistEvent += EmitOpenPlaylist;
-                       playlist.SavePlaylistEvent += EmitSavePlaylist;
-
-                       /* Connect PlayListNodeAdded events */
-                       playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
-                       timeline.PlayListNodeAdded += OnPlayListNodeAdded;
-                       
-                       /* Connect duplicate plays */
-                       playsSelection.DuplicatePlay += EmitDuplicatePlay;
-
-                       /* Connect tags events */
-                       playsSelection.TagPlay += EmitTagPlay;
-                       timeline.TagPlay += EmitTagPlay;
-
-                       /* Connect SnapshotSeries events */
-                       playsSelection.SnapshotSeries += EmitSnapshotSeries;
-                       timeline.SnapshotSeries += EmitSnapshotSeries;
-
-                       playlist.RenderPlaylistEvent += EmitRenderPlaylist;
-                       playsSelection.RenderPlaylist += EmitRenderPlaylist;
-                       timeline.RenderPlaylist += EmitRenderPlaylist;
-                       
                        renderingstatebar1.ManageJobs += (e, o) => {EmitManageJobs();};
-                       
                        openAction.Activated += (sender, e) => {EmitSaveProject();};
-                       
-                       /* Game Units event */
-                       gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
-                       guTimeline.UnitAdded += EmitUnitAdded;;
-                       guTimeline.UnitDeleted += EmitUnitDeleted;
-                       guTimeline.UnitSelected += EmitUnitSelected;
-                       guTimeline.UnitChanged += EmitUnitChanged;
-                       
-                       playercapturer.Error += OnMultimediaError;
-                       playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
-                       
-                       KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key, 
(int)args.Event.State));
                }
                
                private void ConnectMenuSignals() {
                        SaveProjectAction.Activated += (o, e) => {EmitSaveProject();};
-                       CloseProjectAction.Activated += (o, e) => {PromptCloseProject();};
+                       CloseProjectAction.Activated += (o, e) => {EmitCloseOpenedProject ();};
                        ExportToProjectFileAction.Activated += (o, e) => {EmitExportProject();};
                        QuitAction.Activated += (o, e) => {CloseAndQuit();};
                        CategoriesTemplatesManagerAction.Activated += (o, e) => {EmitManageCategories();};
@@ -336,152 +185,9 @@ namespace LongoMatch.Gui
                        ShowProjectStatsAction.Activated += (sender, e) => {EmitShowProjectStats();}; 
                }
                
-               void DetachPlayer (bool detach) {
-                       if (detach == detachedPlayer)
-                               return;
-                               
-                       detachedPlayer = detach;
-                       
-                       if (detach) {
-                               EventBox box;
-                               Log.Debug("Detaching player");
-                               
-                               playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
-                               playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch", 
IconSize.Button);
-                               playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
-                               box = new EventBox();
-                               
-                               box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
-                               playerWindow.Add(box);
-                               
-                               box.Show();
-                               playerWindow.Show();
-                               
-                               playercapturer.Reparent(box);
-                               videowidgetsbox.Visible = false;
-                               if (openedProject != null) {
-                                       buttonswidget.Visible = true;
-                                       timeline.Visible = true;
-                                       if (Config.UseGameUnits) {
-                                               guTimeline.Visible = true;
-                                               gameunitstaggerwidget1.Visible = true;
-                                       }
-                               }
-                       } else {
-                               ToggleAction action;
-                               
-                               Log.Debug("Attaching player again");
-                               videowidgetsbox.Visible = true;
-                               playercapturer.Reparent(this.videowidgetsbox);
-                               playerWindow.Destroy();
-                               
-                               if (ManualTaggingViewAction.Active)
-                                       action = ManualTaggingViewAction;
-                               else if (TimelineViewAction.Active)
-                                       action = TimelineViewAction;
-                               else if (GameUnitsViewAction.Active)
-                                       action = GameUnitsViewAction;
-                               else
-                                       action = TaggingViewAction;
-                               OnViewToggled(action, new EventArgs());
-                       }
-                       playercapturer.Detached = detach;
-               }
-
-               public void SetProject(Project project, ProjectType projectType, CaptureSettings props, 
PlaysFilter filter)
-               {
-                       bool isLive = false;
-                       
-                       /* Update tabs labels */
-                       var desc = project.Description;
-                       
-                       ExportProjectAction1.Sensitive = true;
-                       
-                       if(projectType == ProjectType.FileProject) {
-                               Title = System.IO.Path.GetFileNameWithoutExtension(desc.File.FilePath) +
-                                       " - " + Constants.SOFTWARE_NAME;
-                               playercapturer.LogoMode = false;
-                               timeline.SetProject (project, filter);
-                               guTimeline.Project = project;
-
-                       } else {
-                               Title = Constants.SOFTWARE_NAME;
-                               isLive = true;
-                               if(projectType == ProjectType.FakeCaptureProject) {
-                                       playercapturer.Type = CapturerType.Fake;
-                                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
-                               } else {
-                                       playercapturer.Mode = 
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
-                               }
-                       }
-                       
-                       if(projectType == ProjectType.FakeCaptureProject) {
-#if OS_TYPE_LINUX
-                               /* This deadlocks in Windows and OS X */
-                               (downbox[videowidgetsbox] as Box.BoxChild).Expand = false;
-#endif
-                               (downbox[buttonswidget] as Box.BoxChild).Expand = true;
-                       }
-                       
-                       openedProject = project;
-                       this.projectType = projectType;
-                       
-                       filter.FilterUpdated += OnFilterUpdated;
-                       playsSelection.SetProject(project, isLive, filter);
-                       buttonswidget.Categories = project.Categories;
-                       MakeActionsSensitive(true,projectType);
-                       postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
-                                                  openedProject.Categories.HalfFieldBackground,
-                                                  openedProject.Categories.GoalBackground);
-                       ShowWidgets();
-               }
-               
-               void SetPlaylistVisibility (bool visible) {
-                       if (visible) {
-                               righthbox.Visible = true;
-                               playlist.Visible = true;
-                       } else {
-                               playlist.Visible = false;
-                               if (!tagsvbox.Visible)
-                                       righthbox.Visible = false;
-                       }
-               }
-               
-               void SetTagsBoxVisibility (bool visible) {
-                       if (visible) {
-                               righthbox.Visible = true;
-                               tagsvbox.Visible = true;
-                       } else {
-                               tagsvbox.Visible = false;
-                               if (!playlist.Visible)
-                                       righthbox.Visible = false;
-                       }
-               }
-               
-               private void CloseCaptureProject() {
-                       if(projectType == ProjectType.CaptureProject ||
-                          projectType == ProjectType.URICaptureProject) {
-                               playercapturer.Close();
-                               playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                               EmitSaveProject();
-                       } else if(projectType == ProjectType.FakeCaptureProject) {
-                               EmitCloseOpenedProject(true);
-                       }
-               }
-
                private void ResetGUI() {
-                       bool playlistVisible = playlist.Visible;
                        Title = Constants.SOFTWARE_NAME;
-                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                       playercapturer.LogoMode = true;
-                       ClearWidgets();
-                       HideWidgets();
-                       SetPlaylistVisibility (playlistVisible);
-                       SetTagsBoxVisibility (false);
-                       selectedTimeNode = null;
                        MakeActionsSensitive(false, projectType);
-                       if (detachedPlayer)
-                               DetachPlayer(false);
                }
 
                private void MakeActionsSensitive(bool sensitive, ProjectType projectType) {
@@ -491,88 +197,24 @@ namespace LongoMatch.Gui
                        ManualTaggingViewAction.Sensitive = sensitive;
                        ExportProjectAction1.Sensitive = sensitive;
                        ShowProjectStatsAction.Sensitive = sensitive;
-                       GameUnitsViewAction.Sensitive = sensitive2 && gameUnitsActionVisible;
+                       //GameUnitsViewAction.Sensitive = sensitive2 && gameUnitsActionVisible;
                        TimelineViewAction.Sensitive = sensitive2;
                        HideAllWidgetsAction.Sensitive=sensitive2;
                        SaveProjectAction.Sensitive = sensitive2;
                }
 
-               private void ShowWidgets() {
-                       leftbox.Show();
-                       if(TaggingViewAction.Active || ManualTaggingViewAction.Active) {
-                               buttonswidget.Show();
-                               gameunitstaggerwidget1.Show();
-                       } else if (TimelineViewAction.Active) {
-                               timeline.Show();
-                       } else if (GameUnitsViewAction.Active) {
-                               gameunitstaggerwidget1.Show();
-                               guTimeline.Show();
-                       }
-               }
-
-               private void HideWidgets() {
-                       leftbox.Hide();
-                       SetTagsBoxVisibility (false);
-                       buttonswidget.Hide();
-                       timeline.Hide();
-                       gameunitstaggerwidget1.Hide();
-                       guTimeline.Hide();
-               }
-
-               private void ClearWidgets() {
-                       buttonswidget.Categories = null;
-                       playsSelection.Clear();
-               }
-
-               private bool PromptCloseProject() {
-                       int res;
-                       EndCaptureDialog dialog;
-
-                       if(openedProject == null)
-                               return true;
-
-                       if(projectType == ProjectType.FileProject) {
-                               MessageDialog md = new MessageDialog(this, DialogFlags.Modal,
-                                                                    MessageType.Question, 
ButtonsType.OkCancel,
-                                                                    Catalog.GetString("Do you want to close 
the current project?"));
-                               res = md.Run();
-                               md.Destroy();
-                               if(res == (int)ResponseType.Ok) {
-                                       EmitCloseOpenedProject(true);
-                                       return true;
-                               }
-                               return false;
-                       }
-
-                       /* Capture project */
-                       dialog = new EndCaptureDialog(openedProject.Description.File.FilePath);
-                       dialog.TransientFor = (Gtk.Window)this.Toplevel;
-                       res = dialog.Run();
-                       dialog.Destroy();
+               private void CloseAndQuit() {
+                       EmitCloseOpenedProject ();
                        
-                       /* Close project wihtout saving */
-                       if(res == (int)EndCaptureResponse.Quit) {
-                               EmitCloseOpenedProject(false);
-                               (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
-                               (downbox[buttonswidget] as Box.BoxChild).Expand = false;
-                               return true;
-                       } else if(res == (int)EndCaptureResponse.Save) {
-                               /* Close and save project */
-                               EmitCloseOpenedProject(true);
-                               (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
-                               (downbox[buttonswidget] as Box.BoxChild).Expand = false;
-                               return true;
-                       } else
-                               /* Continue with the current project */
-                               return false;
+                       if (openedProject == null && QuitApplicationEvent != null) {
+                               QuitApplicationEvent ();
+                       }
                }
-
-               private void CloseAndQuit() {
-                       if(!PromptCloseProject())
-                               return;
-                       EmitSaveProject();
-                       playercapturer.Dispose();
-                       Application.Quit();
+               
+               protected override bool OnDeleteEvent (Event evnt)
+               {
+                       CloseAndQuit ();
+                       return true;
                }
                
                #endregion
@@ -581,16 +223,14 @@ namespace LongoMatch.Gui
                #region File
                protected virtual void OnNewActivated(object sender, System.EventArgs e)
                {
-                       if(!PromptCloseProject())
-                               return;
-                       EmitNewProject();
+                       if (NewProjectEvent != null)
+                               NewProjectEvent();
                }
 
                protected virtual void OnOpenActivated(object sender, System.EventArgs e)
                {
-                       if(!PromptCloseProject())
-                               return;
-                       EmitOpenProject();
+                       if(OpenProjectEvent != null)
+                               OpenProjectEvent();
                }
                #endregion
                
@@ -617,42 +257,26 @@ namespace LongoMatch.Gui
                #region View
                protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
                {
-                       Config.FastTagging = !TagSubcategoriesAction.Active;
+                       if (TagSubcategoriesChangedEvent != null)
+                               TagSubcategoriesChangedEvent (TagSubcategoriesAction.Active);
                }
 
                protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
                {
-                       playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+                       if (ShowFullScreenEvent != null)
+                               ShowFullScreenEvent ((sender as Gtk.ToggleAction).Active);
                }
 
                protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
                {
-                       bool visible = (sender as Gtk.ToggleAction).Active;
-                       SetPlaylistVisibility (visible);
-                       playsSelection.PlayListLoaded=visible;
+                       if (PlaylistVisibilityEvent != null)
+                               PlaylistVisibilityEvent ((sender as Gtk.ToggleAction).Active);
                }
 
                protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
                {
-                       ToggleAction action = sender as ToggleAction;
-                       
-                       if(openedProject == null)
-                               return;
-                       
-                       leftbox.Visible = !action.Active;
-                       timeline.Visible = !action.Active && TimelineViewAction.Active;
-                       buttonswidget.Visible = !action.Active &&
-                               (TaggingViewAction.Active || ManualTaggingViewAction.Active);
-                       if (Config.UseGameUnits) {
-                               guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
-                               gameunitstaggerwidget1.Visible = !action.Active && 
(GameUnitsViewAction.Active || 
-                                       TaggingViewAction.Active || ManualTaggingViewAction.Active);
-                       }
-                       if(action.Active) {
-                               SetTagsBoxVisibility (false);
-                       } else {
-                               if (selectedTimeNode != null)
-                                       SetTagsBoxVisibility (true);
+                       if (AnalysisWidgetsVisibilityEvent != null) {
+                               AnalysisWidgetsVisibilityEvent ((sender as ToggleAction).Active);
                        }
                }
 
@@ -663,18 +287,25 @@ namespace LongoMatch.Gui
                        if (!action.Active)
                                return;
                        
-                       buttonswidget.Visible = action == ManualTaggingViewAction || sender == 
TaggingViewAction;
-                       timeline.Visible = action == TimelineViewAction;
-                       if (Config.UseGameUnits) {
-                               guTimeline.Visible = action == GameUnitsViewAction;
-                               gameunitstaggerwidget1.Visible = buttonswidget.Visible || guTimeline.Visible;
+                       if (AnalysisModeChangedEvent != null) {
+                               VideoAnalysisMode mode;
+                               
+                               if (sender == ManualTaggingViewAction) {
+                                       mode = VideoAnalysisMode.ManualTagging;
+                               } else if (sender == TaggingViewAction) {
+                                       mode = VideoAnalysisMode.PredefinedTagging;
+                               } else if (sender ==  TimelineViewAction) {
+                                       mode = VideoAnalysisMode.Timeline;
+                               } else if (sender == GameUnitsViewAction) {
+                                       mode = VideoAnalysisMode.GameUnits;
+                               } else {
+                                       return;
+                               }
+                               AnalysisModeChangedEvent (mode);
                        }
-                       if(action == ManualTaggingViewAction)
-                               buttonswidget.Mode = TagMode.Free;
-                       else
-                               buttonswidget.Mode = TagMode.Predifined;
                }
                #endregion
+               
                #region Help
                protected virtual void OnHelpAction1Activated(object sender, System.EventArgs e)
                {
@@ -700,113 +331,8 @@ namespace LongoMatch.Gui
                }
                
                #endregion
-
-               protected override bool OnKeyPressEvent(EventKey evnt)
-               {
-                       Gdk.Key key = evnt.Key;
-                       Gdk.ModifierType modifier = evnt.State;
-                       bool ret;
-
-                       ret = base.OnKeyPressEvent(evnt);
-
-                       if(openedProject == null && !playercapturer.Opened)
-                               return ret;
-
-                       if(projectType != ProjectType.CaptureProject &&
-                          projectType != ProjectType.URICaptureProject &&
-                          projectType != ProjectType.FakeCaptureProject) {
-                               switch(key) {
-                               case Constants.SEEK_FORWARD:
-                                       if(modifier == Constants.STEP)
-                                               playercapturer.StepForward();
-                                       else
-                                               playercapturer.SeekToNextFrame(selectedTimeNode != null);
-                                       break;
-                               case Constants.SEEK_BACKWARD:
-                                       if(modifier == Constants.STEP)
-                                               playercapturer.StepBackward();
-                                       else
-                                               playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
-                                       break;
-                               case Constants.FRAMERATE_UP:
-                                       playercapturer.FramerateUp();
-                                       break;
-                               case Constants.FRAMERATE_DOWN:
-                                       playercapturer.FramerateDown();
-                                       break;
-                               case Constants.TOGGLE_PLAY:
-                                       playercapturer.TogglePlay();
-                                       break;
-                               }
-                       } else {
-                               switch(key) {
-                               case Constants.TOGGLE_PLAY:
-                                       playercapturer.TogglePause();
-                                       break;
-                               }
-                       }
-                       return ret;
-               }
-
-               protected virtual void OnTimeNodeSelected(Play play)
-               {
-                       SetTagsBoxVisibility (true);
-                       if (PlaySelectedEvent != null)
-                               PlaySelectedEvent(play);
-               }
-
-               protected virtual void OnSegmentClosedEvent()
-               {
-                       SetTagsBoxVisibility (false);
-                       timeline.SelectedTimeNode = null;
-                       selectedTimeNode = null;
-               }
-               
-               protected virtual void OnTick(object o, long currentTime, long streamLength,
-                       float currentPosition, bool seekable)
-               {
-                       if(currentTime != 0 && timeline != null && openedProject != null) {
-                               uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
-                               timeline.CurrentFrame = frame;
-                               guTimeline.CurrentFrame = frame;
-                       }
-                       gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
-                       buttonswidget.CurrentTime = new Time{MSeconds = (int)currentTime};
-               }
-               
-               protected virtual void OnUpdate(Version version, string URL) {
-                       LongoMatch.Gui.Dialog.UpdateDialog updater = new LongoMatch.Gui.Dialog.UpdateDialog();
-                       updater.Fill(version, URL);
-                       updater.TransientFor = this;
-                       updater.Run();
-                       updater.Destroy();
-               }
-
-               protected virtual void OnDrawingToolActionToggled(object sender, System.EventArgs e)
-               {
-                       drawingtoolbox1.Visible = DrawingToolAction.Active;
-                       drawingtoolbox1.DrawingVisibility = DrawingToolAction.Active;
-               }
-
-               protected override bool OnDeleteEvent(Gdk.Event evnt)
-               {
-                       CloseAndQuit();
-                       return true;
-               }
-
-               protected virtual void OnMultimediaError(object o, string message)
-               {
-                       MessagesHelpers.ErrorMessage (this,
-                               Catalog.GetString("The following error happened and" +
-                               " the current project will be closed:")+"\n" + message);
-                       EmitCloseOpenedProject(true);
-               }
-               
-               protected virtual void OnFilterUpdated()
-               {
-               }
                #endregion
-               
+
                #region Events
                
                private void EmitEditPreferences ()
@@ -815,98 +341,14 @@ namespace LongoMatch.Gui
                                EditPreferencesEvent();
                }
                
-               private void EmitPlaySelected(Play play)
-               {
-                       if (PlaySelectedEvent != null)
-                               PlaySelectedEvent(play);
-               }
-
-               private void EmitTimeNodeChanged(TimeNode tNode, object val)
-               {
-                       if (TimeNodeChanged != null)
-                               TimeNodeChanged(tNode, val);
-               }
-
-               private void EmitPlaysDeleted(List<Play> plays)
-               {
-                       if (PlaysDeletedEvent != null)
-                               PlaysDeletedEvent(plays);
-               }
-               
-               protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
-               {
-                       if(PlayCategoryChanged != null)
-                               PlayCategoryChanged(play, cat);
-               }
-
-               private void OnPlayListNodeAdded(List<Play> play)
-               {
-                       if (PlayListNodeAddedEvent != null)
-                               PlayListNodeAddedEvent(play);
-               }
-
-               private void EmitPlayListNodeSelected(PlayListPlay plNode)
-               {
-                       if (PlayListNodeSelectedEvent != null)
-                               PlayListNodeSelectedEvent(plNode);
-               }
-
-               private void EmitSnapshotSeries(Play play) {
-                       if (SnapshotSeriesEvent != null)
-                               SnapshotSeriesEvent (play);
-               }
-
-               private void EmitNewTagAtFrame(Category category, int frame) {
-                       if (NewTagAtFrameEvent != null)
-                               NewTagAtFrameEvent(category, frame);
-               }
-
-               private void EmitNewTag(Category category) {
-                       if (NewTagEvent != null)
-                               NewTagEvent(category);
-               }
-
-               private void EmitNewTagStart(Category category) {
-                       if (NewTagStartEvent != null)
-                               NewTagStartEvent (category);
-               }
-
-               private void EmitNewTagStop(Category category) {
-                       if (NewTagStopEvent != null)
-                               NewTagStopEvent (category);
-               }
-               
-               private void EmitNewTagCancel(Category category) {
-                       if (NewTagCancelEvent != null)
-                               NewTagCancelEvent (category);
-               }
-               
-               private void EmitRenderPlaylist(IPlayList playlist) {
-                       if (RenderPlaylistEvent != null)
-                               RenderPlaylistEvent(playlist);
-               }
-               
-               private void EmitTagPlay(Play play) {
-                       if (TagPlayEvent != null)
-                               TagPlayEvent (play);
-               }
-               
                private void EmitSaveProject() {
                        if (SaveProjectEvent != null)
                                SaveProjectEvent(openedProject, projectType);
                }
                
-               private void EmitNewProject() {
-                       if (NewProjectEvent != null)
-                               NewProjectEvent();
-               }
-
-               private void EmitCloseOpenedProject(bool save) {
+               private void EmitCloseOpenedProject() {
                        if (CloseOpenedProjectEvent != null)
-                               CloseOpenedProjectEvent(save);
-                       openedProject = null;
-                       projectType = ProjectType.None;
-                       ResetGUI();
+                               CloseOpenedProjectEvent ();
                }
                
                private void EmitImportProject(string name, string filterName, string filter,
@@ -915,11 +357,6 @@ namespace LongoMatch.Gui
                                ImportProjectEvent(name, filterName, filter, func, requiresNewFile);
                }
                
-               private void EmitOpenProject() {
-                       if(OpenProjectEvent != null)
-                               OpenProjectEvent();
-               }
-               
                private void EmitExportProject() {
                        if(ExportProjectEvent != null)
                                ExportProjectEvent();
@@ -951,58 +388,6 @@ namespace LongoMatch.Gui
                        if (ManageDatabasesEvent != null)
                                ManageDatabasesEvent();
                }
-               
-               private void EmitNewPlaylist() {
-                       if (NewPlaylistEvent != null)
-                               NewPlaylistEvent();
-               }
-               
-               private void EmitOpenPlaylist() {
-                       if (OpenPlaylistEvent != null)
-                               OpenPlaylistEvent();
-               }
-               
-               private void EmitSavePlaylist() {
-                       if (SavePlaylistEvent != null)
-                               SavePlaylistEvent();
-               }
-               
-               private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
-                       if (GameUnitEvent != null)
-                               GameUnitEvent(gameUnit, eType);
-               }
-               
-               private void EmitUnitAdded(GameUnit gameUnit, int frame) {
-                       if (UnitAdded != null)
-                               UnitAdded(gameUnit, frame);
-               }
-               
-               private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
-                       if (UnitDeleted != null)
-                               UnitDeleted(gameUnit, units);
-               }
-               
-               private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
-                       if (UnitSelected != null)
-                               UnitSelected(gameUnit, unit);
-               }
-               
-               private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
-                       if (UnitChanged != null)
-                               UnitChanged(gameUnit, unit, time);
-               }
-               
-               private void EmitKeyPressed(object sender, int key, int modifier) {
-                       if (KeyPressed != null)
-                               KeyPressed(sender, key, modifier);
-               }
-               
-               void EmitDuplicatePlay (Play play)
-               {
-                       if (DuplicatePlay != null)
-                               DuplicatePlay (play);
-               }
-               
                #endregion
        }
 }
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index a5a8124..a3c4204 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -200,6 +200,8 @@
     <File subtype="Code" buildaction="Compile" 
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs" />
     <File subtype="Code" buildaction="Compile" name="Gui/Component/ButtonTagger.cs" />
     <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.ButtonTagger.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/AnalysisComponent.cs" />
+    <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs" 
/>
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="atk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
@@ -218,4 +220,4 @@
     <ProjectReference type="Project" localcopy="True" refto="OxyPlotMono" />
   </References>
   <LanguageParameters ApplicationIcon="." CodePage="65001" ctype="CSharpProjectParameters" />
-</Project>
\ No newline at end of file
+</Project>
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
new file mode 100644
index 0000000..adc7ad8
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
@@ -0,0 +1,176 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+       public partial class AnalysisComponent
+       {
+               private global::Gtk.HPaned hpaned;
+               private global::Gtk.VBox leftbox;
+               private global::LongoMatch.Gui.Component.PlaysSelectionWidget playsSelection;
+               private global::Gtk.HPaned hpaned1;
+               private global::Gtk.VBox downbox;
+               private global::Gtk.HBox videowidgetsbox;
+               private global::LongoMatch.Gui.Component.DrawingToolBox drawingtoolbox1;
+               private global::LongoMatch.Gui.PlayerCapturerBin playercapturer;
+               private global::LongoMatch.Gui.Component.ButtonsWidget buttonswidget;
+               private global::LongoMatch.Gui.Component.GameUnitsTagger gameunitstaggerwidget1;
+               private global::Gtk.HBox righthbox;
+               private global::Gtk.VBox tagsvbox;
+               private global::LongoMatch.Gui.Component.PlaysCoordinatesTagger postagger;
+               private global::Gtk.Frame notesframe;
+               private global::Gtk.Alignment GtkAlignment22;
+               private global::LongoMatch.Gui.Component.NotesWidget notes;
+               private global::Gtk.Label GtkLabel31;
+               private global::LongoMatch.Gui.Component.PlayListWidget playlist;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.AnalysisComponent
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.AnalysisComponent";
+                       // Container child 
LongoMatch.Gui.Component.AnalysisComponent.Gtk.Container+ContainerChild
+                       this.hpaned = new global::Gtk.HPaned ();
+                       this.hpaned.CanFocus = true;
+                       this.hpaned.Name = "hpaned";
+                       this.hpaned.Position = 233;
+                       // Container child hpaned.Gtk.Paned+PanedChild
+                       this.leftbox = new global::Gtk.VBox ();
+                       this.leftbox.Name = "leftbox";
+                       this.leftbox.Spacing = 6;
+                       // Container child leftbox.Gtk.Box+BoxChild
+                       this.playsSelection = new global::LongoMatch.Gui.Component.PlaysSelectionWidget ();
+                       this.playsSelection.Events = ((global::Gdk.EventMask)(256));
+                       this.playsSelection.Name = "playsSelection";
+                       this.leftbox.Add (this.playsSelection);
+                       global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.leftbox 
[this.playsSelection]));
+                       w1.Position = 0;
+                       this.hpaned.Add (this.leftbox);
+                       global::Gtk.Paned.PanedChild w2 = ((global::Gtk.Paned.PanedChild)(this.hpaned 
[this.leftbox]));
+                       w2.Resize = false;
+                       // Container child hpaned.Gtk.Paned+PanedChild
+                       this.hpaned1 = new global::Gtk.HPaned ();
+                       this.hpaned1.CanFocus = true;
+                       this.hpaned1.Name = "hpaned1";
+                       this.hpaned1.Position = 1160;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.downbox = new global::Gtk.VBox ();
+                       this.downbox.Name = "downbox";
+                       this.downbox.Spacing = 6;
+                       // Container child downbox.Gtk.Box+BoxChild
+                       this.videowidgetsbox = new global::Gtk.HBox ();
+                       this.videowidgetsbox.Name = "videowidgetsbox";
+                       this.videowidgetsbox.Spacing = 6;
+                       // Container child videowidgetsbox.Gtk.Box+BoxChild
+                       this.drawingtoolbox1 = new global::LongoMatch.Gui.Component.DrawingToolBox ();
+                       this.drawingtoolbox1.Events = ((global::Gdk.EventMask)(256));
+                       this.drawingtoolbox1.Name = "drawingtoolbox1";
+                       this.videowidgetsbox.Add (this.drawingtoolbox1);
+                       global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox 
[this.drawingtoolbox1]));
+                       w3.Position = 0;
+                       w3.Expand = false;
+                       w3.Fill = false;
+                       // Container child videowidgetsbox.Gtk.Box+BoxChild
+                       this.playercapturer = new global::LongoMatch.Gui.PlayerCapturerBin ();
+                       this.playercapturer.Events = ((global::Gdk.EventMask)(256));
+                       this.playercapturer.Name = "playercapturer";
+                       this.playercapturer.Detached = false;
+                       this.playercapturer.ExpandLogo = false;
+                       this.playercapturer.Rate = 0F;
+                       this.videowidgetsbox.Add (this.playercapturer);
+                       global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox 
[this.playercapturer]));
+                       w4.Position = 1;
+                       this.downbox.Add (this.videowidgetsbox);
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.videowidgetsbox]));
+                       w5.Position = 0;
+                       // Container child downbox.Gtk.Box+BoxChild
+                       this.buttonswidget = new global::LongoMatch.Gui.Component.ButtonsWidget ();
+                       this.buttonswidget.Events = ((global::Gdk.EventMask)(256));
+                       this.buttonswidget.Name = "buttonswidget";
+                       this.downbox.Add (this.buttonswidget);
+                       global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.buttonswidget]));
+                       w6.Position = 1;
+                       w6.Expand = false;
+                       // Container child downbox.Gtk.Box+BoxChild
+                       this.gameunitstaggerwidget1 = new global::LongoMatch.Gui.Component.GameUnitsTagger ();
+                       this.gameunitstaggerwidget1.Events = ((global::Gdk.EventMask)(256));
+                       this.gameunitstaggerwidget1.Name = "gameunitstaggerwidget1";
+                       this.downbox.Add (this.gameunitstaggerwidget1);
+                       global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.gameunitstaggerwidget1]));
+                       w7.Position = 2;
+                       w7.Expand = false;
+                       this.hpaned1.Add (this.downbox);
+                       global::Gtk.Paned.PanedChild w8 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.downbox]));
+                       w8.Resize = false;
+                       w8.Shrink = false;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.righthbox = new global::Gtk.HBox ();
+                       this.righthbox.WidthRequest = 100;
+                       this.righthbox.Name = "righthbox";
+                       this.righthbox.Spacing = 6;
+                       // Container child righthbox.Gtk.Box+BoxChild
+                       this.tagsvbox = new global::Gtk.VBox ();
+                       this.tagsvbox.WidthRequest = 100;
+                       this.tagsvbox.Name = "tagsvbox";
+                       this.tagsvbox.Spacing = 6;
+                       // Container child tagsvbox.Gtk.Box+BoxChild
+                       this.postagger = new global::LongoMatch.Gui.Component.PlaysCoordinatesTagger ();
+                       this.postagger.Events = ((global::Gdk.EventMask)(256));
+                       this.postagger.Name = "postagger";
+                       this.tagsvbox.Add (this.postagger);
+                       global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.tagsvbox 
[this.postagger]));
+                       w9.Position = 0;
+                       // Container child tagsvbox.Gtk.Box+BoxChild
+                       this.notesframe = new global::Gtk.Frame ();
+                       this.notesframe.Name = "notesframe";
+                       this.notesframe.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child notesframe.Gtk.Container+ContainerChild
+                       this.GtkAlignment22 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment22.Name = "GtkAlignment22";
+                       this.GtkAlignment22.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment22.Gtk.Container+ContainerChild
+                       this.notes = new global::LongoMatch.Gui.Component.NotesWidget ();
+                       this.notes.Events = ((global::Gdk.EventMask)(256));
+                       this.notes.Name = "notes";
+                       this.GtkAlignment22.Add (this.notes);
+                       this.notesframe.Add (this.GtkAlignment22);
+                       this.GtkLabel31 = new global::Gtk.Label ();
+                       this.GtkLabel31.Name = "GtkLabel31";
+                       this.GtkLabel31.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Notes</b>");
+                       this.GtkLabel31.UseMarkup = true;
+                       this.notesframe.LabelWidget = this.GtkLabel31;
+                       this.tagsvbox.Add (this.notesframe);
+                       global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.tagsvbox 
[this.notesframe]));
+                       w12.Position = 1;
+                       this.righthbox.Add (this.tagsvbox);
+                       global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.righthbox 
[this.tagsvbox]));
+                       w13.Position = 0;
+                       // Container child righthbox.Gtk.Box+BoxChild
+                       this.playlist = new global::LongoMatch.Gui.Component.PlayListWidget ();
+                       this.playlist.WidthRequest = 100;
+                       this.playlist.Events = ((global::Gdk.EventMask)(256));
+                       this.playlist.Name = "playlist";
+                       this.righthbox.Add (this.playlist);
+                       global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.righthbox 
[this.playlist]));
+                       w14.Position = 1;
+                       this.hpaned1.Add (this.righthbox);
+                       global::Gtk.Paned.PanedChild w15 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.righthbox]));
+                       w15.Resize = false;
+                       w15.Shrink = false;
+                       this.hpaned.Add (this.hpaned1);
+                       global::Gtk.Paned.PanedChild w16 = ((global::Gtk.Paned.PanedChild)(this.hpaned 
[this.hpaned1]));
+                       w16.Shrink = false;
+                       this.Add (this.hpaned);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.leftbox.Hide ();
+                       this.drawingtoolbox1.Hide ();
+                       this.buttonswidget.Hide ();
+                       this.tagsvbox.Hide ();
+                       this.playlist.Hide ();
+                       this.righthbox.Hide ();
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
index 9d59a08..ad9cc26 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
@@ -31,7 +31,6 @@ namespace LongoMatch.Gui.Component.Stats
                        this.historadiobutton = new global::Gtk.RadioButton 
(global::Mono.Unix.Catalog.GetString ("Histogram"));
                        this.historadiobutton.CanFocus = true;
                        this.historadiobutton.Name = "historadiobutton";
-                       this.historadiobutton.Active = true;
                        this.historadiobutton.DrawIndicator = true;
                        this.historadiobutton.UseUnderline = true;
                        this.historadiobutton.Group = new global::GLib.SList (global::System.IntPtr.Zero);
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..01e9e0a
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
@@ -0,0 +1,197 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+       public partial class SubcategoiesTagsEditor
+       {
+               private global::Gtk.VBox vbox2;
+               private global::Gtk.Table table1;
+               private global::Gtk.CheckButton fastcheckbutton;
+               private global::Gtk.Label label1;
+               private global::Gtk.CheckButton multicheckbutton;
+               private global::Gtk.Entry nameentry;
+               private global::Gtk.Frame frame1;
+               private global::Gtk.Alignment GtkAlignment2;
+               private global::Gtk.VBox vbox3;
+               private global::Gtk.ScrolledWindow scrolledwindow1;
+               private global::Gtk.VBox tagsbox;
+               private global::Gtk.HBox hbox1;
+               private global::Gtk.Entry tagentry;
+               private global::Gtk.Button addtagbutton;
+               private global::Gtk.Button deletebutton;
+               private global::Gtk.Label GtkLabel4;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.SubcategoiesTagsEditor
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.SubcategoiesTagsEditor";
+                       // Container child 
LongoMatch.Gui.Component.SubcategoiesTagsEditor.Gtk.Container+ContainerChild
+                       this.vbox2 = new global::Gtk.VBox ();
+                       this.vbox2.Name = "vbox2";
+                       this.vbox2.Spacing = 6;
+                       // Container child vbox2.Gtk.Box+BoxChild
+                       this.table1 = new global::Gtk.Table (((uint)(2)), ((uint)(2)), false);
+                       this.table1.Name = "table1";
+                       this.table1.RowSpacing = ((uint)(6));
+                       this.table1.ColumnSpacing = ((uint)(6));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.fastcheckbutton = new global::Gtk.CheckButton ();
+                       this.fastcheckbutton.TooltipMarkup = "When this option is selected, the subcategory 
can be tagged right after creating a new play";
+                       this.fastcheckbutton.CanFocus = true;
+                       this.fastcheckbutton.Name = "fastcheckbutton";
+                       this.fastcheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Quick tag");
+                       this.fastcheckbutton.Active = true;
+                       this.fastcheckbutton.DrawIndicator = true;
+                       this.fastcheckbutton.UseUnderline = true;
+                       this.table1.Add (this.fastcheckbutton);
+                       global::Gtk.Table.TableChild w1 = ((global::Gtk.Table.TableChild)(this.table1 
[this.fastcheckbutton]));
+                       w1.TopAttach = ((uint)(1));
+                       w1.BottomAttach = ((uint)(2));
+                       w1.LeftAttach = ((uint)(1));
+                       w1.RightAttach = ((uint)(2));
+                       w1.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w1.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label1 = new global::Gtk.Label ();
+                       this.label1.Name = "label1";
+                       this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("Subcategory name:");
+                       this.table1.Add (this.label1);
+                       global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label1]));
+                       w2.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.multicheckbutton = new global::Gtk.CheckButton ();
+                       this.multicheckbutton.TooltipMarkup = "This options allows you to select multiple 
tags instead of just one";
+                       this.multicheckbutton.CanFocus = true;
+                       this.multicheckbutton.Name = "multicheckbutton";
+                       this.multicheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Allow multiple 
selections");
+                       this.multicheckbutton.Active = true;
+                       this.multicheckbutton.DrawIndicator = true;
+                       this.multicheckbutton.UseUnderline = true;
+                       this.table1.Add (this.multicheckbutton);
+                       global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1 
[this.multicheckbutton]));
+                       w3.TopAttach = ((uint)(1));
+                       w3.BottomAttach = ((uint)(2));
+                       w3.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w3.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.nameentry = new global::Gtk.Entry ();
+                       this.nameentry.CanFocus = true;
+                       this.nameentry.Name = "nameentry";
+                       this.nameentry.Text = global::Mono.Unix.Catalog.GetString ("Goal type");
+                       this.nameentry.IsEditable = true;
+                       this.nameentry.InvisibleChar = '•';
+                       this.table1.Add (this.nameentry);
+                       global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 
[this.nameentry]));
+                       w4.LeftAttach = ((uint)(1));
+                       w4.RightAttach = ((uint)(2));
+                       w4.YOptions = ((global::Gtk.AttachOptions)(4));
+                       this.vbox2.Add (this.table1);
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.table1]));
+                       w5.Position = 0;
+                       w5.Expand = false;
+                       w5.Fill = false;
+                       // Container child vbox2.Gtk.Box+BoxChild
+                       this.frame1 = new global::Gtk.Frame ();
+                       this.frame1.Name = "frame1";
+                       this.frame1.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child frame1.Gtk.Container+ContainerChild
+                       this.GtkAlignment2 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment2.Name = "GtkAlignment2";
+                       this.GtkAlignment2.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment2.Gtk.Container+ContainerChild
+                       this.vbox3 = new global::Gtk.VBox ();
+                       this.vbox3.Name = "vbox3";
+                       this.vbox3.Spacing = 6;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
+                       this.scrolledwindow1.CanFocus = true;
+                       this.scrolledwindow1.Name = "scrolledwindow1";
+                       // Container child scrolledwindow1.Gtk.Container+ContainerChild
+                       global::Gtk.Viewport w6 = new global::Gtk.Viewport ();
+                       w6.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child GtkViewport.Gtk.Container+ContainerChild
+                       this.tagsbox = new global::Gtk.VBox ();
+                       this.tagsbox.Name = "tagsbox";
+                       this.tagsbox.Spacing = 6;
+                       w6.Add (this.tagsbox);
+                       this.scrolledwindow1.Add (w6);
+                       this.vbox3.Add (this.scrolledwindow1);
+                       global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox3 
[this.scrolledwindow1]));
+                       w9.Position = 0;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.hbox1 = new global::Gtk.HBox ();
+                       this.hbox1.Name = "hbox1";
+                       this.hbox1.Spacing = 6;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.tagentry = new global::Gtk.Entry ();
+                       this.tagentry.CanFocus = true;
+                       this.tagentry.Name = "tagentry";
+                       this.tagentry.Text = global::Mono.Unix.Catalog.GetString ("Penalty");
+                       this.tagentry.IsEditable = true;
+                       this.tagentry.InvisibleChar = '•';
+                       this.hbox1.Add (this.tagentry);
+                       global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.tagentry]));
+                       w10.Position = 0;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.addtagbutton = new global::Gtk.Button ();
+                       this.addtagbutton.CanFocus = true;
+                       this.addtagbutton.Name = "addtagbutton";
+                       this.addtagbutton.UseUnderline = true;
+                       // Container child addtagbutton.Gtk.Container+ContainerChild
+                       global::Gtk.Alignment w11 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+                       // Container child GtkAlignment.Gtk.Container+ContainerChild
+                       global::Gtk.HBox w12 = new global::Gtk.HBox ();
+                       w12.Spacing = 2;
+                       // Container child GtkHBox.Gtk.Container+ContainerChild
+                       global::Gtk.Image w13 = new global::Gtk.Image ();
+                       w13.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-add", 
global::Gtk.IconSize.Menu);
+                       w12.Add (w13);
+                       // Container child GtkHBox.Gtk.Container+ContainerChild
+                       global::Gtk.Label w15 = new global::Gtk.Label ();
+                       w15.LabelProp = global::Mono.Unix.Catalog.GetString ("Add tag");
+                       w15.UseUnderline = true;
+                       w12.Add (w15);
+                       w11.Add (w12);
+                       this.addtagbutton.Add (w11);
+                       this.hbox1.Add (this.addtagbutton);
+                       global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.addtagbutton]));
+                       w19.Position = 1;
+                       w19.Expand = false;
+                       w19.Fill = false;
+                       this.vbox3.Add (this.hbox1);
+                       global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox1]));
+                       w20.Position = 1;
+                       w20.Expand = false;
+                       w20.Fill = false;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.deletebutton = new global::Gtk.Button ();
+                       this.deletebutton.CanFocus = true;
+                       this.deletebutton.Name = "deletebutton";
+                       this.deletebutton.UseStock = true;
+                       this.deletebutton.UseUnderline = true;
+                       this.deletebutton.Label = "gtk-remove";
+                       this.vbox3.Add (this.deletebutton);
+                       global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox3 
[this.deletebutton]));
+                       w21.Position = 2;
+                       w21.Expand = false;
+                       w21.Fill = false;
+                       this.GtkAlignment2.Add (this.vbox3);
+                       this.frame1.Add (this.GtkAlignment2);
+                       this.GtkLabel4 = new global::Gtk.Label ();
+                       this.GtkLabel4.Name = "GtkLabel4";
+                       this.GtkLabel4.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Tags</b>");
+                       this.GtkLabel4.UseMarkup = true;
+                       this.frame1.LabelWidget = this.GtkLabel4;
+                       this.vbox2.Add (this.frame1);
+                       global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.frame1]));
+                       w24.Position = 1;
+                       this.Add (this.vbox2);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
index fc078be..e8b7286 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
@@ -25,7 +25,6 @@ namespace LongoMatch.Gui
                private global::Gtk.Action TeamsTemplatesManagerAction;
                private global::Gtk.ToggleAction HideAllWidgetsAction;
                private global::Gtk.Action HelpAction1;
-               private global::Gtk.ToggleAction DrawingToolAction;
                private global::Gtk.Action ImportProjectAction;
                private global::Gtk.RadioAction ManualTaggingViewAction;
                private global::Gtk.RadioAction GameUnitsViewAction;
@@ -43,24 +42,7 @@ namespace LongoMatch.Gui
                private global::Gtk.VBox vbox1;
                private global::Gtk.VBox menubox;
                private global::Gtk.MenuBar menubar1;
-               private global::Gtk.HPaned hpaned;
-               private global::Gtk.VBox leftbox;
-               private global::LongoMatch.Gui.Component.PlaysSelectionWidget playsSelection;
-               private global::Gtk.HPaned hpaned1;
-               private global::Gtk.VBox downbox;
-               private global::Gtk.HBox videowidgetsbox;
-               private global::LongoMatch.Gui.Component.DrawingToolBox drawingtoolbox1;
-               private global::LongoMatch.Gui.PlayerCapturerBin playercapturer;
-               private global::LongoMatch.Gui.Component.ButtonsWidget buttonswidget;
-               private global::LongoMatch.Gui.Component.GameUnitsTagger gameunitstaggerwidget1;
-               private global::Gtk.HBox righthbox;
-               private global::Gtk.VBox tagsvbox;
-               private global::LongoMatch.Gui.Component.PlaysCoordinatesTagger postagger;
-               private global::Gtk.Frame notesframe;
-               private global::Gtk.Alignment GtkAlignment22;
-               private global::LongoMatch.Gui.Component.NotesWidget notes;
-               private global::Gtk.Label GtkLabel31;
-               private global::LongoMatch.Gui.Component.PlayListWidget playlist;
+               private global::Gtk.HBox centralbox;
                private global::Gtk.Statusbar statusbar1;
                private global::LongoMatch.Gui.Component.RenderingStateBar renderingstatebar1;
                
@@ -139,9 +121,6 @@ namespace LongoMatch.Gui
                        this.HelpAction1 = new global::Gtk.Action ("HelpAction1", 
global::Mono.Unix.Catalog.GetString ("_Help"), null, "gtk-help");
                        this.HelpAction1.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Help");
                        w1.Add (this.HelpAction1, null);
-                       this.DrawingToolAction = new global::Gtk.ToggleAction ("DrawingToolAction", 
global::Mono.Unix.Catalog.GetString ("_Drawing Tool"), null, null);
-                       this.DrawingToolAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Drawing 
Tool");
-                       w1.Add (this.DrawingToolAction, "<Control>d");
                        this.ImportProjectAction = new global::Gtk.Action ("ImportProjectAction", 
global::Mono.Unix.Catalog.GetString ("_Import Project"), null, "stock-import");
                        this.ImportProjectAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Import 
Project");
                        w1.Add (this.ImportProjectAction, "<Control>i");
@@ -220,139 +199,12 @@ namespace LongoMatch.Gui
                        w3.Expand = false;
                        w3.Fill = false;
                        // Container child vbox1.Gtk.Box+BoxChild
-                       this.hpaned = new global::Gtk.HPaned ();
-                       this.hpaned.CanFocus = true;
-                       this.hpaned.Name = "hpaned";
-                       this.hpaned.Position = 243;
-                       // Container child hpaned.Gtk.Paned+PanedChild
-                       this.leftbox = new global::Gtk.VBox ();
-                       this.leftbox.Name = "leftbox";
-                       this.leftbox.Spacing = 6;
-                       // Container child leftbox.Gtk.Box+BoxChild
-                       this.playsSelection = new global::LongoMatch.Gui.Component.PlaysSelectionWidget ();
-                       this.playsSelection.Events = ((global::Gdk.EventMask)(256));
-                       this.playsSelection.Name = "playsSelection";
-                       this.leftbox.Add (this.playsSelection);
-                       global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.leftbox 
[this.playsSelection]));
-                       w4.Position = 0;
-                       this.hpaned.Add (this.leftbox);
-                       global::Gtk.Paned.PanedChild w5 = ((global::Gtk.Paned.PanedChild)(this.hpaned 
[this.leftbox]));
-                       w5.Resize = false;
-                       // Container child hpaned.Gtk.Paned+PanedChild
-                       this.hpaned1 = new global::Gtk.HPaned ();
-                       this.hpaned1.CanFocus = true;
-                       this.hpaned1.Name = "hpaned1";
-                       this.hpaned1.Position = 952;
-                       // Container child hpaned1.Gtk.Paned+PanedChild
-                       this.downbox = new global::Gtk.VBox ();
-                       this.downbox.Name = "downbox";
-                       this.downbox.Spacing = 6;
-                       // Container child downbox.Gtk.Box+BoxChild
-                       this.videowidgetsbox = new global::Gtk.HBox ();
-                       this.videowidgetsbox.Name = "videowidgetsbox";
-                       this.videowidgetsbox.Spacing = 6;
-                       // Container child videowidgetsbox.Gtk.Box+BoxChild
-                       this.drawingtoolbox1 = new global::LongoMatch.Gui.Component.DrawingToolBox ();
-                       this.drawingtoolbox1.Events = ((global::Gdk.EventMask)(256));
-                       this.drawingtoolbox1.Name = "drawingtoolbox1";
-                       this.videowidgetsbox.Add (this.drawingtoolbox1);
-                       global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox 
[this.drawingtoolbox1]));
-                       w6.Position = 0;
-                       w6.Expand = false;
-                       w6.Fill = false;
-                       // Container child videowidgetsbox.Gtk.Box+BoxChild
-                       this.playercapturer = new global::LongoMatch.Gui.PlayerCapturerBin ();
-                       this.playercapturer.Events = ((global::Gdk.EventMask)(256));
-                       this.playercapturer.Name = "playercapturer";
-                       this.playercapturer.Detached = false;
-                       this.playercapturer.ExpandLogo = false;
-                       this.playercapturer.Rate = 0F;
-                       this.videowidgetsbox.Add (this.playercapturer);
-                       global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox 
[this.playercapturer]));
-                       w7.Position = 1;
-                       this.downbox.Add (this.videowidgetsbox);
-                       global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.videowidgetsbox]));
-                       w8.Position = 0;
-                       // Container child downbox.Gtk.Box+BoxChild
-                       this.buttonswidget = new global::LongoMatch.Gui.Component.ButtonsWidget ();
-                       this.buttonswidget.Events = ((global::Gdk.EventMask)(256));
-                       this.buttonswidget.Name = "buttonswidget";
-                       this.downbox.Add (this.buttonswidget);
-                       global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.buttonswidget]));
-                       w9.Position = 1;
-                       w9.Expand = false;
-                       // Container child downbox.Gtk.Box+BoxChild
-                       this.gameunitstaggerwidget1 = new global::LongoMatch.Gui.Component.GameUnitsTagger ();
-                       this.gameunitstaggerwidget1.Events = ((global::Gdk.EventMask)(256));
-                       this.gameunitstaggerwidget1.Name = "gameunitstaggerwidget1";
-                       this.downbox.Add (this.gameunitstaggerwidget1);
-                       global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.downbox 
[this.gameunitstaggerwidget1]));
-                       w10.Position = 2;
-                       w10.Expand = false;
-                       this.hpaned1.Add (this.downbox);
-                       global::Gtk.Paned.PanedChild w11 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.downbox]));
-                       w11.Resize = false;
-                       w11.Shrink = false;
-                       // Container child hpaned1.Gtk.Paned+PanedChild
-                       this.righthbox = new global::Gtk.HBox ();
-                       this.righthbox.WidthRequest = 100;
-                       this.righthbox.Name = "righthbox";
-                       this.righthbox.Spacing = 6;
-                       // Container child righthbox.Gtk.Box+BoxChild
-                       this.tagsvbox = new global::Gtk.VBox ();
-                       this.tagsvbox.WidthRequest = 100;
-                       this.tagsvbox.Name = "tagsvbox";
-                       this.tagsvbox.Spacing = 6;
-                       // Container child tagsvbox.Gtk.Box+BoxChild
-                       this.postagger = new global::LongoMatch.Gui.Component.PlaysCoordinatesTagger ();
-                       this.postagger.Events = ((global::Gdk.EventMask)(256));
-                       this.postagger.Name = "postagger";
-                       this.tagsvbox.Add (this.postagger);
-                       global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.tagsvbox 
[this.postagger]));
-                       w12.Position = 0;
-                       // Container child tagsvbox.Gtk.Box+BoxChild
-                       this.notesframe = new global::Gtk.Frame ();
-                       this.notesframe.Name = "notesframe";
-                       this.notesframe.ShadowType = ((global::Gtk.ShadowType)(0));
-                       // Container child notesframe.Gtk.Container+ContainerChild
-                       this.GtkAlignment22 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
-                       this.GtkAlignment22.Name = "GtkAlignment22";
-                       this.GtkAlignment22.LeftPadding = ((uint)(12));
-                       // Container child GtkAlignment22.Gtk.Container+ContainerChild
-                       this.notes = new global::LongoMatch.Gui.Component.NotesWidget ();
-                       this.notes.Events = ((global::Gdk.EventMask)(256));
-                       this.notes.Name = "notes";
-                       this.GtkAlignment22.Add (this.notes);
-                       this.notesframe.Add (this.GtkAlignment22);
-                       this.GtkLabel31 = new global::Gtk.Label ();
-                       this.GtkLabel31.Name = "GtkLabel31";
-                       this.GtkLabel31.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Notes</b>");
-                       this.GtkLabel31.UseMarkup = true;
-                       this.notesframe.LabelWidget = this.GtkLabel31;
-                       this.tagsvbox.Add (this.notesframe);
-                       global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.tagsvbox 
[this.notesframe]));
-                       w15.Position = 1;
-                       this.righthbox.Add (this.tagsvbox);
-                       global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.righthbox 
[this.tagsvbox]));
-                       w16.Position = 0;
-                       // Container child righthbox.Gtk.Box+BoxChild
-                       this.playlist = new global::LongoMatch.Gui.Component.PlayListWidget ();
-                       this.playlist.WidthRequest = 100;
-                       this.playlist.Events = ((global::Gdk.EventMask)(256));
-                       this.playlist.Name = "playlist";
-                       this.righthbox.Add (this.playlist);
-                       global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.righthbox 
[this.playlist]));
-                       w17.Position = 1;
-                       this.hpaned1.Add (this.righthbox);
-                       global::Gtk.Paned.PanedChild w18 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.righthbox]));
-                       w18.Resize = false;
-                       w18.Shrink = false;
-                       this.hpaned.Add (this.hpaned1);
-                       global::Gtk.Paned.PanedChild w19 = ((global::Gtk.Paned.PanedChild)(this.hpaned 
[this.hpaned1]));
-                       w19.Shrink = false;
-                       this.vbox1.Add (this.hpaned);
-                       global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.hpaned]));
-                       w20.Position = 1;
+                       this.centralbox = new global::Gtk.HBox ();
+                       this.centralbox.Name = "centralbox";
+                       this.centralbox.Spacing = 6;
+                       this.vbox1.Add (this.centralbox);
+                       global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1 
[this.centralbox]));
+                       w4.Position = 1;
                        // Container child vbox1.Gtk.Box+BoxChild
                        this.statusbar1 = new global::Gtk.Statusbar ();
                        this.statusbar1.Name = "statusbar1";
@@ -363,27 +215,21 @@ namespace LongoMatch.Gui
                        this.renderingstatebar1.Name = "renderingstatebar1";
                        this.renderingstatebar1.Fraction = 0;
                        this.statusbar1.Add (this.renderingstatebar1);
-                       global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.statusbar1 
[this.renderingstatebar1]));
-                       w21.Position = 2;
-                       w21.Expand = false;
-                       w21.Fill = false;
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.statusbar1 
[this.renderingstatebar1]));
+                       w5.Position = 2;
+                       w5.Expand = false;
+                       w5.Fill = false;
                        this.vbox1.Add (this.statusbar1);
-                       global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.vbox1 
[this.statusbar1]));
-                       w22.Position = 2;
-                       w22.Expand = false;
-                       w22.Fill = false;
+                       global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox1 
[this.statusbar1]));
+                       w6.Position = 2;
+                       w6.Expand = false;
+                       w6.Fill = false;
                        this.Add (this.vbox1);
                        if ((this.Child != null)) {
                                this.Child.ShowAll ();
                        }
                        this.DefaultWidth = 1503;
                        this.DefaultHeight = 686;
-                       this.leftbox.Hide ();
-                       this.drawingtoolbox1.Hide ();
-                       this.buttonswidget.Hide ();
-                       this.tagsvbox.Hide ();
-                       this.playlist.Hide ();
-                       this.righthbox.Hide ();
                        this.renderingstatebar1.Hide ();
                        this.Show ();
                        this.NewPojectAction.Activated += new global::System.EventHandler 
(this.OnNewActivated);
@@ -395,7 +241,6 @@ namespace LongoMatch.Gui
                        this.AboutAction.Activated += new global::System.EventHandler 
(this.OnAboutActionActivated);
                        this.HideAllWidgetsAction.Toggled += new global::System.EventHandler 
(this.OnHideAllWidgetsActionToggled);
                        this.HelpAction1.Activated += new global::System.EventHandler 
(this.OnHelpAction1Activated);
-                       this.DrawingToolAction.Toggled += new global::System.EventHandler 
(this.OnDrawingToolActionToggled);
                        this.ManualTaggingViewAction.Toggled += new global::System.EventHandler 
(this.OnViewToggled);
                        this.GameUnitsViewAction.Toggled += new global::System.EventHandler 
(this.OnViewToggled);
                        this.dialogInfoAction.Activated += new global::System.EventHandler 
(this.OnDialogInfoActionActivated);
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 8ecfafa..e4c35fd 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -1704,15 +1704,6 @@
         <property name="StockId">gtk-help</property>
         <signal name="Activated" handler="OnHelpAction1Activated" />
       </action>
-      <action id="DrawingToolAction">
-        <property name="Type">Toggle</property>
-        <property name="Accelerator">&lt;Control&gt;d</property>
-        <property name="Label" translatable="yes">_Drawing Tool</property>
-        <property name="ShortLabel" translatable="yes">Drawing Tool</property>
-        <property name="DrawAsRadio">False</property>
-        <property name="Active">False</property>
-        <signal name="Toggled" handler="OnDrawingToolActionToggled" />
-      </action>
       <action id="ImportProjectAction">
         <property name="Type">Action</property>
         <property name="Accelerator">&lt;Control&gt;i</property>
@@ -1883,193 +1874,16 @@
           </packing>
         </child>
         <child>
-          <widget class="Gtk.HPaned" id="hpaned">
+          <widget class="Gtk.HBox" id="centralbox">
             <property name="MemberName" />
-            <property name="CanFocus">True</property>
-            <property name="Position">243</property>
-            <child>
-              <widget class="Gtk.VBox" id="leftbox">
-                <property name="MemberName" />
-                <property name="Visible">False</property>
-                <property name="Spacing">6</property>
-                <child>
-                  <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
-                    <property name="MemberName" />
-                    <property name="Events">ButtonPressMask</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">0</property>
-                    <property name="AutoSize">True</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="Resize">False</property>
-              </packing>
-            </child>
+            <property name="Spacing">6</property>
             <child>
-              <widget class="Gtk.HPaned" id="hpaned1">
-                <property name="MemberName" />
-                <property name="CanFocus">True</property>
-                <property name="Position">952</property>
-                <child>
-                  <widget class="Gtk.VBox" id="downbox">
-                    <property name="MemberName" />
-                    <property name="Spacing">6</property>
-                    <child>
-                      <widget class="Gtk.HBox" id="videowidgetsbox">
-                        <property name="MemberName" />
-                        <property name="Spacing">6</property>
-                        <child>
-                          <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
-                            <property name="MemberName" />
-                            <property name="Visible">False</property>
-                            <property name="Events">ButtonPressMask</property>
-                          </widget>
-                          <packing>
-                            <property name="Position">0</property>
-                            <property name="AutoSize">True</property>
-                            <property name="Expand">False</property>
-                            <property name="Fill">False</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
-                            <property name="MemberName" />
-                            <property name="Events">ButtonPressMask</property>
-                            <property name="Detached">False</property>
-                            <property name="ExpandLogo">False</property>
-                            <property name="Rate">0</property>
-                          </widget>
-                          <packing>
-                            <property name="Position">1</property>
-                            <property name="AutoSize">False</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="Position">0</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
-                        <property name="MemberName" />
-                        <property name="Visible">False</property>
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">1</property>
-                        <property name="AutoSize">False</property>
-                        <property name="Expand">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
-                        <property name="MemberName" />
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">2</property>
-                        <property name="AutoSize">False</property>
-                        <property name="Expand">False</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="Resize">False</property>
-                    <property name="Shrink">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="Gtk.HBox" id="righthbox">
-                    <property name="MemberName" />
-                    <property name="WidthRequest">100</property>
-                    <property name="Visible">False</property>
-                    <property name="Spacing">6</property>
-                    <child>
-                      <widget class="Gtk.VBox" id="tagsvbox">
-                        <property name="MemberName" />
-                        <property name="WidthRequest">100</property>
-                        <property name="Visible">False</property>
-                        <property name="Spacing">6</property>
-                        <child>
-                          <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
-                            <property name="MemberName" />
-                            <property name="Events">ButtonPressMask</property>
-                          </widget>
-                          <packing>
-                            <property name="Position">0</property>
-                            <property name="AutoSize">True</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="Gtk.Frame" id="notesframe">
-                            <property name="MemberName" />
-                            <property name="ShadowType">None</property>
-                            <child>
-                              <widget class="Gtk.Alignment" id="GtkAlignment22">
-                                <property name="MemberName" />
-                                <property name="Xalign">0</property>
-                                <property name="Yalign">0</property>
-                                <property name="LeftPadding">12</property>
-                                <child>
-                                  <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
-                                    <property name="MemberName" />
-                                    <property name="Events">ButtonPressMask</property>
-                                  </widget>
-                                </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="Gtk.Label" id="GtkLabel31">
-                                <property name="MemberName" />
-                                <property name="LabelProp" 
translatable="yes">&lt;b&gt;Notes&lt;/b&gt;</property>
-                                <property name="UseMarkup">True</property>
-                              </widget>
-                              <packing>
-                                <property name="type">label_item</property>
-                              </packing>
-                            </child>
-                          </widget>
-                          <packing>
-                            <property name="Position">1</property>
-                            <property name="AutoSize">False</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="Position">0</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
-                        <property name="MemberName" />
-                        <property name="WidthRequest">100</property>
-                        <property name="Visible">False</property>
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">1</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="Resize">False</property>
-                    <property name="Shrink">False</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="Shrink">False</property>
-              </packing>
+              <placeholder />
             </child>
           </widget>
           <packing>
             <property name="Position">1</property>
-            <property name="AutoSize">False</property>
+            <property name="AutoSize">True</property>
           </packing>
         </child>
         <child>
@@ -8844,7 +8658,6 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
                 <property name="MemberName" />
                 <property name="CanFocus">True</property>
                 <property name="Label" translatable="yes">Histogram</property>
-                <property name="Active">True</property>
                 <property name="DrawIndicator">True</property>
                 <property name="HasLabel">True</property>
                 <property name="UseUnderline">True</property>
@@ -9247,6 +9060,196 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
       </widget>
     </child>
   </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.AnalysisComponent" design-size="1524 648">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.HPaned" id="hpaned">
+        <property name="MemberName" />
+        <property name="CanFocus">True</property>
+        <property name="Position">233</property>
+        <child>
+          <widget class="Gtk.VBox" id="leftbox">
+            <property name="MemberName" />
+            <property name="Visible">False</property>
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
+                <property name="MemberName" />
+                <property name="Events">ButtonPressMask</property>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Resize">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.HPaned" id="hpaned1">
+            <property name="MemberName" />
+            <property name="CanFocus">True</property>
+            <property name="Position">1160</property>
+            <child>
+              <widget class="Gtk.VBox" id="downbox">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.HBox" id="videowidgetsbox">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
+                        <property name="MemberName" />
+                        <property name="Visible">False</property>
+                        <property name="Events">ButtonPressMask</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
+                        <property name="MemberName" />
+                        <property name="Events">ButtonPressMask</property>
+                        <property name="Detached">False</property>
+                        <property name="ExpandLogo">False</property>
+                        <property name="Rate">0</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
+                    <property name="MemberName" />
+                    <property name="Visible">False</property>
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
+                    <property name="MemberName" />
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Expand">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Resize">False</property>
+                <property name="Shrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.HBox" id="righthbox">
+                <property name="MemberName" />
+                <property name="WidthRequest">100</property>
+                <property name="Visible">False</property>
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.VBox" id="tagsvbox">
+                    <property name="MemberName" />
+                    <property name="WidthRequest">100</property>
+                    <property name="Visible">False</property>
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
+                        <property name="MemberName" />
+                        <property name="Events">ButtonPressMask</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Frame" id="notesframe">
+                        <property name="MemberName" />
+                        <property name="ShadowType">None</property>
+                        <child>
+                          <widget class="Gtk.Alignment" id="GtkAlignment22">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="Yalign">0</property>
+                            <property name="LeftPadding">12</property>
+                            <child>
+                              <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
+                                <property name="MemberName" />
+                                <property name="Events">ButtonPressMask</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="GtkLabel31">
+                            <property name="MemberName" />
+                            <property name="LabelProp" translatable="yes">&lt;b&gt;Notes&lt;/b&gt;</property>
+                            <property name="UseMarkup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="type">label_item</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
+                    <property name="MemberName" />
+                    <property name="WidthRequest">100</property>
+                    <property name="Visible">False</property>
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Resize">False</property>
+                <property name="Shrink">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Shrink">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
   <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayersViewer" design-size="642 459">
     <property name="MemberName" />
     <property name="Visible">False</property>
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index e2b33a3..f76d513 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -452,4 +452,36 @@
       </itemgroup>
     </signals>
   </object>
+  <object type="LongoMatch.Gui.Component.AnalysisComponent" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals>
+      <itemgroup label="IAnalysisWindow Signals">
+        <signal name="NewTagEvent" />
+        <signal name="NewTagStartEvent" />
+        <signal name="NewTagStopEvent" />
+        <signal name="PlaySelectedEvent" />
+        <signal name="NewTagAtFrameEvent" />
+        <signal name="TagPlayEvent" />
+        <signal name="PlaysDeletedEvent" />
+        <signal name="TimeNodeChanged" />
+        <signal name="PlayCategoryChanged" />
+        <signal name="RenderPlaylistEvent" />
+        <signal name="PlayListNodeAddedEvent" />
+        <signal name="PlayListNodeSelectedEvent" />
+        <signal name="OpenPlaylistEvent" />
+        <signal name="NewPlaylistEvent" />
+        <signal name="SavePlaylistEvent" />
+        <signal name="SnapshotSeriesEvent" />
+        <signal name="GameUnitEvent" />
+        <signal name="UnitChanged" />
+        <signal name="UnitSelected" />
+        <signal name="UnitDeleted" />
+        <signal name="UnitAdded" />
+        <signal name="KeyPressed" />
+        <signal name="CloseOpenedProjectEvent" />
+        <signal name="NewTagCancelEvent" />
+        <signal name="DuplicatePlay" />
+      </itemgroup>
+    </signals>
+  </object>
 </objects>
\ No newline at end of file
diff --git a/LongoMatch.Services/LongoMatch.Services.mdp b/LongoMatch.Services/LongoMatch.Services.mdp
index aa92697..aca8068 100644
--- a/LongoMatch.Services/LongoMatch.Services.mdp
+++ b/LongoMatch.Services/LongoMatch.Services.mdp
@@ -31,6 +31,7 @@
     <File subtype="Directory" buildaction="Compile" name="Services" />
     <File subtype="Code" buildaction="Compile" name="Services/DataBaseManager.cs" />
     <File subtype="Code" buildaction="Compile" name="Services/MigrationsManager.cs" />
+    <File subtype="Code" buildaction="Compile" name="Services/ToolsManager.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Services/Services/Core.cs b/LongoMatch.Services/Services/Core.cs
index de7c0a9..367e87f 100644
--- a/LongoMatch.Services/Services/Core.cs
+++ b/LongoMatch.Services/Services/Core.cs
@@ -35,15 +35,14 @@ namespace LongoMatch.Services
 {
        public class Core
        {
-               static TemplatesService ts;
                static DataBaseManager dbManager;
                static EventsManager eManager;
                static HotKeysManager hkManager;
                static GameUnitsManager guManager;
                static PlaylistManager plManager;
                static RenderingJobsManager videoRenderer;
-               static IMainWindow mainWindow;
                static IGUIToolkit guiToolkit;
+               static ToolsManager toolsManager;
 #if OSTYPE_WINDOWS
                [DllImport("libglib-2.0-0.dll") /* willfully unmapped */ ]
                static extern void g_setenv (String env, String val);
@@ -76,18 +75,15 @@ namespace LongoMatch.Services
 
                public static void Start(IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit) {
                        Core.guiToolkit = guiToolkit;
-                       Core.mainWindow = guiToolkit.MainWindow;
-                       StartServices(guiToolkit, multimediaToolkit);
-                       BindEvents(Core.mainWindow);
+                       StartServices (guiToolkit, multimediaToolkit);
+                       BindEvents (guiToolkit.MainController);
                }
                
-               public static void StartServices(IGUIToolkit guiToolkit, IMultimediaToolkit 
multimediaToolkit){
+               public static void StartServices (IGUIToolkit guiToolkit, IMultimediaToolkit 
multimediaToolkit){
                        ProjectsManager projectsManager;
+                       TemplatesService ts;
                                
-                       /* Start TemplatesService */
-                       ts = new TemplatesService(Config.TemplatesDir);
-                       Core.mainWindow.TemplatesService = ts;
-
+                       ts = new TemplatesService (Config.TemplatesDir);
                        /* Start DB services */
                        dbManager = new DataBaseManager (Config.DBDir, guiToolkit);
                        dbManager.SetActiveByName (Config.CurrentDatabase);
@@ -99,25 +95,28 @@ namespace LongoMatch.Services
                        /* Start the rendering jobs manager */
                        videoRenderer = new RenderingJobsManager(multimediaToolkit, guiToolkit);
                        
+                       projectsManager = new ProjectsManager(guiToolkit, multimediaToolkit, ts);
+                       
+                       /* State the tools manager */
+                       toolsManager = new ToolsManager (guiToolkit, multimediaToolkit, projectsManager, ts);
+                       
                        /* Start the events manager */
-                       eManager = new EventsManager(guiToolkit, videoRenderer);
+                       eManager = new EventsManager(guiToolkit, videoRenderer, projectsManager);
                        
                        /* Start the hotkeys manager */
-                       hkManager = new HotKeysManager(guiToolkit.MainWindow);
+                       hkManager = new HotKeysManager(projectsManager);
                        hkManager.newMarkEvent += eManager.OnNewTag;
 
                        /* Start Game Units manager */
-                       guManager = new GameUnitsManager(mainWindow, mainWindow.Player);
+                       guManager = new GameUnitsManager(projectsManager);
                        
                        /* Start playlists manager */
-                       plManager = new PlaylistManager(guiToolkit, videoRenderer);
+                       plManager = new PlaylistManager(guiToolkit, videoRenderer, projectsManager);
                        
-                       projectsManager = new ProjectsManager(guiToolkit, multimediaToolkit);
-                       projectsManager.OpenedProjectChanged += OnOpenedProjectChanged;
                }
 
-               public static void BindEvents(IMainWindow mainWindow) {
-                       mainWindow.EditPreferencesEvent += () => {guiToolkit.OpenPreferencesEditor();};
+               public static void BindEvents(IMainController mainController) {
+                       mainController.QuitApplicationEvent += () => {guiToolkit.Quit();};
                }
 
                public static void CheckDirs() {
@@ -143,32 +142,6 @@ namespace LongoMatch.Services
                        }
                }
                
-               public static TemplatesService TemplatesService {
-                       get {
-                               return ts;
-                       }
-               }
-               
-               public static IGUIToolkit GUIToolkit {
-                       get {
-                               return guiToolkit;
-                       }
-               }
-               
-               private static void OnOpenedProjectChanged (Project project, ProjectType projectType,
-                                                           PlaysFilter filter) {
-                       if (project != null) {
-                               hkManager.Categories=project.Categories;
-                       } else {
-                               hkManager.Categories=null;
-                       }
-                       
-                       eManager.SetProject (project, projectType, filter);
-                       guManager.OpenedProject = project;
-                       plManager.OpenedProject = project;
-                       dbManager.OpenedProject = project;
-               }
-               
                private static void SetupBaseDir() {
                        string home;
                        
diff --git a/LongoMatch.Services/Services/DataBaseManager.cs b/LongoMatch.Services/Services/DataBaseManager.cs
index 1c94e61..1ad24ba 100644
--- a/LongoMatch.Services/Services/DataBaseManager.cs
+++ b/LongoMatch.Services/Services/DataBaseManager.cs
@@ -117,7 +117,7 @@ namespace LongoMatch.DB
 
                void ConnectSignals ()
                {
-                       guiToolkit.MainWindow.ManageDatabasesEvent += () => {
+                       guiToolkit.MainController.ManageDatabasesEvent += () => {
                                if (OpenedProject != null) {
                                        var msg = Catalog.GetString("Close the current project to open the 
database manager");
                                        guiToolkit.ErrorMessage (msg);
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index f7db18a..8b5e7dc 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -43,67 +43,78 @@ namespace LongoMatch.Services
                /* current project in use */
                Project openedProject;
                ProjectType projectType;
-               Time startTime;
                PlaysFilter filter;
                Dictionary<Category, Time> catsTime;
                
                IGUIToolkit guiToolkit;
-               IMainWindow mainWindow;
+               IAnalysisWindow analysisWindow;
+               IProjectOptionsController poController;
                IPlayer player;
                ICapturer capturer;
                IRenderingJobsManager renderer;
 
-               public EventsManager(IGUIToolkit guiToolkit, IRenderingJobsManager renderer)
+               public EventsManager(IGUIToolkit guiToolkit, IRenderingJobsManager renderer,
+                                    ProjectsManager pManager)
                {
                        this.guiToolkit = guiToolkit;
                        this.renderer = renderer;
-                       mainWindow = guiToolkit.MainWindow;
-                       player = mainWindow.Player;
-                       capturer = mainWindow.Capturer;
-                       drawingManager = new VideoDrawingsManager(player);
+                       pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
+                       drawingManager = new VideoDrawingsManager(pManager);
                        catsTime = new Dictionary<Category, Time>();
-                       ConnectSignals();
                }
 
-               void Save (Project project) {
-                       if (Config.AutoSave) {
-                               Core.DB.UpdateProject (project);
-                       }
-               }
-               
-               public void SetProject (Project project, ProjectType projectType,
-                                       PlaysFilter filter)
+               void HandleOpenedProjectChanged (Project project, ProjectType projectType,
+                                                PlaysFilter filter, IAnalysisWindow analysisWindow,
+                                                IProjectOptionsController projectOptionsController)
                {
-                       this.filter = filter;
                        this.openedProject = project;
                        this.projectType = projectType;
+                       this.filter = filter;
                        catsTime.Clear ();
+                       
+                       if (project == null)
+                               return;
+                               
+                       player = analysisWindow.Player;
+                       capturer = analysisWindow.Capturer;
+                       this.poController = projectOptionsController;
+                       if (this.analysisWindow != analysisWindow) {
+                               this.analysisWindow = analysisWindow;
+                               ConnectSignals();
+                       }
                }
 
+               void Save (Project project) {
+                       if (Config.AutoSave) {
+                               Core.DB.UpdateProject (project);
+                       }
+               }
+               
                private void ConnectSignals() {
                        /* Adding Handlers for each event */
 
                        /* Connect tagging related events */
-                       mainWindow.NewTagEvent += OnNewTag;
-                       mainWindow.NewTagStartEvent += OnNewPlayStart;
-                       mainWindow.NewTagStopEvent += OnNewPlayStop;
-                       mainWindow.NewTagCancelEvent += OnNewPlayCancel;
-                       mainWindow.NewTagAtFrameEvent += OnNewTagAtFrame;
-                       mainWindow.TimeNodeChanged += OnTimeNodeChanged;
-                       mainWindow.PlaysDeletedEvent += OnPlaysDeleted;
-                       mainWindow.PlaySelectedEvent += OnPlaySelected;
-                       mainWindow.PlayCategoryChanged += OnPlayCategoryChanged;
-                       mainWindow.DuplicatePlay += OnDuplicatePlay;
+                       analysisWindow.NewTagEvent += OnNewTag;
+                       analysisWindow.NewTagStartEvent += OnNewPlayStart;
+                       analysisWindow.NewTagStopEvent += OnNewPlayStop;
+                       analysisWindow.NewTagCancelEvent += OnNewPlayCancel;
+                       analysisWindow.NewTagAtFrameEvent += OnNewTagAtFrame;
+                       analysisWindow.TimeNodeChanged += OnTimeNodeChanged;
+                       analysisWindow.PlaysDeletedEvent += OnPlaysDeleted;
+                       analysisWindow.PlaySelectedEvent += OnPlaySelected;
+                       analysisWindow.PlayCategoryChanged += OnPlayCategoryChanged;
+                       analysisWindow.DuplicatePlay += OnDuplicatePlay;
 
                        /* Connect playlist events */
-                       mainWindow.PlayListNodeSelectedEvent += (tn) => {selectedTimeNode = tn;};
+                       analysisWindow.PlayListNodeSelectedEvent += (tn) => {selectedTimeNode = tn;};
                        /* Connect tags events */
-                       mainWindow.TagPlayEvent += OnTagPlay;
+                       analysisWindow.TagPlayEvent += OnTagPlay;
 
                        /* Connect SnapshotSeries events */
-                       mainWindow.SnapshotSeriesEvent += OnSnapshotSeries;
+                       analysisWindow.SnapshotSeriesEvent += OnSnapshotSeries;
                        
-                       mainWindow.ShowProjectStatsEvent += HandleShowProjectStatsEvent;
+                       poController.ShowProjectStatsEvent += HandleShowProjectStatsEvent;
+                       poController.TagSubcategoriesChangedEvent += HandleTagSubcategoriesChangedEvent;
                        
                        /* Connect player events */
                        player.Prev += OnPrev;
@@ -112,6 +123,11 @@ namespace LongoMatch.Services
                        player.PlaybackRateChanged += HandlePlaybackRateChanged;
                }
 
+               void HandleTagSubcategoriesChangedEvent (bool tagsubcategories)
+               {
+                       Config.FastTagging = !tagsubcategories;
+               }
+
                void HandleShowProjectStatsEvent (Project project)
                {
                        guiToolkit.ShowProjectStats (project);
@@ -197,7 +213,7 @@ namespace LongoMatch.Services
                        /* Tag subcategories of the new play */
                        if (!Config.FastTagging)
                                LaunchPlayTagger(play, false);
-                       mainWindow.AddPlay(play);
+                       analysisWindow.AddPlay(play);
                        filter.Update();
                        if (projectType == ProjectType.FileProject) {
                                player.Play();
@@ -233,7 +249,8 @@ namespace LongoMatch.Services
                }
 
                public virtual void OnNewPlayStart (Category category) {
-                       catsTime.Add (category, new Time {MSeconds = (int)player.CurrentTime});
+                       Time startTime = new Time {MSeconds = (int)player.CurrentTime};
+                       catsTime.Add (category, startTime);
                        Log.Debug("New play start time: " + startTime);
                }
                
@@ -294,7 +311,7 @@ namespace LongoMatch.Services
                        selectedTimeNode = play;
                        player.SetStartStop(play.Start.MSeconds,play.Stop.MSeconds, play.Rate);
                        drawingManager.Play=play;
-                       mainWindow.UpdateSelectedPlay(play);
+                       analysisWindow.UpdateSelectedPlay(play);
                }
 
                protected virtual void OnTimeNodeChanged(TimeNode tNode, object val)
@@ -312,7 +329,7 @@ namespace LongoMatch.Services
                                }
                        }
                        else if(tNode is Category) {
-                               mainWindow.UpdateCategories(openedProject.Categories);
+                               analysisWindow.UpdateCategories(openedProject.Categories);
                        }
                        filter.Update();
                }
@@ -320,7 +337,7 @@ namespace LongoMatch.Services
                protected virtual void OnPlaysDeleted(List<Play> plays)
                {
                        Log.Debug(plays.Count + " plays deleted");
-                       mainWindow.DeletePlays(plays);
+                       analysisWindow.DeletePlays(plays);
                        openedProject.RemovePlays(plays);
 
                        if(projectType == ProjectType.FileProject) {
@@ -336,7 +353,7 @@ namespace LongoMatch.Services
                        /* The category is also serialized and desarialized */
                        copy.Category = play.Category;
                        openedProject.AddPlay (copy);
-                       mainWindow.AddPlay (copy);
+                       analysisWindow.AddPlay (copy);
                        filter.Update();
                }
 
@@ -379,8 +396,9 @@ namespace LongoMatch.Services
                        newplay.Name = play.Name;
                        newplay.Notes = play.Notes;
                        newplay.Drawings = play.Drawings;
-                       mainWindow.AddPlay(newplay);
+                       analysisWindow.AddPlay(newplay);
                        Save (openedProject);
                }
+               
        }
 }
diff --git a/LongoMatch.Services/Services/GameUnitsManager.cs 
b/LongoMatch.Services/Services/GameUnitsManager.cs
index 6969168..a1b34f7 100644
--- a/LongoMatch.Services/Services/GameUnitsManager.cs
+++ b/LongoMatch.Services/Services/GameUnitsManager.cs
@@ -26,42 +26,40 @@ namespace LongoMatch.Services
 {
        public class GameUnitsManager
        {
-               IMainWindow mainWindow;
+               IAnalysisWindow analysisWindow;
                IPlayer player;
                Project openedProject;
                Dictionary<GameUnit, Time> gameUnitsStarted;
                ushort fps;
                
-               
-               public GameUnitsManager (IMainWindow mainWindow, IPlayer player)
+               public GameUnitsManager (ProjectsManager pManager)
                {
-                       this.mainWindow = mainWindow;
-                       this.player = player;
                        gameUnitsStarted = new Dictionary<GameUnit, Time>();
-                       mainWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
-                       mainWindow.UnitAdded += HandleUnitAdded;
-                       mainWindow.UnitChanged += HandleUnitChanged;
-                       mainWindow.UnitDeleted += HandleUnitDeleted;
-                       mainWindow.UnitSelected += HandleUnitSelected;
+                       pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
                }
 
-               public Project OpenedProject{
-                       set {
-                               openedProject = value;
-                               gameUnitsStarted.Clear();
-                               
-                               if (openedProject == null)
-                                       return;
-                               
-                               fps = openedProject.Description.File.Fps;
-                               mainWindow.UpdateGameUnits(value.GameUnits);
+               void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter filter,
+                                                IAnalysisWindow analysisWindow, IProjectOptionsController 
projectOptions)
+               {
+                       openedProject = project;
+                       if (openedProject == null)
+                               return;
+                       
+                       if (this.analysisWindow != analysisWindow) {
+                               analysisWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
+                               analysisWindow.UnitAdded += HandleUnitAdded;
+                               analysisWindow.UnitChanged += HandleUnitChanged;
+                               analysisWindow.UnitDeleted += HandleUnitDeleted;
+                               analysisWindow.UnitSelected += HandleUnitSelected;
                        }
+                       this.analysisWindow = analysisWindow;
+                       this.player = analysisWindow.Player;
+                       gameUnitsStarted.Clear();
+                       
+                       fps = openedProject.Description.File.Fps;
+                       analysisWindow.UpdateGameUnits(openedProject.GameUnits);
                }
-       
-               private void ConnectSignals() {
-                       mainWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
-               }
-               
+
                private void StartGameUnit(GameUnit gameUnit) {
                        if (gameUnitsStarted.ContainsKey(gameUnit)){
                                Log.Warning("Trying to start a game unit that was already started");
diff --git a/LongoMatch.Services/Services/HotKeysManager.cs b/LongoMatch.Services/Services/HotKeysManager.cs
index 7b3bc31..3367d41 100644
--- a/LongoMatch.Services/Services/HotKeysManager.cs
+++ b/LongoMatch.Services/Services/HotKeysManager.cs
@@ -39,27 +39,32 @@ namespace LongoMatch.Services
                
                Dictionary<HotKey, Category> dic;
                bool ignoreKeys;
+               IAnalysisWindow analysisWindow;
                
-               public HotKeysManager(IMainWindow mainWindow)
+               public HotKeysManager(ProjectsManager pManager)
                {
                        dic = new Dictionary<HotKey,Category>();
-                       mainWindow.KeyPressed += KeyListener;
+                       pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
                }
 
-               // Set the active Hotkeys for the current project
-               public Categories Categories {
-                       set {
-                               dic.Clear();
-                               if(value == null) {
-                                       ignoreKeys = true;
-                                       return;
-                               }
-                               ignoreKeys = false;
-                               foreach(Category cat in value) {
-                                       if(cat.HotKey.Defined &&
-                                                       !dic.ContainsKey(cat.HotKey))
-                                               dic.Add(cat.HotKey, cat);
-                               }
+               void HandleOpenedProjectChanged (Project project, LongoMatch.Common.ProjectType projectType, 
LongoMatch.Common.PlaysFilter filter, IAnalysisWindow analysisWindow, IProjectOptionsController 
projectOptions)
+               {
+                       if(project == null) {
+                               ignoreKeys = true;
+                               return;
+                       }
+                       
+                       if (this.analysisWindow != analysisWindow) {
+                               analysisWindow.KeyPressed += KeyListener;
+                               this.analysisWindow = analysisWindow;
+                       }
+                       
+                       dic.Clear();
+                       ignoreKeys = false;
+                       foreach(Category cat in project.Categories) {
+                               if(cat.HotKey.Defined &&
+                                  !dic.ContainsKey(cat.HotKey))
+                                       dic.Add(cat.HotKey, cat);
                        }
                }
 
diff --git a/LongoMatch.Services/Services/PlaylistManager.cs b/LongoMatch.Services/Services/PlaylistManager.cs
index e5b5a8a..6595205 100644
--- a/LongoMatch.Services/Services/PlaylistManager.cs
+++ b/LongoMatch.Services/Services/PlaylistManager.cs
@@ -35,30 +35,39 @@ namespace LongoMatch.Services
                IPlayList playlist;
                IPlayer player;
                IRenderingJobsManager videoRenderer;
+               IAnalysisWindow analysisWindow;
                /* FIXME */
                TimeNode selectedTimeNode;
                
                bool clockStarted;
                Timer timeout;
+               Project openedProject;
                
-               public PlaylistManager (IGUIToolkit guiToolkit, IRenderingJobsManager videoRenderer)
+               public PlaylistManager (IGUIToolkit guiToolkit, IRenderingJobsManager videoRenderer,
+                                       ProjectsManager pManager)
                {
                        this.videoRenderer = videoRenderer;
                        this.guiToolkit = guiToolkit;
-                       playlistWidget = guiToolkit.MainWindow.Playlist;
-                       player = guiToolkit.MainWindow.Player;
-                       BindEvents(guiToolkit.MainWindow, guiToolkit.MainWindow.Player);
+                       pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
+               }
+
+               void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter 
filter, IAnalysisWindow analysisWindow, IProjectOptionsController projectOptions)
+               {
+                       openedProject = project;
+                       if (project != null) {
+                               playlistWidget = analysisWindow.Playlist;
+                               player = analysisWindow.Player;
+                               if (this.analysisWindow != analysisWindow) {
+                                       BindEvents(analysisWindow);
+                                       this.analysisWindow = analysisWindow;
+                               }
+                       }
                }
                
                public void Stop() {
                        StopClock();
                }
                
-               public Project OpenedProject {
-                       get;
-                       set;
-               }
-               
                public void Load(string filePath) {
                        try {
                                playlist = PlayList.Load(filePath);
@@ -70,24 +79,24 @@ namespace LongoMatch.Services
                        }
                }
                
-               private void BindEvents(IMainWindow mainWindow, IPlayer player) {
+               private void BindEvents(IAnalysisWindow analysisWindow) {
                        /* Track loaded element */
-                       mainWindow.PlaySelectedEvent += (p) => {selectedTimeNode = p;};
-                       player.SegmentClosedEvent += () => {selectedTimeNode = null;};
+                       analysisWindow.PlaySelectedEvent += (p) => {selectedTimeNode = p;};
+                       analysisWindow.Player.SegmentClosedEvent += () => {selectedTimeNode = null;};
                        
                        /* Handle New/Open/Save playlist */
-                       mainWindow.OpenPlaylistEvent += OnOpenPlaylist;
-                       mainWindow.NewPlaylistEvent += OnNewPlaylist;
-                       mainWindow.SavePlaylistEvent += OnSavePlaylist;
+                       analysisWindow.OpenPlaylistEvent += OnOpenPlaylist;
+                       analysisWindow.NewPlaylistEvent += OnNewPlaylist;
+                       analysisWindow.SavePlaylistEvent += OnSavePlaylist;
                        
                        /* Handle Add/Select/Rate events from other widgets */
-                       mainWindow.PlayListNodeAddedEvent += OnPlayListNodeAdded;
-                       mainWindow.PlayListNodeSelectedEvent += LoadPlaylistPlay;
-                       mainWindow.RenderPlaylistEvent += OnRenderPlaylistEvent;
+                       analysisWindow.PlayListNodeAddedEvent += OnPlayListNodeAdded;
+                       analysisWindow.PlayListNodeSelectedEvent += LoadPlaylistPlay;
+                       analysisWindow.RenderPlaylistEvent += OnRenderPlaylistEvent;
                        
                        /* Handle Next/Prev from the player */
-                       player.Next += () => {Next();};
-                       player.Prev += () => {
+                       analysisWindow.Player.Next += () => {Next();};
+                       analysisWindow.Player.Prev += () => {
                                if(selectedTimeNode is PlayListPlay)
                                        Prev();
                        };
@@ -98,7 +107,7 @@ namespace LongoMatch.Services
                                guiToolkit.InfoMessage(Catalog.GetString("You have not loaded any playlist 
yet."));
                        } else {
                                foreach (Play p in plays) {
-                                       PlayListPlay pl = new PlayListPlay (p, 
OpenedProject.Description.File, true);
+                                       PlayListPlay pl = new PlayListPlay (p, 
openedProject.Description.File, true);
                                        playlist.Add(pl);
                                        playlistWidget.Add(pl);
                                }
@@ -107,7 +116,7 @@ namespace LongoMatch.Services
                
                private void LoadPlaylistPlay(PlayListPlay play)
                {
-                       if(OpenedProject != null) {
+                       if(openedProject != null) {
                                guiToolkit.ErrorMessage(Catalog.GetString(
                                        "Please, close the opened project to play the playlist."));
                                Stop();
diff --git a/LongoMatch.Services/Services/ProjectOptionsManager.cs 
b/LongoMatch.Services/Services/ProjectOptionsManager.cs
new file mode 100644
index 0000000..851d272
--- /dev/null
+++ b/LongoMatch.Services/Services/ProjectOptionsManager.cs
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+
+namespace LongoMatch.Services.Services
+{
+               public class ProjectOptionsManager
+               {
+                               public ProjectOptionsManager ()
+                               {
+                               }
+                               
+               protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
+               {
+                       if (TagSubcategoriesChangedEvent != null)
+                               TagSubcategoriesChangedEvent (!TagSubcategoriesAction.Active);
+                       Config.FastTagging = !TagSubcategoriesAction.Active;
+               }
+
+               protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
+               {
+                       playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+               }
+
+               protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
+               {
+                       bool visible = (sender as Gtk.ToggleAction).Active;
+                       SetPlaylistVisibility (visible);
+                       playsSelection.PlayListLoaded=visible;
+               }
+
+               protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
+               {
+                       ToggleAction action = sender as ToggleAction;
+                       
+                       if(openedProject == null)
+                               return;
+                       
+                       leftbox.Visible = !action.Active;
+                       timeline.Visible = !action.Active && TimelineViewAction.Active;
+                       buttonswidget.Visible = !action.Active &&
+                               (TaggingViewAction.Active || ManualTaggingViewAction.Active);
+                       if (Config.UseGameUnits) {
+                               guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
+                               gameunitstaggerwidget1.Visible = !action.Active && 
(GameUnitsViewAction.Active || 
+                                       TaggingViewAction.Active || ManualTaggingViewAction.Active);
+                       }
+                       if(action.Active) {
+                               SetTagsBoxVisibility (false);
+                       } else {
+                               if (selectedTimeNode != null)
+                                       SetTagsBoxVisibility (true);
+                       }
+               }
+
+               protected virtual void OnViewToggled(object sender, System.EventArgs e)
+               {
+                       ToggleAction action = sender as Gtk.ToggleAction;
+                       
+                       if (!action.Active)
+                               return;
+                       
+                       buttonswidget.Visible = action == ManualTaggingViewAction || sender == 
TaggingViewAction;
+                       timeline.Visible = action == TimelineViewAction;
+                       if (Config.UseGameUnits) {
+                               guTimeline.Visible = action == GameUnitsViewAction;
+                               gameunitstaggerwidget1.Visible = buttonswidget.Visible || guTimeline.Visible;
+                       }
+                       if(action == ManualTaggingViewAction)
+                               buttonswidget.Mode = TagMode.Free;
+                       else
+                               buttonswidget.Mode = TagMode.Predifined;
+               }
+               }
+}
+
diff --git a/LongoMatch.Services/Services/ProjectsManager.cs b/LongoMatch.Services/Services/ProjectsManager.cs
index cc57c21..6be741f 100644
--- a/LongoMatch.Services/Services/ProjectsManager.cs
+++ b/LongoMatch.Services/Services/ProjectsManager.cs
@@ -38,27 +38,23 @@ namespace LongoMatch.Services
 
                IGUIToolkit guiToolkit;
                IMultimediaToolkit multimediaToolkit;
-               IMainWindow mainWindow;
+               IMainController mainController;
+               IAnalysisWindow analysisWindow;
+               IProjectOptionsController projectOptionsController;
+               TemplatesService ts;
                
-               public ProjectsManager(IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit) {
+               public ProjectsManager (IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit,
+                                      TemplatesService ts) {
                        this.multimediaToolkit = multimediaToolkit;
                        this.guiToolkit = guiToolkit;
-                       mainWindow = guiToolkit.MainWindow;
-                       Player = mainWindow.Player;
-                       Capturer = mainWindow.Capturer;
+                       this.ts =ts;
+                       mainController = guiToolkit.MainController;
                        ConnectSignals();
                }
 
                public void ConnectSignals() {
-                       mainWindow.NewProjectEvent += NewProject;
-                       mainWindow.OpenProjectEvent += OpenProject;
-                       mainWindow.CloseOpenedProjectEvent += CloseOpenedProject;
-                       mainWindow.SaveProjectEvent += SaveProject;
-                       mainWindow.ImportProjectEvent += ImportProject;
-                       mainWindow.ExportProjectEvent += ExportProject;
-                       mainWindow.ManageProjectsEvent += OpenProjectsManager;
-                       mainWindow.ManageCategoriesEvent += OpenCategoriesTemplatesManager;
-                       mainWindow.ManageTeamsEvent += OpenTeamsTemplatesManager;
+                       mainController.NewProjectEvent += NewProject;
+                       mainController.OpenProjectEvent += OpenProject;
                }
                
                public Project OpenedProject {
@@ -88,7 +84,8 @@ namespace LongoMatch.Services
                
                private void EmitProjectChanged() {
                        if (OpenedProjectChanged != null)
-                               OpenedProjectChanged(OpenedProject, OpenedProjectType, PlaysFilter);
+                               OpenedProjectChanged (OpenedProject, OpenedProjectType, PlaysFilter,
+                                                     analysisWindow, projectOptionsController);
                }
                
                void RemuxOutputFile (EncodingSettings settings) {
@@ -166,71 +163,21 @@ namespace LongoMatch.Services
                        SetProject(project, ProjectType.FileProject, new CaptureSettings());
                }
        
-               private void ImportProject(string name, string filterName, string filter,
-                                          Func<string, Project> importProject, bool requiresNewFile) {
-                       Project project;
-                       string fileName;
-
-                       Log.Debug("Importing project");
-                       /* Show a file chooser dialog to select the file to import */
-                       fileName = guiToolkit.OpenFile(name, null, Config.HomeDir, filterName,
-                                                      new string[] {filter});
-                               
-                       if(fileName == null)
-                               return;
-
-                       /* try to import the project and show a message error is the file
-                        * is not a valid project */
-                       try {
-                               project = importProject(fileName);
-                       }
-                       catch(Exception ex) {
-                               guiToolkit.ErrorMessage(Catalog.GetString("Error importing project:") +
-                                       "\n"+ex.Message);
-                               Log.Exception(ex);
-                               return;
-                       }
-
-                       if (requiresNewFile) {
-                               string videofile;
-                               
-                               guiToolkit.InfoMessage (Catalog.GetString("This project doesn't have any file 
associated.\n" +
-                                                                         "Select one in the next window"));
-                               videofile = guiToolkit.OpenFile(Catalog.GetString("Select a video file"), 
null,
-                                                                                Config.HomeDir, null, null);
-                               if (videofile == null) {
-                                       guiToolkit.ErrorMessage (Catalog.GetString("Could not import project, 
you need a video file"));
-                                       return;
-                               } else {
-                                       try {
-                                               project.Description.File = 
multimediaToolkit.DiscoverFile(videofile);
-                                       } catch (Exception ex) {
-                                               guiToolkit.ErrorMessage (ex.Message);
-                                               return;
-                                       }
-                                       CreateThumbnails (project);
-                               }
-                       }
-                       
-                       /* If the project exists ask if we want to overwrite it */
-                       if(Core.DB.Exists(project)) {
-                               var res = guiToolkit.QuestionMessage(Catalog.GetString("A project already 
exists for the file:") +
-                                       project.Description.File.FilePath+ "\n" +
-                                       Catalog.GetString("Do you want to overwrite it?"), null);
-                               if(!res)
-                                       return;
-                               Core.DB.UpdateProject(project);
-                       } else {
-                               Core.DB.AddProject(project);
-                       }
-
-                       guiToolkit.InfoMessage(Catalog.GetString("Project successfully imported."));
-               }
-       
                private bool SetProject(Project project, ProjectType projectType, CaptureSettings props)
                {
-                       if(OpenedProject != null)
+                       if (OpenedProject != null) {
                                CloseOpenedProject(true);
+                       }
+                               
+                       PlaysFilter = new PlaysFilter(project);
+                       guiToolkit.OpenProject (project, projectType, props, PlaysFilter,
+                                               out analysisWindow, out projectOptionsController);
+                       Player = analysisWindow.Player;
+                       Capturer = analysisWindow.Capturer;
+                       projectOptionsController.CloseOpenedProjectEvent += () => {PromptCloseProject ();};
+                       projectOptionsController.SaveProjectEvent += SaveProject;
+                       OpenedProject = project;
+                       OpenedProjectType = projectType;
 
                        if(projectType == ProjectType.FileProject) {
                                // Check if the file associated to the project exists
@@ -244,8 +191,9 @@ namespace LongoMatch.Services
                                        Player.Open(project.Description.File.FilePath);
                                }
                                catch(Exception ex) {
+                                       Log.Exception (ex);
                                        guiToolkit.ErrorMessage(Catalog.GetString("An error occurred opening 
this project:") + "\n" + ex.Message);
-                                       CloseOpenedProject(true);
+                                       CloseOpenedProject (false);
                                        return false;
                                }
 
@@ -257,7 +205,7 @@ namespace LongoMatch.Services
                                                Capturer.Type = CapturerType.Live;
                                        } catch(Exception ex) {
                                                guiToolkit.ErrorMessage(ex.Message);
-                                               CloseOpenedProject(false);
+                                               CloseOpenedProject (false);
                                                return false;
                                        }
                                } else
@@ -265,10 +213,6 @@ namespace LongoMatch.Services
                                Capturer.Run();
                        }
 
-                       OpenedProject = project;
-                       OpenedProjectType = projectType;
-                       PlaysFilter = new PlaysFilter(project);
-                       mainWindow.SetProject(project, projectType, props, PlaysFilter);
                        EmitProjectChanged();
                        return true;
                }
@@ -300,34 +244,49 @@ namespace LongoMatch.Services
                        fChooser.Destroy();
                }*/
 
-               private void CreateThumbnails(Project project) {
-                       IFramesCapturer capturer;
-                       IBusyDialog dialog;
+               private bool PromptCloseProject() {
+                       int res;
+                       //EndCaptureDialog dialog;
 
-                       dialog = guiToolkit.BusyDialog(Catalog.GetString("Creating video thumbnails. This can 
take a while."));
-                       dialog.Show();
-                       dialog.Pulse();
+                       if(OpenedProject == null)
+                               return true;
 
-                       /* Create all the thumbnails */
-                       capturer = multimediaToolkit.GetFramesCapturer();
-                       capturer.Open(project.Description.File.FilePath);
-                       foreach(Play play in project.AllPlays()) {
-                               try {
-                                       capturer.SeekTime(play.Start.MSeconds + ((play.Stop - 
play.Start).MSeconds/2),
-                                                         true);
-                                       play.Miniature = 
capturer.GetCurrentFrame(Constants.THUMBNAIL_MAX_WIDTH,
-                                                        Constants.THUMBNAIL_MAX_HEIGHT);
-                                       dialog.Pulse();
-
-                               } catch (Exception ex) {
-                                       Log.Exception(ex);
+                       if(OpenedProjectType == ProjectType.FileProject) {
+                               bool ret;
+                               ret = guiToolkit.QuestionMessage (
+                                       Catalog.GetString("Do you want to close the current project?"), null);
+                               if (ret) {
+                                       CloseOpenedProject (true);
+                                       return true;
                                }
+                               return false;
                        }
-                       capturer.Dispose();
+
+                       res = 0;
+                       /* Capture project */
+                       /*dialog = new EndCaptureDialog();
+                       dialog.TransientFor = (Gtk.Window)this.Toplevel;
+                       
+                       res = dialog.Run();
                        dialog.Destroy();
+
+                       /* Close project wihtout saving */
+                       if(res == (int)EndCaptureResponse.Quit) {
+                               CloseOpenedProject (false);
+                               return true;
+                       } else if(res == (int)EndCaptureResponse.Save) {
+                               /* Close and save project */
+                               CloseOpenedProject (true);
+                               return true;
+                       } else
+                               /* Continue with the current project */
+                               return false;
                }
-               
-               private void CloseOpenedProject(bool save) {
+
+               private void CloseOpenedProject (bool save) {
+                       if(OpenedProject == null)
+                               return;
+                               
                        if (save)
                                SaveProject(OpenedProject, OpenedProjectType);
                        
@@ -340,6 +299,7 @@ namespace LongoMatch.Services
                                OpenedProject.Clear();
                        OpenedProject = null;
                        OpenedProjectType = ProjectType.None;
+                       guiToolkit.CloseProject ();
                        EmitProjectChanged();
                }
                
@@ -373,6 +333,10 @@ namespace LongoMatch.Services
 
                        Log.Debug("Creating new project");
                        
+                       if (!PromptCloseProject ()) {
+                               return;
+                       }
+                       
                        /* Show the project selection dialog */
                        projectType = guiToolkit.SelectNewProjectType();
                        
@@ -382,17 +346,15 @@ namespace LongoMatch.Services
                                        guiToolkit.ErrorMessage(Catalog.GetString("No capture devices were 
found."));
                                        return;
                                }
-                               project = guiToolkit.NewCaptureProject(Core.DB, Core.TemplatesService, 
devices,
-                                       out captureSettings);
+                               project = guiToolkit.NewCaptureProject(Core.DB, ts, devices, out 
captureSettings);
                        } else if (projectType == ProjectType.FakeCaptureProject) {
-                               project = guiToolkit.NewFakeProject(Core.DB, Core.TemplatesService);
+                               project = guiToolkit.NewFakeProject(Core.DB, ts);
                        } else if (projectType == ProjectType.FileProject) {
-                               project = guiToolkit.NewFileProject(Core.DB, Core.TemplatesService);
+                               project = guiToolkit.NewFileProject(Core.DB, ts);
                                if (project != null)
                                        Core.DB.AddProject(project);
                        } else if (projectType == ProjectType.URICaptureProject) {
-                               project = guiToolkit.NewURICaptureProject(Core.DB, Core.TemplatesService,
-                                                                         out captureSettings);
+                               project = guiToolkit.NewURICaptureProject(Core.DB, ts, out captureSettings);
                        } else {
                                project = null;
                        }
@@ -405,6 +367,10 @@ namespace LongoMatch.Services
                        Project project = null;
                        ProjectDescription projectDescription = null;
                        
+                       if (!PromptCloseProject ()) {
+                               return;
+                       }
+                       
                        projectDescription = guiToolkit.SelectProject(Core.DB.GetAllProjects());
                        if (projectDescription == null)
                                return;
@@ -421,50 +387,12 @@ namespace LongoMatch.Services
                                        Catalog.GetString("You are opening a live project without any video 
file associated yet.") +
                                        "\n" + Catalog.GetString("Select a video file in the next step."));
                                
-                               project = guiToolkit.EditFakeProject(Core.DB, project, Core.TemplatesService);
+                               project = guiToolkit.EditFakeProject(Core.DB, project, ts);
                                if (project == null)
                                        return;
-                               CreateThumbnails(project);
+                               ToolsManager.CreateThumbnails(project, guiToolkit, 
multimediaToolkit.GetFramesCapturer());
                        }
                        SetProject(project, ProjectType.FileProject, new CaptureSettings());
                }
-               
-               protected void ExportProject() {
-                       if (OpenedProject == null) {
-                               Log.Warning("Opened project is null and can't be exported");
-                       }
-                       
-                       string filename = guiToolkit.SaveFile(Catalog.GetString("Save project"), null,
-                               Config.HomeDir, Constants.PROJECT_NAME, new string[] {Constants.PROJECT_EXT});
-                       
-                       if (filename == null)
-                               return;
-                       
-                       System.IO.Path.ChangeExtension(filename, Constants.PROJECT_EXT);
-                       
-                       try {
-                               Project.Export(OpenedProject, filename);
-                               guiToolkit.InfoMessage(Catalog.GetString("Project exported successfully"));
-                       }catch (Exception ex) {
-                               guiToolkit.ErrorMessage(Catalog.GetString("Error exporting project"));
-                               Log.Exception(ex);
-                       }
-               }
-               
-               protected void OpenCategoriesTemplatesManager()
-               {
-                       guiToolkit.OpenCategoriesTemplatesManager (Core.TemplatesService);
-               }
-
-               protected void OpenTeamsTemplatesManager()
-               {
-                       guiToolkit.OpenTeamsTemplatesManager (Core.TemplatesService.TeamTemplateProvider);
-               }
-               
-               protected void OpenProjectsManager()
-               {
-                       guiToolkit.OpenProjectsManager(OpenedProject, Core.DB, Core.TemplatesService);
-               }
-
        }
 }
diff --git a/LongoMatch.Services/Services/RenderingJobsManager.cs 
b/LongoMatch.Services/Services/RenderingJobsManager.cs
index d520637..d8250ad 100644
--- a/LongoMatch.Services/Services/RenderingJobsManager.cs
+++ b/LongoMatch.Services/Services/RenderingJobsManager.cs
@@ -43,13 +43,13 @@ namespace LongoMatch.Services
                {
                        this.guiToolkit = guiToolkit;
                        this.multimediaToolkit = multimediaToolkit; 
-                       this.stateBar = guiToolkit.MainWindow.RenderingStateBar;
+                       this.stateBar = guiToolkit.RenderingStateBar;
                        capturer = multimediaToolkit.GetFramesCapturer();
                        jobs = new List<Job>();
                        pendingJobs = new List<Job>();
                        stateBar.Cancel += (sender, e) => CancelCurrentJob();
                        stateBar.ManageJobs += (sender, e) => ManageJobs();
-                       guiToolkit.MainWindow.ConvertVideoFilesEvent += delegate(List<MediaFile> inputFiles, 
EncodingSettings encSettings) {
+                       guiToolkit.MainController.ConvertVideoFilesEvent += delegate(List<MediaFile> 
inputFiles, EncodingSettings encSettings) {
                                ConversionJob job = new ConversionJob(inputFiles, encSettings);
                                AddJob (job);
                        };; 
diff --git a/LongoMatch.Services/Services/ToolsManager.cs b/LongoMatch.Services/Services/ToolsManager.cs
new file mode 100644
index 0000000..9c75616
--- /dev/null
+++ b/LongoMatch.Services/Services/ToolsManager.cs
@@ -0,0 +1,172 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program 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 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program 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 this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using Mono.Unix;
+
+using LongoMatch.Interfaces.GUI;
+using LongoMatch.Interfaces.Multimedia;
+using LongoMatch.Store;
+using LongoMatch.Common;
+
+namespace LongoMatch.Services {
+
+       public class ToolsManager
+       {
+               
+               TemplatesService templatesService;
+               Project openedProject;
+               IGUIToolkit guiToolkit;
+               IMultimediaToolkit multimediaToolkit;
+               
+               public ToolsManager (IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit,
+                                    ProjectsManager projectsManager,
+                                    TemplatesService templatesService)
+               {
+                       this.guiToolkit = guiToolkit;
+                       this.multimediaToolkit = multimediaToolkit;
+                       this.templatesService = templatesService;
+                       projectsManager.OpenedProjectChanged += (project, projectType, filter, 
analysisWindow, projectOptions) => {
+                               this.openedProject = project;
+                       };
+                       
+                       guiToolkit.MainController.EditPreferencesEvent += () => {
+                               guiToolkit.OpenPreferencesEditor();
+                       };
+                       guiToolkit.MainController.ManageCategoriesEvent += () => {
+                               guiToolkit.OpenCategoriesTemplatesManager (this.templatesService);
+                       };
+                       guiToolkit.MainController.ManageTeamsEvent += () => {
+                               guiToolkit.OpenTeamsTemplatesManager 
(this.templatesService.TeamTemplateProvider);
+                       };
+                       guiToolkit.MainController.ManageProjectsEvent += () => {
+                               guiToolkit.OpenProjectsManager(this.openedProject, Core.DB, templatesService);
+                       };
+                       
+                       guiToolkit.MainController.ImportProjectEvent += ImportProject;
+                       guiToolkit.MainController.ExportProjectEvent += ExportProject;
+               }
+               
+               void ExportProject() {
+                       if (openedProject == null) {
+                               Log.Warning("Opened project is null and can't be exported");
+                       }
+                       
+                       string filename = guiToolkit.SaveFile (Catalog.GetString ("Save project"), null,
+                               Config.HomeDir, Constants.PROJECT_NAME, new string[] {Constants.PROJECT_EXT});
+                       
+                       if (filename == null)
+                               return;
+                       
+                       System.IO.Path.ChangeExtension (filename, Constants.PROJECT_EXT);
+                       
+                       try {
+                               Project.Export (openedProject, filename);
+                               guiToolkit.InfoMessage (Catalog.GetString("Project exported successfully"));
+                       } catch (Exception ex) {
+                               guiToolkit.ErrorMessage (Catalog.GetString("Error exporting project"));
+                               Log.Exception (ex);
+                       }
+               }
+               
+               private void ImportProject(string name, string filterName, string filter,
+                                          Func<string, Project> importProject, bool requiresNewFile) {
+                       Project project;
+                       string fileName;
+
+                       Log.Debug("Importing project");
+                       /* Show a file chooser dialog to select the file to import */
+                       fileName = guiToolkit.OpenFile(name, null, Config.HomeDir, filterName,
+                                                      new string[] {filter});
+                               
+                       if(fileName == null)
+                               return;
+
+                       /* try to import the project and show a message error is the file
+                        * is not a valid project */
+                       try {
+                               project = importProject (fileName);
+                       }
+                       catch(Exception ex) {
+                               guiToolkit.ErrorMessage (Catalog.GetString ("Error importing project:") +
+                                                        "\n"+ex.Message);
+                               Log.Exception(ex);
+                               return;
+                       }
+
+                       if (requiresNewFile) {
+                               string videofile;
+                               
+                               guiToolkit.InfoMessage (Catalog.GetString ("This project doesn't have any 
file associated.\n" +
+                                                                          "Select one in the next window"));
+                               videofile = guiToolkit.OpenFile (Catalog.GetString ("Select a video file"), 
null,
+                                                                Config.HomeDir, null, null);
+                               if (videofile == null) {
+                                       guiToolkit.ErrorMessage (Catalog.GetString ("Could not import 
project, you need a video file"));
+                                       return;
+                               } else {
+                                       try {
+                                               project.Description.File = multimediaToolkit.DiscoverFile 
(videofile);
+                                       } catch (Exception ex) {
+                                               guiToolkit.ErrorMessage (ex.Message);
+                                               return;
+                                       }
+                                       CreateThumbnails (project, guiToolkit, 
multimediaToolkit.GetFramesCapturer());
+                               }
+                       }
+                       
+                       /* If the project exists ask if we want to overwrite it */
+                       if (Core.DB.Exists (project)) {
+                               var res = guiToolkit.QuestionMessage (Catalog.GetString ("A project already 
exists for the file:") +
+                                                                     project.Description.File.FilePath+ "\n" 
+
+                                                                     Catalog.GetString ("Do you want to 
overwrite it?"), null);
+                               if(!res)
+                                       return;
+                               Core.DB.UpdateProject(project);
+                       } else {
+                               Core.DB.AddProject(project);
+                       }
+                       guiToolkit.InfoMessage(Catalog.GetString("Project successfully imported."));
+               }
+               
+               public static void CreateThumbnails(Project project, IGUIToolkit guiToolkit, IFramesCapturer 
capturer) {
+                       IBusyDialog dialog;
+
+                       dialog = guiToolkit.BusyDialog(Catalog.GetString("Creating video thumbnails. This can 
take a while."));
+                       dialog.Show();
+                       dialog.Pulse();
+
+                       /* Create all the thumbnails */
+                       capturer.Open(project.Description.File.FilePath);
+                       foreach(Play play in project.AllPlays()) {
+                               try {
+                                       capturer.SeekTime(play.Start.MSeconds + ((play.Stop - 
play.Start).MSeconds/2),
+                                                         true);
+                                       play.Miniature = 
capturer.GetCurrentFrame(Constants.THUMBNAIL_MAX_WIDTH,
+                                                        Constants.THUMBNAIL_MAX_HEIGHT);
+                                       dialog.Pulse();
+
+                               } catch (Exception ex) {
+                                       Log.Exception(ex);
+                               }
+                       }
+                       capturer.Dispose();
+                       dialog.Destroy();
+               }
+       }
+}
+
diff --git a/LongoMatch.Services/Services/VideoDrawingsManager.cs 
b/LongoMatch.Services/Services/VideoDrawingsManager.cs
index d4c8164..0749c2b 100644
--- a/LongoMatch.Services/Services/VideoDrawingsManager.cs
+++ b/LongoMatch.Services/Services/VideoDrawingsManager.cs
@@ -37,14 +37,20 @@ namespace LongoMatch.Services
                bool canStop;
                Play loadedPlay;
 
-               public VideoDrawingsManager(IPlayer player)
+               public VideoDrawingsManager(ProjectsManager pManager)
                {
-                       this.player = player;
+                       pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
                }
 
                ~ VideoDrawingsManager() {
                        StopClock();
                }
+               
+               void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter filter,
+                                        IAnalysisWindow analysisWindow, IProjectOptionsController 
projectOptions)
+               {
+                       player = analysisWindow.Player;
+               }
 
                public Play Play {
                        set {
@@ -77,15 +83,19 @@ namespace LongoMatch.Services
                }
 
                private void ConnectSignals() {
-                       player.PlayStateChanged += OnStateChanged;
-                       player.SeekEvent += OnSeekEvent;
-                       player.SegmentClosedEvent += OnSegmentCloseEvent;
+                       if (player != null) {
+                               player.PlayStateChanged += OnStateChanged;
+                               player.SeekEvent += OnSeekEvent;
+                               player.SegmentClosedEvent += OnSegmentCloseEvent;
+                       }
                }
 
                private void DisconnectSignals() {
-                       player.PlayStateChanged -= OnStateChanged;
-                       player.SeekEvent -= OnSeekEvent;
-                       player.SegmentClosedEvent -= OnSegmentCloseEvent;
+                       if (player != null) {
+                               player.PlayStateChanged -= OnStateChanged;
+                               player.SeekEvent -= OnSeekEvent;
+                               player.SegmentClosedEvent -= OnSegmentCloseEvent;
+                       }
                }
 
                private int NextStopTime() {
diff --git a/LongoMatch/Main.cs b/LongoMatch/Main.cs
index 1f1ab14..7a89d40 100644
--- a/LongoMatch/Main.cs
+++ b/LongoMatch/Main.cs
@@ -63,8 +63,8 @@ namespace LongoMatch
                                manager.LoadConfigModifierAddins();
                            GUIToolkit guiToolkit = new GUIToolkit(version);
                            IMultimediaToolkit multimediaToolkit = new MultimediaFactory();
-                           manager.LoadExportProjectAddins(guiToolkit.MainWindow);
-                           manager.LoadImportProjectAddins(guiToolkit.MainWindow);
+                           manager.LoadExportProjectAddins(guiToolkit.MainController);
+                           manager.LoadImportProjectAddins(guiToolkit.MainController);
                            try {
                                        Core.Start(guiToolkit, multimediaToolkit);
                            } catch (DBLockedException locked) {


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