diff --git a/ring-android/app/src/main/java/cx/ring/model/Codec.java b/ring-android/app/src/main/java/cx/ring/model/Codec.java
index 72cc8a6..58cc027 100644
--- a/ring-android/app/src/main/java/cx/ring/model/Codec.java
+++ b/ring-android/app/src/main/java/cx/ring/model/Codec.java
@@ -115,8 +115,8 @@
                 + "Channels: " + channels;
     }
 
-    public CharSequence getPayload() {
-        return Long.toString(payload);
+    public Long getPayload() {
+        return payload;
     }
 
     public CharSequence getName() {
diff --git a/ring-android/app/src/main/java/cx/ring/service/ConfigurationManagerCallback.java b/ring-android/app/src/main/java/cx/ring/service/ConfigurationManagerCallback.java
index cf691ab..6217a7e 100644
--- a/ring-android/app/src/main/java/cx/ring/service/ConfigurationManagerCallback.java
+++ b/ring-android/app/src/main/java/cx/ring/service/ConfigurationManagerCallback.java
@@ -73,14 +73,11 @@
         mService.sendBroadcast(intent);
     }
 
-    public IntVect configGetHardwareAudioFormat(){
-        IntVect result = new IntVect();
-
+    @Override
+    public void getHardwareAudioFormat(IntVect ret){
         OpenSlParams audioParams = OpenSlParams.createInstance(mService);
-        result.add(audioParams.getSampleRate());
-        result.add(audioParams.getBufferSize());
-
-        return result;
+        ret.add(audioParams.getSampleRate());
+        ret.add(audioParams.getBufferSize());
     }
 
 }
diff --git a/ring-android/app/src/main/java/cx/ring/service/SipService.java b/ring-android/app/src/main/java/cx/ring/service/SipService.java
index 575189c..820b001 100644
--- a/ring-android/app/src/main/java/cx/ring/service/SipService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/SipService.java
@@ -59,7 +59,12 @@
     private Runnable pollEvents = new Runnable() {
         @Override
         public void run() {
-            Ringservice.pollEvents();
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException {
+                    Ringservice.pollEvents();
+                }
+            });
             handler.postDelayed(this, POLLING_TIMEOUT);
         }
     };
@@ -69,7 +74,7 @@
     protected HistoryManager mHistoryManager;
     protected MediaManager mMediaManager;
 
-    private HashMap<String, Conference> mConferences = new HashMap<String, Conference>();
+    private HashMap<String, Conference> mConferences = new HashMap<>();
     private ConfigurationManagerCallback configurationCallback;
     private CallManagerCallBack callManagerCallBack;
 
@@ -201,12 +206,11 @@
         public void execute(Runnable task) {
             // TODO: add wakelock
             Message.obtain(SipServiceExecutor.this, 0/* don't care */, task).sendToTarget();
-            Log.w(TAG, "SenT!");
+            //Log.w(TAG, "SenT!");
         }
 
         @Override
         public void handleMessage(Message msg) {
-            Log.w(TAG, "handleMessage");
             if (msg.obj instanceof Runnable) {
                 executeInternal((Runnable) msg.obj);
             } else {
@@ -535,7 +539,7 @@
         // Hashmap runtime cast
         @Override
         public void setAccountDetails(final String accountId, final Map map) {
-            final StringMap swigmap = new StringMap(map);
+            final StringMap swigmap = StringMap.toSwig(map);
 
             getExecutor().execute(new SipRunnable() {
                 @Override
@@ -585,7 +589,7 @@
                 }
             }
 
-            final StringMap swigmap = new StringMap(map);
+            final StringMap swigmap = StringMap.toSwig(map);
 
             AddAccount runInstance = new AddAccount(swigmap);
             getExecutor().execute(runInstance);
@@ -983,9 +987,8 @@
                     for (int i = 0; i < payloads.size(); ++i) {
                         boolean isActive = false;
                         for (Codec co : results) {
-                            if (co.getPayload().toString().contentEquals(String.valueOf(payloads.get(i))))
+                            if (co.getPayload() == payloads.get(i))
                                 isActive = true;
-
                         }
                         if (isActive)
                             continue;
@@ -1178,7 +1181,7 @@
                     Log.i(TAG, "SipService.setActiveAudioCodecList() thread running...");
                     UintVect list = new UintVect();
                     for (Object codec : codecs) {
-                        list.add((Integer) codec);
+                        list.add((Long) codec);
                     }
                     Ringservice.setActiveCodecList(accountID, list);
                 }
diff --git a/ring-android/app/src/main/java/cx/ring/utils/SwigNativeConverter.java b/ring-android/app/src/main/java/cx/ring/utils/SwigNativeConverter.java
index 3793644..0aa76e6 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/SwigNativeConverter.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/SwigNativeConverter.java
@@ -54,7 +54,7 @@
         VectMap toReturn = new VectMap();
 
         for (HashMap<String, String> aTodecode : todecode) {
-            toReturn.add(new StringMap(aTodecode));
+            toReturn.add(StringMap.toSwig(aTodecode));
         }
         return toReturn;
     }
@@ -76,7 +76,7 @@
     }
 
     public static ArrayList<String> convertSwigToNative(StringVect vector) {
-        ArrayList<String> toReturn = new ArrayList<String>();
+        ArrayList<String> toReturn = new ArrayList<>();
         for (int i = 0; i < vector.size(); ++i) {
             toReturn.add(vector.get(i));
         }
diff --git a/ring-android/app/src/main/jni/configurationmanager.i b/ring-android/app/src/main/jni/configurationmanager.i
index 6374257..e6ae5f6 100644
--- a/ring-android/app/src/main/jni/configurationmanager.i
+++ b/ring-android/app/src/main/jni/configurationmanager.i
@@ -49,7 +49,7 @@
     virtual void certificateStateChanged(const std::string& /*account_id*/, const std::string& /*certId*/, const std::string& /*state*/){}
 
     virtual void errorAlert(int alert){}
-    virtual std::vector<int32_t> configGetHardwareAudioFormat(void){}
+    virtual void getHardwareAudioFormat(std::vector<int32_t>* /*params_ret*/){}
 };
 %}
 
@@ -186,5 +186,5 @@
     virtual void certificateStateChanged(const std::string& /*account_id*/, const std::string& /*certId*/, const std::string& /*state*/){}
 
     virtual void errorAlert(int alert){}
-    virtual std::vector<int32_t> configGetHardwareAudioFormat(void){}
+    virtual void getHardwareAudioFormat(std::vector<int32_t>* /*params_ret*/){}
 };
\ No newline at end of file
diff --git a/ring-android/app/src/main/jni/jni_interface.i b/ring-android/app/src/main/jni/jni_interface.i
index 153200b..bb32d6d 100644
--- a/ring-android/app/src/main/jni/jni_interface.i
+++ b/ring-android/app/src/main/jni/jni_interface.i
@@ -63,62 +63,64 @@
 
 namespace std {
 
-    %typemap(javacode) map<string, string> %{
-      public $javaclassname(java.util.Map<String,String> in) {
-        for (java.util.Map.Entry<String, String> entry : in.entrySet()) {
-          this.set(entry.getKey(), entry.getValue());
-        }
-      }
-      public java.util.Map<String,String> toNative() {
-        java.util.Map<String,String> out = new java.util.HashMap<String,String>();
-        StringVect keys = keys();
-        for (String s : keys)
-          out.put(s, get(s));
-        return out;
-      }
-    %}
-    %extend map<string, string> {
-        std::vector<std::string> keys() const {
-            std::vector<std::string> k;
-            k.reserve($self->size());
-            for (const auto& i : *$self)
-                k.push_back(i.first);
-            return k;
-        }
+%typemap(javacode) map<string, string> %{
+  public static $javaclassname toSwig(java.util.Map<String,String> in) {
+    $javaclassname n = new $javaclassname();
+    for (java.util.Map.Entry<String, String> entry : in.entrySet()) {
+      n.set(entry.getKey(), entry.getValue());
     }
-    %template(StringMap) map<string, string>;
-
-    %typemap(javabase) vector<string> "java.util.AbstractList<String>"
-    %typemap(javainterface) vector<string> "java.util.RandomAccess"
-    %extend vector<string> {
-      value_type set(int i, const value_type& in) throw (std::out_of_range) {
-        const std::string old = $self->at(i);
-        $self->at(i) = in;
-        return old;
-      }
-      bool add(const value_type& in) {
-          $self->push_back(in);
-          return true;
-      }
-      int32_t size() const {
-        return $self->size();
-      }
+    return n;
+  }
+  public java.util.Map<String,String> toNative() {
+    java.util.Map<String,String> out = new java.util.HashMap<String,String>();
+    StringVect keys = keys();
+    for (String s : keys)
+      out.put(s, get(s));
+    return out;
+  }
+%}
+%extend map<string, string> {
+    std::vector<std::string> keys() const {
+        std::vector<std::string> k;
+        k.reserve($self->size());
+        for (const auto& i : *$self)
+            k.push_back(i.first);
+        return k;
     }
-    %template(StringVect) vector<string>;
+}
+%template(StringMap) map<string, string>;
 
-    %typemap(javacode) vector< map<string,string> > %{
-      public java.util.ArrayList<java.util.Map<String, String>> toNative() {
-        java.util.ArrayList<java.util.Map<String, String>> out = new java.util.ArrayList<>();
-        for (int i = 0; i < size(); ++i)
-          out.add(get(i).toNative());
-        return out;
-      }
-    %}
-    %template(VectMap) vector< map<string,string> >;
-    %template(IntegerMap) map<string,int>;
-    %template(IntVect) vector<int32_t>;
-    %template(UintVect) vector<uint32_t>;
-    %template(Blob) vector<uint8_t>;
+%typemap(javabase) vector<string> "java.util.AbstractList<String>"
+%typemap(javainterface) vector<string> "java.util.RandomAccess"
+%extend vector<string> {
+  value_type set(int i, const value_type& in) throw (std::out_of_range) {
+    const std::string old = $self->at(i);
+    $self->at(i) = in;
+    return old;
+  }
+  bool add(const value_type& in) {
+    $self->push_back(in);
+    return true;
+  }
+  int32_t size() const {
+    return $self->size();
+  }
+}
+%template(StringVect) vector<string>;
+
+%typemap(javacode) vector< map<string,string> > %{
+  public java.util.ArrayList<java.util.Map<String, String>> toNative() {
+    java.util.ArrayList<java.util.Map<String, String>> out = new java.util.ArrayList<>();
+    for (int i = 0; i < size(); ++i)
+      out.add(get(i).toNative());
+    return out;
+  }
+%}
+%template(VectMap) vector< map<string,string> >;
+%template(IntegerMap) map<string,int>;
+%template(IntVect) vector<int32_t>;
+%template(UintVect) vector<uint32_t>;
+%template(Blob) vector<uint8_t>;
 }
 
 /* not parsed by SWIG but needed by generated C files */
@@ -194,6 +196,7 @@
         exportable_callback<ConfigurationSignal::CertificatePathPinned>(bind(&ConfigurationCallback::certificatePathPinned, confM, _1, _2 )),
         exportable_callback<ConfigurationSignal::CertificateExpired>(bind(&ConfigurationCallback::certificateExpired, confM, _1 )),
         exportable_callback<ConfigurationSignal::CertificateStateChanged>(bind(&ConfigurationCallback::certificateStateChanged, confM, _1, _2, _3 )),
+        exportable_callback<ConfigurationSignal::GetHardwareAudioFormat>(bind(&ConfigurationCallback::getHardwareAudioFormat, confM, _1 )),
     };
 
 /*
