diff --git a/Makefile b/Makefile
index 8d05653..c453178 100644
--- a/Makefile
+++ b/Makefile
@@ -7,9 +7,9 @@
 SRC=sflphone-android
 JAVA_SOURCES=$(SRC)/src/org/sflphone/*.java
 JNI_SOURCES=$(SRC)/jni/*.c $(SRC)/jni/*.h
-LIBVLCJNI=$(SRC)/obj/local/$(ARCH)/libsflphone.so \
 
-LIBVLCJNI_H=$(SRC)/jni/libvlcjni.h
+LIBSFLPHONEJNI=$(SRC)/obj/local/$(ARCH)/libsflphone.so
+LIBSFLPHONEJNI_H=$(SRC)/sflphone/daemon/src/sflphone.h
 
 ifneq ($(V),)
 ANT_OPTS += -v
@@ -30,7 +30,7 @@
 NDK_DEBUG=1
 endif
 
-$(SFLPHONE_APK): $(LIBVLCJNI) $(JAVA_SOURCES)
+$(SFLPHONE_APK): $(LIBSFLPHONEJNI) $(JAVA_SOURCES)
 	@echo
 	@echo "=== Building $@ for $(ARCH) ==="
 	@echo
@@ -42,10 +42,10 @@
 
 SFLPHONE_MODULES=`./find_modules.sh $(SFLPHONE_BUILD_DIR)`
 
-$(LIBVLCJNI_H):
+$(LIBSFLPHONEJNI_H):
 	$(VERBOSE)if [ -z "$(SFLPHONE_BUILD_DIR)" ]; then echo "SFLPHONE_BUILD_DIR not defined" ; exit 1; fi
 	$(GEN)modules="$(SFLPHONE_MODULES)" ; \
-	if [ -z "$$modules" ]; then echo "No VLC modules found in $(SFLPHONE_BUILD_DIR)/modules"; exit 1; fi; \
+	if [ -z "$$modules" ]; then echo "No SFLPHONE modules found in $(SFLPHONE_BUILD_DIR)/modules"; exit 1; fi; \
 	DEFINITION=""; \
 	BUILTINS="const void *vlc_static_modules[] = {\n"; \
 	for file in $$modules; do \
@@ -57,11 +57,11 @@
 	printf "/* Autogenerated from the list of modules */\n $$DEFINITION\n $$BUILTINS\n" > $@
 
 
-$(LIBVLCJNI): $(JNI_SOURCES) $(LIBVLCJNI_H)
+$(LIBSFLPHONEJNI): $(JNI_SOURCES) $(LIBSFLPHONEJNI_H)
 	@if [ -z "$(SFLPHONE_BUILD_DIR)" ]; then echo "SFLPHONE_BUILD_DIR not defined" ; exit 1; fi
 	@if [ -z "$(ANDROID_NDK)" ]; then echo "ANDROID_NDK not defined" ; exit 1; fi
 	@echo
-	@echo "=== Building libvlcjni ==="
+	@echo "=== Building libsflphonejni ==="
 	@echo
 	$(VERBOSE)if [ -z "$(SFLPHONE_SRC_DIR)" ] ; then SFLPHONE_SRC_DIR=./vlc; fi ; \
 	if [ -z "$(SFLPHONE_CONTRIB)" ] ; then SFLPHONE_CONTRIB="$$SFLPHONE_SRC_DIR/contrib/$(TARGET_TUPLE)"; fi ; \
@@ -90,7 +90,7 @@
 	rm -rf $(SRC)/gen java-libs/*/gen java-libs/*/bin .sdk vlc-sdk/ vlc-sdk.7z
 
 jniclean: lightclean
-	rm -f $(LIBVLCJNI) $(LIBVLCJNI_H)
+	rm -f $(LIBSFLPHONEJNI) $(LIBSFLPHONEJNI_H)
 
 distclean: clean jniclean
 
diff --git a/configure.sh b/configure.sh
index 548ab15..0beeccf 100755
--- a/configure.sh
+++ b/configure.sh
@@ -14,7 +14,7 @@
 # folder.
 ANDROID_API=android-9
 
-VLC_SOURCEDIR=..
+SFLPHONE_SOURCEDIR=sflphone/daemon
 
 CFLAGS="-g -O2 -fstrict-aliasing -funsafe-math-optimizations"
 if [ -n "$HAVE_ARM" ]; then
diff --git a/sflphone-android/jni/JavaJNI2CJNI_Load.py b/sflphone-android/jni/JavaJNI2CJNI_Load.py
new file mode 100755
index 0000000..941f066
--- /dev/null
+++ b/sflphone-android/jni/JavaJNI2CJNI_Load.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+import getopt, sys
+import re
+from string import Template
+
+def type_to_signature(itype):
+	if len(itype) > 2:
+		if itype[-2:] == '[]':
+			return "[%s" % type_to_signature(itype[:-2])
+	if itype == "int":
+		return "I"
+	if itype == "long":
+		return "J"
+	if itype == "void":
+		return "V"
+	if itype == "boolean":
+		return "Z"
+	if itype == "byte":
+		return "B"
+	if itype == "char":
+		return "C"
+	if itype == "short":
+		return "S"
+	if itype == "float":
+		return "F"
+	if itype == "double":
+		return "D"
+	if itype == "String":
+		return "Ljava/lang/String;"
+	if itype == "Object":
+		return "Ljava/lang/Object;"
+	return "Lorg/sflphone/service/%s;" % itype
+
+def parse_java_file(input_stream, package, module):
+	outputs = []
+	package_prefix = "Java_%s_%sJNI" % (package.replace(".", "_"), module)
+	for line in input_stream:
+		definition = re.match(r'.*public final static native ([^\( ]*) ([^\)]*)\(([^)]*)\).*',line)
+		if definition is not None:
+			retour = definition.group(1)
+			name = definition.group(2)
+			args = definition.group(3)
+			args_sigs = []
+			args_frags = args.split(',')
+			for args_frag in args_frags:
+				argf = re.match(r'(\b)?([^ ]+) .*', args_frag.strip())
+				if argf is not None:
+					args_sigs.append(type_to_signature(argf.group(2)))
+			sig = "(%s)%s" % (''.join(args_sigs), type_to_signature(retour))
+			outputs.append("{\"%s\", \"%s\", (void*)& %s_%s}" % (name, sig, package_prefix, name.replace('_', '_1')))
+	return outputs
+
+def render_to_template(defs, template_string):
+	template = Template(template_string)
+	return template.substitute(defs= ",\r\n".join(defs) )
+
+
+if __name__ == "__main__":
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], "i:o:t:m:p:", ["input=", "output=", "template=", "module=", "package="])
+	except getopt.GetoptError, err:
+		# print help information and exit:
+		print str(err) # will print something like "option -a not recognized"
+		sys.exit(2)
+	input_stream = None
+	output_file = None
+	template_string = None
+	package = ""
+	module = ""
+	for o, a in opts:
+		if o in ("-i", "--input"):
+			input_stream = open(a)
+		if o in ("-o", "--output"):
+			output_file = open(a, "w")
+		if o in ("-t", "--template"):
+			template_string = open(a).read()
+		if o in ("-m", "--module"):
+			module = a
+		if o in ("-p", "--package"):
+			package = a
+
+	defs = parse_java_file(input_stream, package, module)
+	output_file.write(render_to_template(defs, template_string))
+	output_file.close()
+	input_stream.close()
diff --git a/sflphone-android/jni/callmanager.i b/sflphone-android/jni/callmanager.i
new file mode 100644
index 0000000..a1d168f
--- /dev/null
+++ b/sflphone-android/jni/callmanager.i
@@ -0,0 +1,403 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
+ *          Alexandre Lision <alexnadre.L@savoirfairelinux.com>
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+%header %{
+
+#include "client/callmanager.h"
+
+
+typedef struct callmanager_callback
+{
+    void (*on_new_call_created)(const std::string& accountID,
+                                const std::string& callID,
+                                const std::string& to);
+
+    void (*on_call_state_changed)(const std::string& callID,
+                                  const std::string& state);
+
+    void (*on_incoming_call)(const std::string& accountID,
+                             const std::string& callID,
+                             const std::string& from);
+
+    void (*on_transfer_state_changed) (const std::string& result);
+
+    void (*on_conference_created) (const std::string& confID);
+
+    void (*on_conference_removed) (const std::string& confID);
+
+    void (*on_conference_state_changed) (const std::string& confID,
+                                          const std::string& state);
+
+    void (*on_incoming_message) (const std::string& ID,
+                                    const std::string& from,
+                                    const std::string& msg);
+
+    void (*on_record_playback_filepath) (const std::string& id,
+                                         const std::string& filename);
+
+    void (*on_recording_state_changed) (const std::string& callID,
+                                        const bool& state);
+
+    void (*newPresSubClientNotification) (const std::string& uri,
+											const std::string& basic,
+											const std::string& note);
+
+	void (*newPresSubServerRequest) (const std::string& remote);
+
+    void (*on_secure_sdes_on) (const std::string& callID);
+
+    void (*on_secure_sdes_off) (const std::string& callID);
+
+    void (*on_secure_zrtp_on) (const std::string& callID,
+                                const std::string& cipher);
+
+    void (*on_secure_zrtp_off) (const std::string& callID);
+
+    void (*on_show_sas) (const std::string& callID,
+                        const std::string& sas,
+                        const bool& verified);
+
+    void (*on_zrtp_not_supported) (const std::string& callID);
+
+    void (*on_zrtp_negociation_failed) (const std::string& callID,
+                                                const std::string& reason,
+                                                const std::string& severity);
+
+    void (*on_rtcp_report_received) (const std::string& callID,
+                                    const std::map<std::string, int>& stats);
+
+} callmanager_callback_t;
+
+
+class Callback {
+public:
+    virtual ~Callback() {}
+
+    virtual void on_new_call_created(const std::string& arg1,
+                                     const std::string& arg2,
+                                     const std::string& arg3) {}
+
+    virtual void on_call_state_changed(const std::string& arg1,
+                                       const std::string& arg2) {}
+
+    virtual void on_incoming_call(const std::string& arg1,
+                                  const std::string& arg2,
+                                  const std::string& arg3) {}
+
+    virtual void on_transfer_state_changed (const std::string& arg1) {}
+
+    virtual void on_conference_created (const std::string& arg1) {}
+
+    virtual void on_conference_removed (const std::string& arg1) {}
+
+    virtual void on_conference_state_changed (const std::string& arg1,
+                                            const std::string& arg2) {}
+
+    virtual void on_incoming_message(const std::string& ID,
+                                    const std::string& from,
+                                    const std::string& msg) {}
+
+    virtual void on_record_playback_filepath(const std::string& id,
+                                              const std::string& filename) {}
+
+    virtual void on_recording_state_changed(const std::string& callID,
+                                        const bool& state) {}
+
+    virtual void newPresSubClientNotification(const std::string& uri,
+                                                const std::string& basic,
+                                                const std::string& note) {}
+
+    virtual void newPresSubServerRequest(const std::string& remote) {}
+
+    virtual void on_secure_sdes_on(const std::string& callID) {}
+
+    virtual void on_secure_sdes_off(const std::string& callID) {}
+
+    virtual void on_secure_zrtp_on(const std::string& callID,
+                                const std::string& cipher) {}
+
+    virtual void on_secure_zrtp_off(const std::string& callID) {}
+
+    virtual void on_show_sas(const std::string& callID,
+                        const std::string& sas,
+                        const bool& verified) {}
+
+    virtual void on_zrtp_not_supported(const std::string& callID) {}
+
+    virtual void on_zrtp_negociation_failed(const std::string& callID,
+                                                const std::string& reason,
+                                                const std::string& severity) {}
+
+    virtual void on_rtcp_report_received (const std::string& callID,
+                                    const std::map<std::string, int>& stats) {}
+};
+
+
+static Callback* registeredCallbackObject = NULL;
+
+void on_new_call_created_wrapper (const std::string& accountID,
+                                  const std::string& callID,
+                                  const std::string& to) {
+    registeredCallbackObject->on_new_call_created(accountID, callID, to);
+}
+
+void on_call_state_changed_wrapper(const std::string& callID,
+                           const std::string& state) {
+    registeredCallbackObject->on_call_state_changed(callID, state);
+}
+
+void on_incoming_call_wrapper (const std::string& accountID,
+                               const std::string& callID,
+                               const std::string& from) {
+    registeredCallbackObject->on_incoming_call(accountID, callID, from);
+}
+
+void on_transfer_state_changed_wrapper (const std::string& result) {
+    registeredCallbackObject->on_transfer_state_changed(result);
+}
+
+void on_conference_created_wrapper (const std::string& confID) {
+    registeredCallbackObject->on_conference_created(confID);
+}
+
+void on_conference_removed_wrapper (const std::string& confID) {
+    registeredCallbackObject->on_conference_removed(confID);
+}
+
+void on_conference_state_changed_wrapper (const std::string& confID,
+                                          const std::string& state) {
+    registeredCallbackObject->on_conference_state_changed(confID, state);
+}
+
+void on_incoming_message_wrapper(const std::string& ID, const std::string& from, const std::string& msg) {
+    registeredCallbackObject->on_incoming_message(ID, from, msg);
+}
+
+void on_record_playback_filepath_wrapper(const std::string& id, const std::string& filename) {
+    registeredCallbackObject->on_record_playback_filepath(id, filename);
+}
+
+void on_recording_state_changed_wrapper(const std::string& callID, const bool& state) {
+    registeredCallbackObject->on_recording_state_changed(callID, state);
+}
+
+void on_newPresSubClientNotification_wrapper(const std::string& uri, const std::string& basic, const std::string& note) {
+    registeredCallbackObject->newPresSubClientNotification(uri, basic, note);
+}
+
+void on_newPresSubServerRequest_wrapper(const std::string& remote) {
+    registeredCallbackObject->newPresSubServerRequest(remote);
+}
+
+void on_secure_sdes_on_wrapper(const std::string& callID){
+    registeredCallbackObject->on_secure_sdes_on(callID);
+}
+
+void on_secure_sdes_off_wrapper(const std::string& callID) {
+    registeredCallbackObject->on_secure_sdes_off(callID);
+}
+
+void on_secure_zrtp_on_wrapper(const std::string& callID,const std::string& cipher){
+    registeredCallbackObject->on_secure_zrtp_on(callID, cipher);
+}
+
+void on_secure_zrtp_off_wrapper(const std::string& callID){
+    registeredCallbackObject->on_secure_zrtp_off(callID);
+}
+
+void on_show_sas_wrapper(const std::string& callID, const std::string& sas, const bool& verified){
+    registeredCallbackObject->on_show_sas(callID, sas, verified);
+}
+
+void on_zrtp_not_supported_wrapper(const std::string& callID){
+    registeredCallbackObject->on_zrtp_not_supported(callID);
+}
+
+void on_zrtp_negociation_failed_wrapper(const std::string& callID, const std::string& reason, const std::string& severity){
+    registeredCallbackObject->on_zrtp_negociation_failed(callID, reason, severity);
+}
+
+void on_rtcp_report_received_wrapper (const std::string& callID, const std::map<std::string, int>& stats){
+    registeredCallbackObject->on_rtcp_report_received(callID, stats);
+}
+
+static struct callmanager_callback wrapper_callback_struct = {
+    &on_new_call_created_wrapper,
+    &on_call_state_changed_wrapper,
+    &on_incoming_call_wrapper,
+    &on_transfer_state_changed_wrapper,
+    &on_conference_created_wrapper,
+    &on_conference_removed_wrapper,
+    &on_conference_state_changed_wrapper,
+    &on_incoming_message_wrapper,
+    &on_record_playback_filepath_wrapper,
+    &on_recording_state_changed_wrapper,
+    &on_newPresSubClientNotification_wrapper,
+    &on_newPresSubServerRequest_wrapper,
+    &on_secure_sdes_on_wrapper,
+    &on_secure_sdes_off_wrapper,
+    &on_secure_zrtp_on_wrapper,
+    &on_secure_zrtp_off_wrapper,
+    &on_show_sas_wrapper,
+    &on_zrtp_not_supported_wrapper,
+    &on_zrtp_negociation_failed_wrapper,
+    &on_rtcp_report_received_wrapper
+};
+
+void setCallbackObject(Callback* callback) {
+    registeredCallbackObject = callback;
+}
+
+%}
+
+%feature("director") Callback;
+
+class CallManager {
+public:
+    bool placeCall(const std::string& accountID, const std::string& callID, const std::string& to);
+
+    bool refuse(const std::string& callID);
+    bool accept(const std::string& callID);
+    bool hangUp(const std::string& callID);
+    bool hold(const std::string& callID);
+    bool unhold(const std::string& callID);
+    bool transfer(const std::string& callID, const std::string& to);
+    bool attendedTransfer(const std::string& transferID, const std::string& targetID);
+    std::map< std::string, std::string > getCallDetails(const std::string& callID);
+    std::vector< std::string > getCallList();
+
+    /* Conference related methods */
+    void removeConference(const std::string& conference_id);
+    bool joinParticipant(const std::string& sel_callID, const std::string& drag_callID);
+    void createConfFromParticipantList(const std::vector< std::string >& participants);
+    bool isConferenceParticipant(const std::string& call_id);
+    bool addParticipant(const std::string& callID, const std::string& confID);
+    bool addMainParticipant(const std::string& confID);
+    bool detachParticipant(const std::string& callID);
+    bool joinConference(const std::string& sel_confID, const std::string& drag_confID);
+    bool hangUpConference(const std::string& confID);
+    bool holdConference(const std::string& confID);
+    bool unholdConference(const std::string& confID);
+    std::vector<std::string> getConferenceList();
+    std::vector<std::string> getParticipantList(const std::string& confID);
+    std::string getConferenceId(const std::string& callID);
+    std::map<std::string, std::string> getConferenceDetails(const std::string& callID);
+
+    /* File Playback methods */
+    bool startRecordedFilePlayback(const std::string& filepath);
+    void stopRecordedFilePlayback(const std::string& filepath);
+
+    /* General audio methods */
+    bool toggleRecording(const std::string& callID);
+    void recordPlaybackSeek(const double& value);
+    bool getIsRecording(const std::string& callID);
+    std::string getCurrentAudioCodecName(const std::string& callID);
+    void playDTMF(const std::string& key);
+    void startTone(const int32_t& start, const int32_t& type);
+
+    /* Security related methods */
+    void setSASVerified(const std::string& callID);
+    void resetSASVerified(const std::string& callID);
+    void setConfirmGoClear(const std::string& callID);
+    void requestGoClear(const std::string& callID);
+    void acceptEnrollment(const std::string& callID, const bool& accepted);
+
+    /* Instant messaging */
+    void sendTextMessage(const std::string& callID, const std::string& message);
+};
+
+class Callback {
+public:
+    virtual ~Callback();
+
+    virtual void on_new_call_created(const std::string& arg1,
+                                     const std::string& arg2,
+                                     const std::string& arg3);
+
+    virtual void on_call_state_changed(const std::string& arg1,
+                                       const std::string& arg2);
+
+    virtual void on_incoming_call(const std::string& arg1,
+                                  const std::string& arg2,
+                                  const std::string& arg3);
+
+    virtual void on_transfer_state_changed(const std::string& arg1);
+
+    virtual void on_conference_created(const std::string& arg1);
+
+    virtual void on_conference_removed(const std::string& arg1);
+
+    virtual void on_conference_state_changed(const std::string& arg1,
+                                              const std::string& arg2);
+
+    virtual void on_incoming_message(const std::string& ID,
+                                    const std::string& from,
+                                    const std::string& msg);
+
+    virtual void on_record_playback_filepath(const std::string& id,
+                                            const std::string& filename);
+
+    virtual void on_recording_state_changed(const std::string& callID,
+                                            const bool& state);
+
+    virtual void newPresSubClientNotification(const std::string& uri,
+                                            const std::string& basic,
+                                            const std::string& note);
+
+    virtual void newPresSubServerRequest(const std::string& remote);
+
+    virtual void on_secure_sdes_on(const std::string& callID);
+
+    virtual void on_secure_sdes_off(const std::string& callID);
+
+    virtual void on_secure_zrtp_on(const std::string& callID,
+                                const std::string& cipher);
+
+    virtual void on_secure_zrtp_off(const std::string& callID);
+
+    virtual void on_show_sas(const std::string& callID,
+                        const std::string& sas,
+                        const bool& verified);
+
+    virtual void on_zrtp_not_supported(const std::string& callID);
+
+    virtual void on_zrtp_negociation_failed(const std::string& callID,
+                                                const std::string& reason,
+                                                const std::string& severity);
+
+    virtual void on_rtcp_report_received (const std::string& callID,
+                                    const std::map<std::string, int>& stats);
+};
+
+static Callback* registeredCallbackObject = NULL;
+
+void setCallbackObject(Callback* callback) {
+    registeredCallbackObject = callback;
+}
diff --git a/sflphone-android/jni/callmanager_jni.cpp b/sflphone-android/jni/callmanager_jni.cpp
new file mode 100644
index 0000000..4adbad1
--- /dev/null
+++ b/sflphone-android/jni/callmanager_jni.cpp
@@ -0,0 +1,152 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
+ *  Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com>
+ *  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include "client/callmanager.h"
+#include "jni_callbacks.h"
+
+CallManager::CallManager()
+{}
+
+void CallManager::callStateChanged(const std::string& callID, const std::string& state)
+{
+    on_call_state_changed_wrapper(callID, state);
+}
+
+void CallManager::transferFailed()
+{
+
+}
+
+void CallManager::transferSucceeded()
+{
+
+}
+
+void CallManager::recordPlaybackStopped(const std::string& path)
+{
+
+}
+
+void CallManager::voiceMailNotify(const std::string& callID, const int32_t& nd_msg)
+{
+
+}
+
+void CallManager::incomingMessage(const std::string& ID, const std::string& from, const std::string& msg)
+{
+    on_incoming_message_wrapper(ID, from, msg);
+}
+
+void CallManager::incomingCall(const std::string& accountID, const std::string& callID, const std::string& from)
+{
+    on_incoming_call_wrapper(accountID, callID, from);
+}
+
+void CallManager::recordPlaybackFilepath(const std::string& id, const std::string& filename)
+{
+    on_record_playback_filepath_wrapper(id, filename);
+}
+
+void CallManager::conferenceCreated(const std::string& confID)
+{
+    on_conference_created_wrapper(confID);
+}
+
+void CallManager::conferenceChanged(const std::string& confID,const std::string& state)
+{
+    on_conference_state_changed_wrapper(confID, state);
+}
+
+void CallManager::conferenceRemoved(const std::string& confID)
+{
+    on_conference_removed_wrapper(confID);
+}
+
+void CallManager::newCallCreated(const std::string& accountID, const std::string& callID, const std::string& to)
+{
+    on_new_call_created_wrapper(accountID, callID, to);
+}
+
+void CallManager::sipCallStateChanged(const std::string& accoundID, const std::string& state, const int32_t& code)
+{
+
+}
+
+void CallManager::recordingStateChanged(const std::string& callID, const bool& state)
+{
+    on_recording_state_changed_wrapper(callID, state);
+}
+
+void CallManager::updatePlaybackScale(const std::string&, const int32_t&, const int32_t&)
+{
+
+}
+
+void CallManager::secureSdesOn(std::string const& callID)
+{
+    on_secure_sdes_on_wrapper(callID);
+}
+
+void CallManager::secureSdesOff(std::string const& callID)
+{
+    on_secure_sdes_off_wrapper(callID);
+}
+
+void CallManager::secureZrtpOn(const std::string& callID, const std::string& cipher)
+{
+    on_secure_zrtp_on_wrapper(callID, cipher);
+}
+
+void CallManager::secureZrtpOff(const std::string& callID)
+{
+    on_secure_zrtp_off_wrapper(callID);
+}
+
+void CallManager::showSAS(const std::string& callID, const std::string& sas, const bool& verified)
+{
+    on_show_sas_wrapper(callID, sas, verified);
+}
+
+void CallManager::zrtpNotSuppOther(const std::string& callID)
+{
+    on_zrtp_not_supported_wrapper(callID);
+}
+
+void CallManager::zrtpNegotiationFailed(const std::string& callID, const std::string& reason, const std::string& severity)
+{
+    on_zrtp_negociation_failed_wrapper(callID, reason, severity);
+}
+
+void CallManager::onRtcpReportReceived(const std::string& callID, const std::map<std::string, int>& stats)
+{
+    on_rtcp_report_received_wrapper(callID, stats);
+}
diff --git a/sflphone-android/jni/configurationmanager.i b/sflphone-android/jni/configurationmanager.i
new file mode 100644
index 0000000..329ab0c
--- /dev/null
+++ b/sflphone-android/jni/configurationmanager.i
@@ -0,0 +1,184 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+%header %{
+#include "client/configurationmanager.h"
+
+typedef struct configurationmanager_callback
+{
+    void (*on_accounts_changed)(void);
+    void (*on_account_state_changed)(const std::string& accountID, const int32_t& state);
+    void (*on_account_state_changed_with_code)(const std::string& accountID, const std::string& state, const int32_t& code);
+    std::vector<int32_t> (*get_hardware_audio_format)(void);
+} configurationmanager_callback_t;
+
+
+class ConfigurationCallback {
+public:
+    virtual ~ConfigurationCallback() {}
+    virtual void on_accounts_changed(void) {}
+    virtual void on_account_state_changed(const std::string& accountID, const int32_t& state) {}
+    virtual void on_account_state_changed_with_code(const std::string& accountID, const std::string& state, const int32_t& code) {}
+    virtual std::vector<int32_t> get_hardware_audio_format(void) {}
+};
+
+static ConfigurationCallback *registeredConfigurationCallbackObject = NULL;
+
+void on_accounts_changed_wrapper (void) {
+    registeredConfigurationCallbackObject->on_accounts_changed();
+}
+
+void on_account_state_changed_wrapper (const std::string& accountID, const int32_t& state) {
+    registeredConfigurationCallbackObject->on_account_state_changed(accountID, state);
+}
+
+void on_account_state_changed_with_code_wrapper (const std::string& accountID, const std::string& state, const int32_t& code) {
+    registeredConfigurationCallbackObject->on_account_state_changed_with_code(accountID, state, code);
+}
+
+std::vector<int32_t> get_hardware_audio_format_wrapper(void) {
+    return registeredConfigurationCallbackObject->get_hardware_audio_format();
+}
+
+static struct configurationmanager_callback wrapper_configurationcallback_struct = {
+    &on_accounts_changed_wrapper,
+    &on_account_state_changed_wrapper,
+    &on_account_state_changed_with_code_wrapper,
+    &get_hardware_audio_format_wrapper
+};
+
+void setConfigurationCallbackObject(ConfigurationCallback *callback) {
+    registeredConfigurationCallbackObject = callback;
+}
+
+%}
+
+%feature("director") ConfigurationCallback;
+
+class ConfigurationManager {
+public:
+    std::map< std::string, std::string > getAccountDetails(const std::string& accountID);
+    void setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details);
+    std::map<std::string, std::string> getAccountTemplate();
+    std::string addAccount(const std::map< std::string, std::string >& details);
+    void removeAccount(const std::string& accountID);
+    std::vector< std::string > getAccountList();
+    void sendRegister(const std::string& accountID, const bool& enable);
+    void registerAllAccounts(void);
+
+    std::map< std::string, std::string > getTlsSettingsDefault();
+
+    std::vector< int32_t > getAudioCodecList();
+    std::vector< std::string > getSupportedTlsMethod();
+    std::vector< std::string > getAudioCodecDetails(const int32_t& payload);
+    std::vector< int32_t > getActiveAudioCodecList(const std::string& accountID);
+
+    void setActiveAudioCodecList(const std::vector< std::string >& list, const std::string& accountID);
+
+    std::vector< std::string > getAudioPluginList();
+    void setAudioPlugin(const std::string& audioPlugin);
+    std::vector< std::string > getAudioOutputDeviceList();
+    void setAudioOutputDevice(const int32_t& index);
+    void setAudioInputDevice(const int32_t& index);
+    void setAudioRingtoneDevice(const int32_t& index);
+    std::vector< std::string > getAudioInputDeviceList();
+    std::vector< std::string > getCurrentAudioDevicesIndex();
+    int32_t getAudioInputDeviceIndex(const std::string& name);
+    int32_t getAudioOutputDeviceIndex(const std::string& name);
+    std::string getCurrentAudioOutputPlugin();
+    bool getNoiseSuppressState();
+    void setNoiseSuppressState(const bool& state);
+    bool isAgcEnabled();
+    void setAgcState(const bool& state);
+    bool isDtmfMuted();
+    void muteDtmf(const bool& mute);
+    bool isCaptureMuted();
+    void muteCapture(const bool& mute);
+    bool isPlaybackMuted();
+    void mutePlayback(const bool& mute);
+    void setVolume(const std::string& device, const double& value);
+    double getVolume(const std::string& device);
+
+    std::map<std::string, std::string> getRingtoneList();
+
+    std::string getAudioManager();
+    bool setAudioManager(const std::string& api);
+
+    int32_t isIax2Enabled();
+    std::string getRecordPath();
+    void setRecordPath(const std::string& recPath);
+    bool getIsAlwaysRecording();
+    void setIsAlwaysRecording(const bool& rec);
+
+    void setHistoryLimit(const int32_t& days);
+    int32_t getHistoryLimit();
+    void clearHistory();
+
+    void setAccountsOrder(const std::string& order);
+
+    std::map<std::string, std::string> getHookSettings();
+    void setHookSettings(const std::map<std::string, std::string>& settings);
+
+    std::vector<std::map<std::string, std::string> > getHistory();
+
+    std::map<std::string, std::string> getTlsSettings();
+    void setTlsSettings(const std::map< std::string, std::string >& details);
+    std::map< std::string, std::string > getIp2IpDetails();
+
+    std::vector< std::map< std::string, std::string > > getCredentials(const std::string& accountID);
+    void setCredentials(const std::string& accountID, const std::vector< std::map< std::string, std::string > >& details);
+
+    std::string getAddrFromInterfaceName(const std::string& interface);
+
+    std::vector<std::string> getAllIpInterface();
+    std::vector<std::string> getAllIpInterfaceByName();
+
+    std::map<std::string, std::string> getShortcuts();
+    void setShortcuts(const std::map<std::string, std::string> &shortcutsMap);
+
+    bool checkForPrivateKey(const std::string& pemPath);
+    bool checkCertificateValidity(const std::string& caPath, const std::string& pemPath);
+    bool checkHostnameCertificate(const  std::string& host, const std::string& port);
+
+};
+
+class ConfigurationCallback {
+public:
+    virtual ~ConfigurationCallback();
+    virtual void on_accounts_changed(void);
+    virtual void on_account_state_changed(const std::string& accountID, const int32_t& state);
+    virtual void on_account_state_changed_with_code(const std::string& accountID, const std::string& state, const int32_t& code);
+    virtual std::vector<int32_t> get_hardware_audio_format(void);
+};
+
+static ConfigurationCallback *registeredConfigurationCallbackObject = NULL;
+
+void setConfigurationCallbackObject(ConfigurationCallback *callback) {
+    registeredConfigurationCallbackObject = callback;
+}
diff --git a/sflphone-android/jni/configurationmanager_jni.cpp b/sflphone-android/jni/configurationmanager_jni.cpp
new file mode 100644
index 0000000..5a9ab95
--- /dev/null
+++ b/sflphone-android/jni/configurationmanager_jni.cpp
@@ -0,0 +1,80 @@
+/*
+ *  Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010, 2011 Savoir-Faire Linux Inc.
+ *  Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
+ *  Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
+ *  Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com>
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include "client/configurationmanager.h"
+#include "jni_callbacks.h"
+
+ConfigurationManager::ConfigurationManager() {}
+
+void ConfigurationManager::accountsChanged()
+{
+    on_accounts_changed_wrapper();
+}
+
+void ConfigurationManager::historyChanged()
+{
+
+}
+
+void ConfigurationManager::stunStatusFailure(const std::string& accountID)
+{
+
+}
+
+void ConfigurationManager::volumeChanged(const std::string&, const int&)
+{
+}
+
+void ConfigurationManager::registrationStateChanged(const std::string& accountID, int const& state)
+{
+    on_account_state_changed_wrapper(accountID, state);
+}
+
+void ConfigurationManager::sipRegistrationStateChanged(const std::string& accountID, const std::string& state, const int32_t& code)
+{
+    on_account_state_changed_with_code_wrapper(accountID, state, code);
+}
+
+void ConfigurationManager::errorAlert(const int & /*alert*/)
+{
+}
+
+std::vector< int32_t > ConfigurationManager::getHardwareAudioFormat()
+{
+    return get_hardware_audio_format_wrapper();
+}
+
+std::vector<std::string> ConfigurationManager::getSupportedAudioManagers()
+{
+    return {"opensl"};
+}
diff --git a/sflphone-android/jni/jni-xml2cpp.py b/sflphone-android/jni/jni-xml2cpp.py
new file mode 100755
index 0000000..067f488
--- /dev/null
+++ b/sflphone-android/jni/jni-xml2cpp.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+
+#
+# PACKAGE DEPENDENCIES: python python-lxml
+#
+
+#import easy to use xml parser called minidom:
+from lxml import etree
+#from copy import deepcopy
+from lxml import objectify
+import re, sys, getopt
+
+def rreplace(s, old, new, occurrence):
+    li = s.rsplit(old, occurrence)
+    return new.join(li)
+
+def usage():
+    print "jni-xml2cpp.py --file <file> | -i <file>"
+
+# main
+inputfile = "./dbus/callmanager-introspec.xml"
+outputfile = "./dbus/callmanager-jni.h"
+try:
+    opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["help", "input=", "output="])
+except getopt.GetoptError, err:
+    usage()
+    print str(err)
+    #print opts
+    sys.exit(2)
+
+for opt, arg in opts:
+    if opt in ("-h", "--help"):
+        usage()
+        sys.exit(0)
+    elif opt in ("-i", "--input"):
+        inputfile = arg
+    elif opt in ("-o", "--output"):
+        outputfile = arg
+    else:
+        print "error: argument not recognized"
+        sys.exit(3)
+
+print "inputfile = %s" % (inputfile)
+print "outputfile = %s" % (outputfile)
+source = "".join(args)
+
+# lxml.objectify
+# FIXME relative path
+cm_obj_tree = objectify.parse(inputfile)
+cm_obj_root = cm_obj_tree.getroot()
+# http://www.skymind.com/~ocrow/python_string/
+# method 4: list of strings
+prototype = []
+# iteration on methods
+for meth in cm_obj_root.interface.iter(tag="method"):
+# iteration on arguments
+    prototype.append(meth.get("name"))
+    prototype.append("(")
+    for argum in meth.iter(tag="arg"):
+        name = argum.get("name")
+        typ = argum.get("type")
+# FIXME
+        if typ == 's':
+            prototype.append("string %s, " % (name))
+        elif typ == 'i':
+            prototype.append("int %s, " % (name))
+        elif typ == 'd':
+            prototype.append("unsigned int %s, " % (name))
+        elif typ == 'as':
+            prototype.append("std::vector< std::string > &%s, " % (name))
+        else:
+            prototype.append("void %s, " % (name))
+    prototype.append(");\n")
+
+# starting from the end of string,
+# replace the first and 1-only comma by nothing
+#rreplace(prototype[tostring(), ',', '', 1)
+
+p = re.compile(", \);")
+prototypes = p.sub(");", ''.join(prototype))
+
+# FIXME relative path
+outfile = open(outputfile, "w")
+outfile.write(prototypes)
+outfile.close()
diff --git a/sflphone-android/jni/jni_callbacks.h b/sflphone-android/jni/jni_callbacks.h
new file mode 100644
index 0000000..acc6539
--- /dev/null
+++ b/sflphone-android/jni/jni_callbacks.h
@@ -0,0 +1,39 @@
+
+
+
+
+extern struct callmanager_callback wrapper_callback_struct;
+void on_new_call_created_wrapper (const std::string& accountID,
+                                         const std::string& callID,
+                                         const std::string& to);
+void on_call_state_changed_wrapper(const std::string& callID,
+                                          const std::string& to);
+void on_incoming_call_wrapper (const std::string& accountID,
+                                      const std::string& callID,
+                                      const std::string& from);
+void on_transfer_state_changed_wrapper (const std::string& result);
+
+void on_conference_created_wrapper (const std::string& confID);
+void on_conference_removed_wrapper (const std::string& confID);
+void on_conference_state_changed_wrapper(const std::string& confID,const std::string& state);
+void on_incoming_message_wrapper(const std::string& ID, const std::string& from, const std::string& msg);
+void on_newPresSubClientNotification_wrapper(const std::string& uri, const std::string& basic, const std::string& note);
+void on_newPresSubServerRequest_wrapper(const std::string& remote);
+
+void on_secure_sdes_on_wrapper(const std::string& callID);
+void on_secure_sdes_off_wrapper(const std::string& callID);
+void on_secure_zrtp_on_wrapper(const std::string& callID,const std::string& cipher);
+void on_secure_zrtp_off_wrapper(const std::string& callID);
+void on_show_sas_wrapper(const std::string& callID, const std::string& sas, const bool& verified);
+void on_zrtp_not_supported_wrapper(const std::string& callID);
+void on_zrtp_negociation_failed_wrapper(const std::string& callID, const std::string& reason, const std::string& severity);
+void on_rtcp_report_received_wrapper(const std::string& callID, const std::map<std::basic_string<char>, int>& stats);
+
+extern struct configurationmanager_callback wrapper_configurationcallback_struct;
+extern void on_accounts_changed_wrapper ();
+extern void on_account_state_changed_wrapper (const std::string& accoundID, int const& state);
+extern void on_account_state_changed_with_code_wrapper (const std::string& accoundID, const std::string& state, const int32_t& code);
+extern std::vector<int> get_hardware_audio_format_wrapper();
+
+void on_record_playback_filepath_wrapper(const std::string& id, const std::string& filename);
+void on_recording_state_changed_wrapper(const std::string& callID, const bool& state);
diff --git a/sflphone-android/jni/jni_interface.i b/sflphone-android/jni/jni_interface.i
new file mode 100644
index 0000000..0021f97
--- /dev/null
+++ b/sflphone-android/jni/jni_interface.i
@@ -0,0 +1,92 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+/* File : jni_interface.i */
+%module (directors="1") SFLPhoneservice
+
+#define SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON
+%include "typemaps.i"
+%include "std_string.i" /* std::string typemaps */
+%include "enums.swg"
+%include "arrays_java.i";
+%include "carrays.i";
+%include "std_map.i";
+%include "std_vector.i";
+%include "stdint.i";
+
+/* void* shall be handled as byte arrays */
+%typemap(jni) void * "void *"
+%typemap(jtype) void * "byte[]"
+%typemap(jstype) void * "byte[]"
+%typemap(javain) void * "$javainput"
+%typemap(in) void * %{
+	$1 = $input;
+%}
+%typemap(javadirectorin) void * "$jniinput"
+%typemap(out) void * %{
+	$result = $1;
+%}
+%typemap(javaout) void * {
+	return $jnicall;
+}
+
+namespace std {
+    %template(StringMap) map<string, string>;
+    %template(StringVect) vector<string>;
+    %template(VectMap) vector< map<string,string> >;
+    %template(IntegerMap) map<string,int>;
+    %template(IntVect) vector<int32_t>;
+}
+
+/* not parsed by SWIG but needed by generated C files */
+%header %{
+
+#include <logger.h>
+
+%}
+
+%inline %{
+/* some functions that need to be declared in *_wrap.cpp
+ * that are not declared elsewhere in the c++ code
+ */
+%}
+
+/* parsed by SWIG to generate all the glue */
+/* %include "../managerimpl.h" */
+/* %include <client/callmanager.h> */
+
+//%constant struct callmanager_callback* WRAPPER_CALLBACK_STRUCT = &wrapper_callback_struct;
+
+%include "managerimpl.i"
+%include "callmanager.i"
+%include "configurationmanager.i"
+
+#ifndef SWIG
+/* some bad declarations */
+#endif
diff --git a/sflphone-android/jni/managerimpl.i b/sflphone-android/jni/managerimpl.i
new file mode 100644
index 0000000..357d416
--- /dev/null
+++ b/sflphone-android/jni/managerimpl.i
@@ -0,0 +1,58 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+/* %nodefaultctor ManagerImpl;
+%nodefaultdtor ManagerImpl; */
+%header %{
+#include <managerimpl.h>
+namespace Manager {
+extern ManagerImpl& instance();
+}
+%}
+
+class ManagerImpl {
+public:
+    void init(const std::string &config_file);
+    void setPath(const std::string &path);
+    void pollEvents();
+    void finish();
+};
+
+//%rename(Manager_instance) Manager::instance;
+
+namespace Manager {
+
+ManagerImpl& Manager::instance()
+{
+    // Meyers singleton
+    static ManagerImpl instance_;
+    return instance_;
+}
+
+}
diff --git a/sflphone-android/jni/presencemanager_jni.cpp b/sflphone-android/jni/presencemanager_jni.cpp
new file mode 100644
index 0000000..9a0b197
--- /dev/null
+++ b/sflphone-android/jni/presencemanager_jni.cpp
@@ -0,0 +1,52 @@
+/*
+ *  Copyright (C) 2013 Savoir-Faire Linux Inc.
+ *  Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include "client/presencemanager.h"
+
+PresenceManager::PresenceManager()
+{}
+
+void
+PresenceManager::newBuddyNotification(const std::string& accountID, const std::string& buddyUri,
+                              const bool& status, const std::string& lineStatus)
+{}
+
+void
+PresenceManager::subscriptionStateChanged(const std::string& accountID, const std::string& buddyUri,
+                              const bool& state)
+{}
+
+void
+PresenceManager::newServerSubscriptionRequest(const std::string& remote)
+{}
+
+void
+PresenceManager::serverError(const std::string& accountID, const std::string& error, const std::string& msg)
+{}
diff --git a/sflphone-android/jni/sflphoneservice.c.template b/sflphone-android/jni/sflphoneservice.c.template
new file mode 100644
index 0000000..f409e3f
--- /dev/null
+++ b/sflphone-android/jni/sflphoneservice.c.template
@@ -0,0 +1,73 @@
+#include "logger.h"
+
+JavaVM *gJavaVM;
+const char *ksflphoneservicePath = "org/sflphone/service/SFLPhoneserviceJNI";
+
+void deinitClassHelper(JNIEnv *env, jobject obj) {
+	INFO("deinitClassHelper");
+
+	/* delete cached object instances */
+    env->DeleteGlobalRef(obj);
+	INFO("deinitClassHelper: object %x deleted", obj);
+}
+
+JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+	JNIEnv *env;
+	jclass clazz;
+	jint r;
+
+    INFO("JNI_OnLoad");
+
+	//Assume it is c++
+	r = vm->GetEnv ((void **) &env, JNI_VERSION_1_6);
+    if (r != JNI_OK) {
+		ERROR("JNI_OnLoad: failed to get the environment using GetEnv()");
+        return -1;
+    }
+	INFO("JNI_Onload: GetEnv %p", env);
+
+	clazz = env->FindClass (ksflphoneservicePath);
+	if (!clazz) {
+        ERROR("JNI_Onload: whoops, %s class not found!", ksflphoneservicePath);
+	}
+	gJavaVM = vm;
+	INFO("JNI_Onload: JavaVM %p", gJavaVM);
+
+	/* put instances of class object we need into cache */
+    //initClassHelper(env, kManagerPath, &gManagerObject);
+
+	JNINativeMethod methods[] = {
+
+	$defs
+
+	};
+
+	r = env->RegisterNatives (clazz, methods, (int) (sizeof(methods) / sizeof(methods[0])));
+	return JNI_VERSION_1_6;
+}
+
+void JNI_OnUnLoad(JavaVM* vm, void* reserved) {
+    JNIEnv* env;
+	jclass clazz;
+
+	INFO("JNI_OnUnLoad");
+
+	/* get env */
+    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+		ERROR("JNI_OnUnLoad: failed to get the environment using GetEnv()");
+        return;
+    }
+	INFO("JNI_OnUnLoad: GetEnv %p", env);
+
+    /* Get jclass with env->FindClass */
+	clazz = env->FindClass(ksflphoneservicePath);
+	if (!clazz) {
+        ERROR("JNI_OnUnLoad: whoops, %s class not found!", ksflphoneservicePath);
+	}
+
+	/* remove instances of class object we need into cache */
+    //deinitClassHelper(env, gManagerObject);
+
+	env->UnregisterNatives(clazz);
+	INFO("JNI_OnUnLoad: Native functions unregistered");
+}
diff --git a/sflphone-android/make-swig.sh b/sflphone-android/make-swig.sh
index 1410dc0..dbaf206 100755
--- a/sflphone-android/make-swig.sh
+++ b/sflphone-android/make-swig.sh
@@ -83,9 +83,6 @@
     exit 3
 fi
 
-
-
-
 # FIXME
 echo "Generating callmanager_wrap.cpp..."
 
