diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 94afa54..3ab830e 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -114,6 +114,7 @@
         callFilter.addAction(CallManagerCallBack.CONF_CREATED);
         callFilter.addAction(CallManagerCallBack.CONF_REMOVED);
         callFilter.addAction(CallManagerCallBack.CONF_CHANGED);
+        callFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
         receiver = new IncomingReceiver(this, mBinder);
         LocalBroadcastManager.getInstance(this).registerReceiver(receiver, callFilter);
 
@@ -771,28 +772,29 @@
         }
 
         @Override
-        public List getConferenceList() throws RemoteException {
-            class ConfList extends SipRunnableWithReturn {
-                @Override
-                protected StringVect doRun() throws SameThreadException {
-                    Log.i(TAG, "SipService.getConferenceList() thread running...");
-                    return callManagerJNI.getConferenceList();
-                }
-            }
-            ;
-            ConfList runInstance = new ConfList();
-            getExecutor().execute(runInstance);
-            while (!runInstance.isDone()) {
-                // Log.w(TAG, "Waiting for getConferenceList");
-            }
-            StringVect swigvect = (StringVect) runInstance.getVal();
-
-            ArrayList<String> nativelist = new ArrayList<String>();
-
-            for (int i = 0; i < swigvect.size(); i++)
-                nativelist.add(swigvect.get(i));
-
-            return nativelist;
+        public HashMap<String, Conference> getConferenceList() throws RemoteException {
+//            class ConfList extends SipRunnableWithReturn {
+//                @Override
+//                protected StringVect doRun() throws SameThreadException {
+//                    Log.i(TAG, "SipService.getConferenceList() thread running...");
+//                    return callManagerJNI.getConferenceList();
+//                }
+//            }
+//            ;
+//            ConfList runInstance = new ConfList();
+//            getExecutor().execute(runInstance);
+//            while (!runInstance.isDone()) {
+//                // Log.w(TAG, "Waiting for getConferenceList");
+//            }
+//            StringVect swigvect = (StringVect) runInstance.getVal();
+//
+//            ArrayList<String> nativelist = new ArrayList<String>();
+//
+//            for (int i = 0; i < swigvect.size(); i++)
+//                nativelist.add(swigvect.get(i));
+//
+//            return nativelist;
+            return current_confs;
         }
 
         @Override
@@ -880,6 +882,26 @@
         }
         
         @Override
+        public boolean isRecording(final String id) throws RemoteException {
+            class IsRecording extends SipRunnableWithReturn {
+
+                @Override
+                protected Boolean doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.isRecording() thread running...");
+                    return callManagerJNI.getIsRecording(id);
+                }
+            }
+
+            IsRecording runInstance = new IsRecording();
+            getExecutor().execute(runInstance);
+            while (!runInstance.isDone()) {
+            }
+
+            return (Boolean) runInstance.getVal();
+            
+        }
+        
+        @Override
         public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
             getExecutor().execute(new SipRunnable() {
                 @Override
@@ -1027,6 +1049,24 @@
             nm.cancel(NOTIFICATION_ID);
         }
 
+        @Override
+        public Conference getCurrentCall() throws RemoteException {
+            for(SipCall i : current_calls.values()){
+                if(i.isOngoing()){
+                    Conference tmp = new Conference("-1");
+                    tmp.getParticipants().add(i);
+                    return tmp;
+                }
+            }
+            
+            if(!current_confs.isEmpty()){
+                return (Conference) current_confs.values().toArray()[0];
+            }
+            return null;
+        }
+
+        
+
 
 
     };
