diff --git a/debian/changelog b/debian/changelog
index 7be76a7..31c38aa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+irwi (0.1-5) unstable; urgency=low
+
+  * Added a timeout functionality for stopping lirc
+
+ -- Torste Aikio <zokier@unknown>  Fri, 04 Jun 2010 10:17:33 +0300
+
 irwi (0.1-4) unstable; urgency=low
 
   * Added lirc as a dependency
diff --git a/src/advsettingsdlg.cpp b/src/advsettingsdlg.cpp
index 6a81586..7cbd7f1 100644
--- a/src/advsettingsdlg.cpp
+++ b/src/advsettingsdlg.cpp
@@ -79,6 +79,7 @@ void AdvSettingsDlg::setDefaults()
     settings->setValue("bgAlpha", 192);
     settings->setValue("height", 147);
     settings->setValue("width", 250);
+    settings->setValue("idleTimeout", 300);
 }
 
 void AdvSettingsDlg::showResetQuery()
diff --git a/src/irctrl_p.cpp b/src/irctrl_p.cpp
index dd7ecf0..f44b23b 100644
--- a/src/irctrl_p.cpp
+++ b/src/irctrl_p.cpp
@@ -4,25 +4,50 @@
 #include <QHostAddress>
 #include <QAbstractSocket>
 #include <QSettings>
+#include <QTimer>
 
 #include "irctrl_p.h"
 
 IrCtrlPrivate::IrCtrlPrivate()
     : settings(NULL)
 {
-    settings = new QSettings();
-    std::system("sudo /etc/init.d/lirc start");
+    settings = new QSettings(this);
+
+    killLircTimer = new QTimer(this);
+    killLircTimer->setInterval(
+            settings->value("idleTimeout", 300).toInt() * 1000);
+    killLircTimer->setSingleShot(true);
+    connect(killLircTimer, SIGNAL(timeout()), this, SLOT(stopLirc()));
+    startLirc();
+    killLircTimer->start();
 }
 
 IrCtrlPrivate::~IrCtrlPrivate()
 {
     delete settings;
     settings = NULL;
+    delete killLircTimer;
+    stopLirc();
+}
+
+void IrCtrlPrivate::stopLirc()
+{
     std::system("sudo /etc/init.d/lirc stop");
 }
 
+void IrCtrlPrivate::startLirc()
+{
+    std::system("sudo /etc/init.d/lirc start");
+}
+
 void IrCtrlPrivate::genericSendCmd(const QString &commandName)
 {
+    if (!killLircTimer->isActive()) {
+        startLirc();
+    } else {
+        killLircTimer->stop();
+    }
+
     QTcpSocket sock;
     sock.setSocketOption(QAbstractSocket::LowDelayOption, 1);
     sock.connectToHost(QHostAddress::LocalHost, 
@@ -35,6 +60,8 @@ void IrCtrlPrivate::genericSendCmd(const QString &commandName)
     sock.write(cmd.toAscii());
     sock.waitForBytesWritten();
     sock.close();
+
+    killLircTimer->start();
 }
 
 
diff --git a/src/irctrl_p.h b/src/irctrl_p.h
index b98483b..0fa5879 100644
--- a/src/irctrl_p.h
+++ b/src/irctrl_p.h
@@ -2,23 +2,31 @@
 #define _IRCTRLPRIVATE_H_
 
 #include <QString>
+#include <QObject>
 #include "irctrl.h"
 
 class QSettings;
+class QTimer;
 
-class IrCtrlPrivate
+class IrCtrlPrivate : public QObject
 {
+    Q_OBJECT
 public:
     IrCtrlPrivate();
     virtual ~IrCtrlPrivate();
 
 protected:
     void genericSendCmd(const QString &commandName);
+    void startLirc();
 
 protected:
     IrCtrl *q_ptr;
     QSettings *settings;
     static const quint16 LIRC_PORT = 8765;
+    QTimer *killLircTimer;
+
+protected slots:
+    void stopLirc();
 
 private:
     IrCtrlPrivate(const IrCtrlPrivate &);
