diff --git a/tools/dringctrl/controler.py b/tools/dringctrl/controler.py
index b927fc0ec22fd1e6c7274cd2177f59e2d49f24ee..276ed8d60defca946696fb316079ff5df28719cd 100644
--- a/tools/dringctrl/controler.py
+++ b/tools/dringctrl/controler.py
@@ -20,6 +20,7 @@
 
 """DRing controling class through DBUS"""
 
+import sys
 import os
 import random
 import time
@@ -28,7 +29,13 @@ import hashlib
 from threading import Thread
 from functools import partial
 
-from gi.repository import GObject
+try:
+    from gi.repository import GObject
+except ImportError as e:
+    import gobject as GObject
+except Exception as e:
+    print(str(e))
+    exit(1)
 
 from errors import *
 
@@ -36,7 +43,7 @@ try:
     import dbus
     from dbus.mainloop.glib import DBusGMainLoop
 except ImportError as e:
-    raise DRingCtrlError("No python3-dbus module found")
+    raise DRingCtrlError("No python-dbus module found")
 
 
 DBUS_DEAMON_OBJECT = 'cx.ring.Ring'
@@ -44,13 +51,17 @@ DBUS_DEAMON_PATH = '/cx/ring/Ring'
 
 
 class DRingCtrl(Thread):
-    def __init__(self, name):
-        super().__init__()
+    def __init__(self, name, autoAnswer):
+        if sys.version_info[0] < 3:
+            super(DRingCtrl, self).__init__()
+        else:
+            super().__init__()
 
         self.activeCalls = {}  # list of active calls (known by the client)
         self.activeConferences = {}  # list of active conferences
         self.account = None  # current active account
         self.name = name # client name
+        self.autoAnswer = autoAnswer
 
         self.currentCallId = ""
         self.currentConfId = ""
@@ -141,7 +152,6 @@ class DRingCtrl(Thread):
         except:
             raise DRingCtrlDeamonError("Client unregistration failed")
 
-
     def isRegistered(self):
         return self.registered
 
@@ -149,7 +159,9 @@ class DRingCtrl(Thread):
     # Signal handling
     #
 
-    def onIncomingCall_cb(self):
+    def onIncomingCall_cb(self, callId):
+        if self.autoAnswer:
+            self.Accept(callId)
         pass
 
     def onCallHangup_cb(self, callId):
@@ -177,7 +189,7 @@ class DRingCtrl(Thread):
                                          'To': to,
                                       'State': ''}
         self.currentCallId = callid
-        self.onIncomingCall_cb()
+        self.onIncomingCall_cb(callid)
 
 
     def onCallHangUp(self, callid):
@@ -192,7 +204,7 @@ class DRingCtrl(Thread):
         """ Update state for this call to Ringing """
 
         self.activeCalls[callid]['State'] = state
-        self.onCallRinging_cb()
+        self.onCallRinging_cb(callid)
 
 
     def onCallHold(self, callid, state):
@@ -223,7 +235,7 @@ class DRingCtrl(Thread):
         del self.activeCalls[callid]
 
 
-    def onCallStateChanged(self, callid, state):
+    def onCallStateChanged(self, callid, state, code):
         """ On call state changed event, set the values for new calls,
         or delete the call from the list of active calls
         """
@@ -234,7 +246,8 @@ class DRingCtrl(Thread):
             callDetails = self.getCallDetails(callid)
             self.activeCalls[callid] = {'Account': callDetails['ACCOUNTID'],
                                              'To': callDetails['PEER_NUMBER'],
-                                          'State': state }
+                                          'State': state,
+                                          'Code': code }
 
         self.currentCallId = callid
 
@@ -609,6 +622,16 @@ class DRingCtrl(Thread):
 
         return self.callmanager.switchInput(callid, inputName)
 
+    def interruptHandler(self, signum, frame):
+        print('Signal handler called with signal ' + str(signum))
+        self.stopThread()
+
+    def printAccountDetails(self, account):
+        details = self.getAccountDetails(account)
+        print(account)
+        for k in sorted(details.keys()):
+            print("  %s: %s" % (k, details[k]))
+        print()
 
     def run(self):
         """Processing method for this thread"""
@@ -619,8 +642,5 @@ class DRingCtrl(Thread):
             context.iteration(True)
 
             if self.isStop:
-                print("++++++++++++++++++++++++++++++++++++++++")
-                print("++++++++++++++++++++++++++++++++++++++++")
-                print("++++++++++++++++++++++++++++++++++++++++")
-                print("++++++++++++++++++++++++++++++++++++++++")
+                print("++++++++++++++++++ EXIT ++++++++++++++++++++++")
                 return
diff --git a/tools/dringctrl/dringctrl.py b/tools/dringctrl/dringctrl.py
index c7b76c944aced7cb2847bcd948b8179543a33d76..2fbeb6f912bb753db7af1f3478203039911d8782 100755
--- a/tools/dringctrl/dringctrl.py
+++ b/tools/dringctrl/dringctrl.py
@@ -22,20 +22,20 @@ import os
 import random
 import time
 import argparse
+import signal
 
-from gi.repository import GObject
+try:
+    from gi.repository import GObject
+except ImportError as e:
+    import gobject as GObject
+except Exception as e:
+    print(str(e))
+    exit(1)
 
 from errors import *
 from controler import DRingCtrl
 from tester import DRingTester
 
-def printAccountDetails(account):
-    details = ctrl.getAccountDetails(account)
-    print(account)
-    for k in sorted(details.keys()):
-        print("  %s: %s" % (k, details[k]))
-    print()
-
 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
 
@@ -93,14 +93,11 @@ if __name__ == "__main__":
     parser.add_argument('--toggle-video', help='Launch toggle video  tests', action='store_true')
 
     parser.add_argument('--test', help=' '.join(str(test) for test in DRingTester().getTestName() ), metavar='<testName>')
+    parser.add_argument('--auto-answer', help='Keep running and auto-answer the calls', action='store_true')
 
     args = parser.parse_args()
 
-    ctrl = DRingCtrl(sys.argv[0])
-
-    if len(sys.argv) == 1:
-        ctrl.run()
-        sys.exit(0)
+    ctrl = DRingCtrl(sys.argv[0], args.auto_answer)
 
     if args.add_ring_account:
         accDetails = {'Account.type':'RING', 'Account.alias':args.add_ring_account if args.add_ring_account!='' else 'RingAccount'}
@@ -126,7 +123,7 @@ if __name__ == "__main__":
 
     if args.get_all_accounts_details:
         for account in ctrl.getAllAccounts():
-            printAccountDetails(account)
+            ctrl.printAccountDetails(account)
 
     if args.get_active_codecs_details:
         for codecId in ctrl.getActiveCodecs(args.get_active_codecs_details):
@@ -138,7 +135,7 @@ if __name__ == "__main__":
         ctrl.setAccount(args.set_active_account)
 
     if args.get_account_details:
-        printAccountDetails(args.get_account_details)
+        ctrl.printAccountDetails(args.get_account_details)
 
     if hasattr(args, 'get_active_codecs'):
         print(ctrl.getActiveCodecs(args.get_active_codec))
@@ -196,3 +193,9 @@ if __name__ == "__main__":
             ctrl.videomanager.startCamera()
             time.sleep(2)
             ctrl.videomanager.stopCamera()
+
+    if len(sys.argv) == 1 or ctrl.autoAnswer:
+        signal.signal(signal.SIGINT, ctrl.interruptHandler)
+        ctrl.run()
+        sys.exit(0)
+
diff --git a/tools/dringctrl/tester.py b/tools/dringctrl/tester.py
index a450b62db7c7f8e325817b048f46ebe3121dbab7..a9c4aed7646d9a51bcb382deb07459cf37decd97 100644
--- a/tools/dringctrl/tester.py
+++ b/tools/dringctrl/tester.py
@@ -21,7 +21,14 @@
 import sys
 import os
 import time
-import configparser
+
+try:
+    import configparser
+except ImportError as e:
+    import ConfigParser as configparser
+except Exception as e:
+    print(str(e))
+    exit(1)
 
 from threading import Thread
 from random import shuffle