diff --git a/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java b/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
index 0bcf0f13a0fe2d9d6312f38bdcef78c5b9894b54..88deaa24fcc7b40e377ca41849d2d3743a31ab71 100644
--- a/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
+++ b/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
@@ -5,6 +5,8 @@
  */
 package it.inaf.oats.vospace.datamodel;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import net.ivoa.xml.vospace.v2.Node;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
@@ -245,10 +247,16 @@ public class NodeUtils {
     }
 
     public static String getVosPath(Node myNode) {
+        return getVosPath(myNode.getUri());
+    }
 
-        String nodeUri = myNode.getUri();
-
-        return nodeUri.replaceAll("vos://[^/]+", "");
+    public static String getVosPath(String nodeUri) {
+        try {
+            URI uri = new URI(nodeUri);
+            return uri.getPath();
+        } catch (URISyntaxException ex) {
+            throw new RuntimeException(ex);
+        }
     }
 
 }
diff --git a/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java b/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
index d68b9912a9565d5c0d88ef94bb679733ffb864f0..5031c05bcf8e4c46b8ac9216b64741449e0c8299 100644
--- a/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
+++ b/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
@@ -271,6 +271,15 @@ public class NodeUtilsTest {
         assertEquals("/mynode/child1/child2", NodeUtils.getVosPath(node));
     }
 
+    @Test
+    public void testGetVosPathSpecialChars() {
+
+        Node node = new DataNode();
+        node.setUri("vos://example.com!vospace/mynode/(%20+%20)/child2");
+
+        assertEquals("/mynode/( + )/child2", NodeUtils.getVosPath(node));
+    }
+
     @Test
     public void testGetParentPath() {
         assertEquals("/node1/node2", NodeUtils.getParentPath("/node1/node2/node2"));