diff --git a/demo/addons/gdpd/patches/gdpd.pd b/demo/addons/gdpd/patches/gdpd.pd
index 99faa5f136e354096f96cd4225af423d24ee1f50..2b9668c6a405e06b231dec17a46e42c974f501ea 100644
Binary files a/demo/addons/gdpd/patches/gdpd.pd and b/demo/addons/gdpd/patches/gdpd.pd differ
diff --git a/demo/addons/gdpd/patches/gdpd_send.pd b/demo/addons/gdpd/patches/gdpd_send.pd
index 4bb09c4e684c9164cebcf772004c572872c4d9a4..2bbc9dfeea6e0a655d77fa5e82af9d210385659b 100644
Binary files a/demo/addons/gdpd/patches/gdpd_send.pd and b/demo/addons/gdpd/patches/gdpd_send.pd differ
diff --git a/patches/gdpd.pd b/patches/gdpd.pd
index 99faa5f136e354096f96cd4225af423d24ee1f50..2b9668c6a405e06b231dec17a46e42c974f501ea 100644
Binary files a/patches/gdpd.pd and b/patches/gdpd.pd differ
diff --git a/patches/gdpd_send.pd b/patches/gdpd_send.pd
index 4bb09c4e684c9164cebcf772004c572872c4d9a4..2bbc9dfeea6e0a655d77fa5e82af9d210385659b 100644
Binary files a/patches/gdpd_send.pd and b/patches/gdpd_send.pd differ
diff --git a/src/gdpd.cpp b/src/gdpd.cpp
index 9b4e75ed5872fb80e73af9e246f14f8239d1a8d9..5baa83cb9d28098433beb99ccdf3dfee09f034d4 100644
--- a/src/gdpd.cpp
+++ b/src/gdpd.cpp
@@ -366,7 +366,10 @@ void GdPd::send(String address, Array arguments) {
         libpd_start_message(arguments.size()+2);
         libpd_add_symbol("gdpd");
         libpd_add_symbol(m_applicationNameStr.c_str());
-        libpd_add_symbol(String(address).utf8().get_data());
+        Array addrArray = address.split("/");
+        for(int i=0; i<addrArray.size(); ++i) {
+            libpd_add_symbol(String(addrArray[i]).utf8().get_data());
+        }
         for(int i=0; i<arguments.size(); ++i) {
             switch(arguments[i].get_type()) {
                 case Variant::INT :
@@ -401,21 +404,49 @@ void GdPd::_process(double delta) {
 
 void GdPd::handleOSC(const char* path, const char* types, 
                      lo_arg** argv, int argc, lo_message msg) {
-	Array gdList;
-	for(int i = 0; i < argc; ++i) {
-        switch(types[i]) {
-            case 'f' :
-                gdList.push_back(argv[i]->f);
-                break;
-            case 'i' :
-                gdList.push_back(argv[i]->i);
-                break;
-            case 's' :
-                gdList.push_back(String(&(argv[i]->s)));
-                break;
-		}
-	}
-    emit_signal("got_message", String(path), gdList);
+    if(std::string(path).find("/gdpd/"+m_applicationNameStr)==0) {
+        Array gdList;
+        for(int i = 0; i < argc; ++i) {
+            switch(types[i]) {
+                case 'f' :
+                    gdList.push_back(argv[i]->f);
+                    break;
+                case 'i' :
+                    gdList.push_back(argv[i]->i);
+                    break;
+                case 's' :
+                    gdList.push_back(String(&(argv[i]->s)));
+                    break;
+            }
+        }
+        emit_signal("got_message", String(path), gdList);
+    }
+}
+
+void GdPd::receiveList(const std::string& dest, const pd::List& list) {
+    if(dest == "to_godot") {
+        //retrieve address
+        int nb_addr = list.getFloat(2);
+        int start_addr = 3;
+        std::string addr = "/"+std::string(list.getSymbol(0).c_str())
+                          +"/"+std::string(list.getSymbol(1).c_str());
+        for(int i = start_addr; i < start_addr + nb_addr; ++i) {
+            addr += "/"+std::string(list.getSymbol(i).c_str());
+        }
+
+        //retrieve agruments
+        Array gdList;
+        for(int i = start_addr+nb_addr; i < list.len(); ++i) {
+            if(list.isFloat(i)) {
+                gdList.push_back(list.getFloat(i));
+            }
+            else if(list.isSymbol(i)) {
+                String symbStr(list.getSymbol(i).c_str());
+                gdList.push_back(symbStr);
+            }
+        }
+        emit_signal("got_message", String(addr.c_str()), gdList);
+    }
 }
 
 void GdPd::processAudio(void *outputBuffer, void *inputBuffer, 
@@ -487,8 +518,8 @@ bool GdPd::open_patch() {
 
     // Open the patch
     m_patchOpened=false;
-	pd::Patch p1 = m_pd.openPatch(m_pdPatchStr.c_str(), m_pdDirStr.c_str());
-    /*
+    //FIXME fix issue in libpd with itoa in dollarzero
+	pd::Patch p1 = m_pd.openPatch(m_pdPatchStr, m_pdDirStr);
 	if(!p1.isValid()) {
 		print("Could not open patch "+m_pdPatchStr);
         return false;
@@ -498,7 +529,7 @@ bool GdPd::open_patch() {
         m_patchOpened=true;
         std::string patchStr(pd_patch.utf8().get_data());
         m_patchsMap[patchStr] = p1;
-	}*/
+	}
     return true;
 }
 
@@ -538,19 +569,6 @@ void GdPd::print(const std::string& message) {
 	UtilityFunctions::print((std::string("GdPd : ")+message).c_str());
 }
 
-void GdPd::receiveList(const std::string& dest, const pd::List& list) {
-	Array gdList;
-	for(int i = 0; i < list.len(); ++i) {
-		if(list.isFloat(i)) {
-			gdList.push_back(list.getFloat(i));
-		}
-		else if(list.isSymbol(i)) {
-			String symbStr(list.getSymbol(i).c_str());
-			gdList.push_back(symbStr);
-		}
-	}
-    emit_signal("got_message", String(dest.c_str()), gdList);
-}
 
 /* GdPdStream */
 GdPdStream::GdPdStream() {