Index: mediaportal/Dialogs/Dialogs/GUIDialogYesNo.cs
===================================================================
--- mediaportal/Dialogs/Dialogs/GUIDialogYesNo.cs	(revision 27092)
+++ mediaportal/Dialogs/Dialogs/GUIDialogYesNo.cs	(working copy)
@@ -38,6 +38,8 @@
     private int iNoKey = -1;
     //bool needRefresh = false;
     private DateTime vmr7UpdateTimer = DateTime.Now;
+    private int _timeOutInSeconds = 0;
+    private DateTime timeStart = DateTime.Now;
 
     public GUIDialogYesNo()
     {
@@ -49,7 +51,46 @@
       return Load(GUIGraphicsContext.Skin + @"\dialogYesNo.xml");
     }
 
+    public override void DoModal(int dwParentId)
+    {
+      timeStart = DateTime.Now;
+      base.DoModal(dwParentId);
+    }
 
+    public override bool ProcessDoModal()
+    {
+      bool result = base.ProcessDoModal();
+      TimeSpan timeElapsed = DateTime.Now - timeStart;
+      if (TimeOut > 0)
+      {
+        if (timeElapsed.TotalSeconds >= TimeOut)
+        {
+          GUIMessage msgConfirm = new GUIMessage();
+          msgConfirm.Message = GUIMessage.MessageType.GUI_MSG_CLICKED;
+          msgConfirm.SenderControlId = m_DefaultYes ? btnYes.GetID : btnNo.GetID;
+          OnMessage(msgConfirm);
+          return false;
+        }
+      }
+      return result;
+    }
+
+    public override void PageDestroy()
+    {
+      _timeOutInSeconds = 0;
+      base.PageDestroy();
+    }
+
+    public override void Reset()
+    {
+      base.Reset();
+      _timeOutInSeconds = 0;
+      m_bConfirmed = false;
+      m_DefaultYes = false;
+      iYesKey = -1;
+      iNoKey = -1;
+    }
+
     public override void OnAction(Action action)
     {
       //needRefresh = true;
@@ -205,5 +246,12 @@
     {
       m_DefaultYes = bYesNo;
     }
+
+    public int TimeOut
+    {
+      get { return _timeOutInSeconds; }
+      set { _timeOutInSeconds = value; }
+    }
+
   }
 }
\ No newline at end of file
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNotifyManager.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNotifyManager.cs	(revision 27092)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNotifyManager.cs	(working copy)
@@ -250,12 +250,61 @@
               tvProg.EndTime = program.EndTime;
 
               _notifiesList.Remove(program);
-              Log.Info("send notify");
-              GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_NOTIFY_TV_PROGRAM, 0, 0, 0, 0, 0, null);
-              msg.Object = tvProg;
-              GUIGraphicsContext.SendMessage(msg);
-              msg = null;
-              Log.Info("send notify done");
+
+              int _notifyTVTimeout = 15;
+              bool _playNotifyBeep = true;
+              using (Settings xmlreader = new MPSettings())
+              {
+                  _notifyTVTimeout = xmlreader.GetValueAsInt("mytv", "notifyTVTimeout", 15);
+                  _playNotifyBeep = xmlreader.GetValueAsBool("mytv", "notifybeep", true);
+              }
+
+              GUIDialogYesNo dlgYesNo = (GUIDialogYesNo)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_YES_NO);
+              dlgYesNo.Reset();
+              dlgYesNo.SetHeading("TV Notification");
+              if (tvProg.StartTime > DateTime.Now)
+              {
+                dlgYesNo.SetLine(1, tvProg.Title + " is about to start in " + (tvProg.StartTime - DateTime.Now).Minutes.ToString() + " minutes");
+              }
+              else
+              {
+                dlgYesNo.SetLine(1, tvProg.Title + " is now running for " + (DateTime.Now - tvProg.StartTime).Minutes.ToString() + " minutes");
+              }
+              dlgYesNo.SetLine(2, "Switch to " + tvProg.Channel + " now?");
+              dlgYesNo.TimeOut = _notifyTVTimeout;
+              dlgYesNo.SetDefaultToYes(false);
+              if (_playNotifyBeep)
+              {
+                  MediaPortal.Util.Utils.PlaySound("notify.wav", false, true);
+              }
+              dlgYesNo.DoModal(GUIWindowManager.ActiveWindow);
+
+              if (dlgYesNo.IsConfirmed)
+              {
+                try
+                {
+                  MediaPortal.Player.g_Player.Player.Stop();
+                }
+                catch 
+                {
+                }
+
+                Channel c = program.ReferencedChannel();
+
+                if (c.IsTv)
+                {
+                  MediaPortal.GUI.Library.GUIWindowManager.ActivateWindow((int)MediaPortal.GUI.Library.GUIWindow.Window.WINDOW_TV);
+                  TVHome.ViewChannelAndCheck(c);
+                  MediaPortal.Player.g_Player.ShowFullScreenWindow();
+                }
+
+                if (c.IsRadio)
+                {
+                  MediaPortal.GUI.Library.GUIWindowManager.ActivateWindow((int)MediaPortal.GUI.Library.GUIWindow.Window.WINDOW_RADIO);
+                  TVHome.ViewChannelAndCheck(c);
+                }
+              }
+
               return;
             }
           }
@@ -435,4 +484,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
