diff --git a/lib/wp/endpoint.c b/lib/wp/endpoint.c
index 833b849829e53c5c4f46a5310bc1e2158a0e9608..86e6b20d88c7e1a207418e5b615562efd0677035 100644
--- a/lib/wp/endpoint.c
+++ b/lib/wp/endpoint.c
@@ -436,10 +436,10 @@ impl_create_link (void *object, const struct spa_dict *props)
     }
 
     props = wp_properties_new_empty ();
-    wp_properties_setf (props, "out-item", "%p", out_endpoint);
-    wp_properties_setf (props, "in-item", "%p", in_endpoint);
+    wp_properties_setf (props, "out.item", "%p", out_endpoint);
+    wp_properties_setf (props, "in.item", "%p", in_endpoint);
     wp_properties_setf (props, "session", "%p", session);
-    wp_properties_setf (props, "manage-lifetime", "%u", TRUE);
+    wp_properties_setf (props, "manage.lifetime", "%u", TRUE);
 
     if (G_UNLIKELY (!wp_session_item_configure (link, props))) {
       g_critical ("si-standard-link configuration failed");
diff --git a/modules/module-si-audio-adapter.c b/modules/module-si-audio-adapter.c
index 699148fd76f241e9880b7c66707a58544edb436f..82e3150dcb119a02e280bcd9bd1d998553c800db 100644
--- a/modules/module-si-audio-adapter.c
+++ b/modules/module-si-audio-adapter.c
@@ -103,7 +103,7 @@ si_audio_adapter_configure (WpSessionItem * item, WpProperties *p)
     wp_properties_set (si_props, "name", self->name);
   }
 
-  str = wp_properties_get (si_props, "media-class");
+  str = wp_properties_get (si_props, "media.class");
   if (str) {
     strncpy (self->media_class, str, sizeof (self->media_class) - 1);
   } else {
@@ -112,7 +112,7 @@ si_audio_adapter_configure (WpSessionItem * item, WpProperties *p)
       strncpy (self->media_class, str, sizeof (self->media_class) - 1);
     else
       strncpy (self->media_class, "Unknown", sizeof (self->media_class) - 1);
-    wp_properties_set (si_props, "media-class", self->media_class);
+    wp_properties_set (si_props, "media.class", self->media_class);
   }
 
   str = wp_properties_get (si_props, "role");
@@ -138,29 +138,29 @@ si_audio_adapter_configure (WpSessionItem * item, WpProperties *p)
   if (!str)
     wp_properties_setf (si_props, "priority", "%u", self->priority);
 
-  str = wp_properties_get (si_props, "preferred-n-channels");
+  str = wp_properties_get (si_props, "preferred.n.channels");
   if (str && sscanf(str, "%u", &self->preferred_n_channels) != 1)
     return FALSE;
   if (!str)
-    wp_properties_setf (si_props, "preferred-n-channels", "%u",
+    wp_properties_setf (si_props, "preferred.n.channels", "%u",
         self->preferred_n_channels);
 
-  str = wp_properties_get (si_props, "enable-control-port");
+  str = wp_properties_get (si_props, "enable.control.port");
   if (str && sscanf(str, "%u", &self->control_port) != 1)
     return FALSE;
   if (!str)
-    wp_properties_setf (si_props, "enable-control-port", "%u",
+    wp_properties_setf (si_props, "enable.control.port", "%u",
         self->control_port);
 
-  str = wp_properties_get (si_props, "enable-monitor");
+  str = wp_properties_get (si_props, "enable.monitor");
   if (str && sscanf(str, "%u", &self->monitor) != 1)
     return FALSE;
   if (!str)
-    wp_properties_setf (si_props, "enable-monitor", "%u", self->monitor);
+    wp_properties_setf (si_props, "enable.monitor", "%u", self->monitor);
 
   self->node = g_object_ref (node);
 
-  wp_properties_set (si_props, "si-factory-name", SI_FACTORY_NAME);
+  wp_properties_set (si_props, "si.factory.name", SI_FACTORY_NAME);
   wp_session_item_set_properties (WP_SESSION_ITEM (self),
       g_steal_pointer (&si_props));
   return TRUE;
diff --git a/modules/module-si-audio-convert.c b/modules/module-si-audio-convert.c
index 0ad5112095f33c8f1867c6ae20f7aa4512c07dd5..ed36e4bc747234fe22886bfdd2d2d002e8d18a07 100644
--- a/modules/module-si-audio-convert.c
+++ b/modules/module-si-audio-convert.c
@@ -95,16 +95,16 @@ si_audio_convert_configure (WpSessionItem * item, WpProperties *p)
   if (!str || sscanf(str, "%u", &self->direction) != 1)
     return FALSE;
 
-  str = wp_properties_get (si_props, "enable-control-port");
+  str = wp_properties_get (si_props, "enable.control.port");
   if (str && sscanf(str, "%u", &self->control_port) != 1)
     return FALSE;
   if (!str)
-    wp_properties_setf (si_props, "enable-control-port", "%u",
+    wp_properties_setf (si_props, "enable.control.port", "%u",
         self->control_port);
 
   self->target = g_object_ref (target);
 
-  wp_properties_set (si_props, "si-factory-name", SI_FACTORY_NAME);
+  wp_properties_set (si_props, "si.factory.name", SI_FACTORY_NAME);
   wp_session_item_set_properties (WP_SESSION_ITEM (self),
       g_steal_pointer (&si_props));
   return TRUE;
@@ -159,14 +159,14 @@ do_link_to_target (WpSiAudioConvert *self)
   props = wp_properties_new_empty ();
   if (self->direction == WP_DIRECTION_INPUT) {
       /* Playback */
-      wp_properties_setf (props, "out-item", "%p", self);
-      wp_properties_setf (props, "in-item", "%p", self->target);
-      wp_properties_set (props, "out-item-port-context", "reverse");
+      wp_properties_setf (props, "out.item", "%p", self);
+      wp_properties_setf (props, "in.item", "%p", self->target);
+      wp_properties_set (props, "out.item.port.context", "reverse");
   } else {
       /* Capture */
-      wp_properties_setf (props, "out-item", "%p", self->target);
-      wp_properties_setf (props, "in-item", "%p", self);
-      wp_properties_set (props, "in-item-port-context", "reverse");
+      wp_properties_setf (props, "out.item", "%p", self->target);
+      wp_properties_setf (props, "in.item", "%p", self);
+      wp_properties_set (props, "in.item.port.context", "reverse");
   }
 
   /* always create passive links; that means that they won't hold the graph
@@ -275,7 +275,7 @@ si_audio_convert_enable_active (WpSessionItem *si, WpTransition *transition)
 
   /* set channels & rate */
   target_props = wp_session_item_get_properties (self->target);
-  str = wp_properties_get (target_props, "preferred-n-channels");
+  str = wp_properties_get (target_props, "preferred.n.channels");
   if (!str || sscanf(str, "%u", &channels) != 1)
     channels = 2;
   rate = ({
diff --git a/modules/module-si-audio-endpoint.c b/modules/module-si-audio-endpoint.c
index 2528b0ebbfb969a89d35a26016dd738eacb298dd..e771f9e9a897bd0fc09eb41012afda5ddbe05ba1 100644
--- a/modules/module-si-audio-endpoint.c
+++ b/modules/module-si-audio-endpoint.c
@@ -127,7 +127,7 @@ si_audio_endpoint_configure (WpSessionItem * item, WpProperties *p)
   if (session)
     self->session = g_object_ref (session);
 
-  wp_properties_set (si_props, "si-factory-name", SI_FACTORY_NAME);
+  wp_properties_set (si_props, "si.factory.name", SI_FACTORY_NAME);
   wp_session_item_set_properties (WP_SESSION_ITEM (self),
       g_steal_pointer (&si_props));
   return TRUE;
@@ -196,14 +196,14 @@ link_to_target (WpSiAudioEndpoint * self)
   props = wp_properties_new_empty ();
   if (self->direction == WP_DIRECTION_INPUT) {
       /* Playback */
-      wp_properties_setf (props, "out-item", "%p", self);
-      wp_properties_setf (props, "in-item", "%p", self->target);
-      wp_properties_set (props, "out-item-port-context", "reverse");
+      wp_properties_setf (props, "out.item", "%p", self);
+      wp_properties_setf (props, "in.item", "%p", self->target);
+      wp_properties_set (props, "out.item.port.context", "reverse");
   } else {
       /* Capture */
-      wp_properties_setf (props, "out-item", "%p", self->target);
-      wp_properties_setf (props, "in-item", "%p", self);
-      wp_properties_set (props, "in-item-port-context", "reverse");
+      wp_properties_setf (props, "out.item", "%p", self->target);
+      wp_properties_setf (props, "in.item", "%p", self);
+      wp_properties_set (props, "in.item.port.context", "reverse");
   }
 
   /* always create passive links; that means that they won't hold the graph
diff --git a/modules/module-si-node.c b/modules/module-si-node.c
index b1822b63adc421a8ba46ce9b2590f9a9bb50557d..1db0dfe9c9380d6aae93bfd66d85b6f591dbab7d 100644
--- a/modules/module-si-node.c
+++ b/modules/module-si-node.c
@@ -86,7 +86,7 @@ si_node_configure (WpSessionItem * item, WpProperties *p)
     wp_properties_set (si_props, "name", self->name);
   }
 
-  str = wp_properties_get (si_props, "media-class");
+  str = wp_properties_get (si_props, "media.class");
   if (str) {
     strncpy (self->media_class, str, sizeof (self->media_class) - 1);
   } else {
@@ -95,7 +95,7 @@ si_node_configure (WpSessionItem * item, WpProperties *p)
       strncpy (self->media_class, str, sizeof (self->media_class) - 1);
     else
       strncpy (self->media_class, "Unknown", sizeof (self->media_class) - 1);
-    wp_properties_set (si_props, "media-class", self->media_class);
+    wp_properties_set (si_props, "media.class", self->media_class);
   }
 
   str = wp_properties_get (si_props, "role");
@@ -123,7 +123,7 @@ si_node_configure (WpSessionItem * item, WpProperties *p)
 
   self->node = g_object_ref (node);
 
-  wp_properties_set (si_props, "si-factory-name", SI_FACTORY_NAME);
+  wp_properties_set (si_props, "si.factory.name", SI_FACTORY_NAME);
   wp_session_item_set_properties (WP_SESSION_ITEM (self),
       g_steal_pointer (&si_props));
   return TRUE;
diff --git a/modules/module-si-standard-link.c b/modules/module-si-standard-link.c
index 9eac5cafcea52260339c30a45da03e29fac68f21..d6926f250e3ef8785c4692b3fa703494b29379e7 100644
--- a/modules/module-si-standard-link.c
+++ b/modules/module-si-standard-link.c
@@ -140,29 +140,29 @@ si_standard_link_configure (WpSessionItem * item, WpProperties * p)
   /* reset previous config */
   si_standard_link_reset (item);
 
-  out_item = get_and_validate_item (si_props, "out-item");
+  out_item = get_and_validate_item (si_props, "out.item");
   if (!out_item)
     return FALSE;
-  wp_properties_setf (si_props, "out-item-id", "%u",
+  wp_properties_setf (si_props, "out.item.id", "%u",
       wp_session_item_get_id (out_item));
 
-  in_item = get_and_validate_item (si_props, "in-item");
+  in_item = get_and_validate_item (si_props, "in.item");
   if (!in_item)
     return FALSE;
-  wp_properties_setf (si_props, "in-item-id", "%u",
+  wp_properties_setf (si_props, "in.item.id", "%u",
       wp_session_item_get_id (in_item));
 
   self->out_item_port_context = wp_properties_get (si_props,
-      "out-item-port-context");
+      "out.item.port.context");
 
   self->out_item_port_context = wp_properties_get (si_props,
-      "in-item-port-context");
+      "in.item.port.context");
 
-  str = wp_properties_get (si_props, "manage-lifetime");
+  str = wp_properties_get (si_props, "manage.lifetime");
   if (str && sscanf(str, "%u", &self->manage_lifetime) != 1)
     return FALSE;
   if (!str)
-    wp_properties_setf (si_props, "manage-lifetime", "%u",
+    wp_properties_setf (si_props, "manage.lifetime", "%u",
         self->manage_lifetime);
 
   str = wp_properties_get (si_props, "passive");
@@ -193,7 +193,7 @@ si_standard_link_configure (WpSessionItem * item, WpProperties * p)
   if (session)
     self->session = g_object_ref (session);
 
-  wp_properties_set (si_props, "si-factory-name", SI_FACTORY_NAME);
+  wp_properties_set (si_props, "si.factory.name", SI_FACTORY_NAME);
   wp_session_item_set_properties (WP_SESSION_ITEM (self),
       g_steal_pointer (&si_props));
   return TRUE;
diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua
index 1ae2035c0f99c8527f367873b03da7e66cec4582..3bdb9a6c519423f728af67b2d01fe7554c4c409f 100644
--- a/src/scripts/policy-node.lua
+++ b/src/scripts/policy-node.lua
@@ -52,11 +52,11 @@ function createLink (si, si_target)
   -- create and configure link
   local si_link = SessionItem ( "si-standard-link" )
   if not si_link:configure {
-    ["out-item"] = out_item,
-    ["in-item"] = in_item,
-    ["out-item-port-context"] = out_context,
-    ["in-item-port-context"] = in_context,
-    ["manage-lifetime"] = false,
+    ["out.item"] = out_item,
+    ["in.item"] = in_item,
+    ["out.item.port.context"] = out_context,
+    ["in.item.port.context"] = in_context,
+    ["manage.lifetime"] = false,
   } then
     Log.warning (si_link, "failed to configure si-standard-link")
   end
@@ -137,8 +137,8 @@ end
 
 function getSiLinkAndSiPeer (si)
   for silink in silinks_om:iterate() do
-    local out_id = tonumber(silink.properties["out-item-id"])
-    local in_id = tonumber(silink.properties["in-item-id"])
+    local out_id = tonumber(silink.properties["out.item.id"])
+    local in_id = tonumber(silink.properties["in.item.id"])
     if out_id == si.id then
       return silink, siportinfos_om:lookup {
         Constraint { "id", "=", in_id, type = "gobject" }
@@ -201,8 +201,8 @@ function reevaluateLinks ()
   for silink in silinks_om:iterate() do
     local used = false
     for si in siportinfos_om:iterate() do
-      local out_id_str = silink.properties["out-item-id"]
-      local in_id_str = silink.properties["out-item-id"]
+      local out_id_str = silink.properties["out.item.id"]
+      local in_id_str = silink.properties["out.item.id"]
       if tonumber (out_id_str) == si.id or tonumber (in_id_str) == si.id then
         used = true
         break
diff --git a/tests/modules/si-audio-adapter.c b/tests/modules/si-audio-adapter.c
index 21bf1c73eace92f32b820571b0fe5cabc58101d8..5b551b62edc3fe76fe2b9f68b59f3f748433e93a 100644
--- a/tests/modules/si-audio-adapter.c
+++ b/tests/modules/si-audio-adapter.c
@@ -86,7 +86,7 @@ test_si_audio_adapter_configure_activate (TestFixture * f,
     str = wp_properties_get (props, "name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("audiotestsrc.adapter", ==, str);
-    str = wp_properties_get (props, "media-class");
+    str = wp_properties_get (props, "media.class");
     g_assert_nonnull (str);
     g_assert_cmpstr ("Audio/Source", ==, str);
     str = wp_properties_get (props, "role");
@@ -98,16 +98,16 @@ test_si_audio_adapter_configure_activate (TestFixture * f,
     str = wp_properties_get (props, "priority");
     g_assert_nonnull (str);
     g_assert_cmpstr ("0", ==, str);
-    str = wp_properties_get (props, "preferred-n-channels");
+    str = wp_properties_get (props, "preferred.n.channels");
     g_assert_nonnull (str);
     g_assert_cmpstr ("0", ==, str);
-    str = wp_properties_get (props, "enable-control-port");
+    str = wp_properties_get (props, "enable.control.port");
     g_assert_nonnull (str);
     g_assert_cmpstr ("0", ==, str);
-    str = wp_properties_get (props, "enable-monitor");
+    str = wp_properties_get (props, "enable.monitor");
     g_assert_nonnull (str);
     g_assert_cmpstr ("0", ==, str);
-    str = wp_properties_get (props, "si-factory-name");
+    str = wp_properties_get (props, "si.factory.name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("si-audio-adapter", ==, str);
   }
diff --git a/tests/modules/si-audio-convert.c b/tests/modules/si-audio-convert.c
index a3e8b3c37ce592e3978ff1a3f44fb7d7b4ca1381..6fc6e03c2a8082ee41fe4fb1722e2d329b4af559 100644
--- a/tests/modules/si-audio-convert.c
+++ b/tests/modules/si-audio-convert.c
@@ -116,10 +116,10 @@ test_si_audio_convert_configure_activate (TestFixture * f,
     str = wp_properties_get (props, "direction");
     g_assert_nonnull (str);
     g_assert_cmpstr ("1", ==, str);
-    str = wp_properties_get (props, "enable-control-port");
+    str = wp_properties_get (props, "enable.control.port");
     g_assert_nonnull (str);
     g_assert_cmpstr ("0", ==, str);
-    str = wp_properties_get (props, "si-factory-name");
+    str = wp_properties_get (props, "si.factory.name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("si-audio-convert", ==, str);
   }
diff --git a/tests/modules/si-audio-endpoint.c b/tests/modules/si-audio-endpoint.c
index 73e9dc3812c84b4487a8e13cf31a2f59c2b24f44..4773ed4c61f32eb979eaf5feda85f1b41a28aa1a 100644
--- a/tests/modules/si-audio-endpoint.c
+++ b/tests/modules/si-audio-endpoint.c
@@ -116,7 +116,7 @@ test_si_audio_endpoint_configure_activate (TestFixture * f,
     str = wp_properties_get (props, "direction");
     g_assert_nonnull (str);
     g_assert_cmpstr ("1", ==, str);
-    str = wp_properties_get (props, "si-factory-name");
+    str = wp_properties_get (props, "si.factory.name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("si-audio-endpoint", ==, str);
   }
diff --git a/tests/modules/si-node.c b/tests/modules/si-node.c
index 8f1165f5a9badf75aaeec6ca50c3616006a91c66..68885a2e33b0bc7650544685bdc73802cd337e44 100644
--- a/tests/modules/si-node.c
+++ b/tests/modules/si-node.c
@@ -81,7 +81,7 @@ test_si_node_configure_activate (TestFixture * f, gconstpointer user_data)
   {
     WpProperties *props = wp_properties_new_empty ();
     wp_properties_setf (props, "node", "%p", node);
-    wp_properties_set (props, "media-class", data->media_class);
+    wp_properties_set (props, "media.class", data->media_class);
     g_assert_true (wp_session_item_configure (item, props));
     g_assert_true (wp_session_item_is_configured (item));
   }
@@ -93,13 +93,13 @@ test_si_node_configure_activate (TestFixture * f, gconstpointer user_data)
     str = wp_properties_get (props, "name");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->name, ==, str);
-    str = wp_properties_get (props, "media-class");
+    str = wp_properties_get (props, "media.class");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->expected_media_class, ==, str);
     str = wp_properties_get (props, "direction");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->expected_direction == 0 ? "0" : "1", ==, str);
-    str = wp_properties_get (props, "si-factory-name");
+    str = wp_properties_get (props, "si.factory.name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("si-node", ==, str);
   }
@@ -158,13 +158,13 @@ test_si_node_configure_activate (TestFixture * f, gconstpointer user_data)
     str = wp_properties_get (props, "name");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->name, ==, str);
-    str = wp_properties_get (props, "media-class");
+    str = wp_properties_get (props, "media.class");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->expected_media_class, ==, str);
     str = wp_properties_get (props, "direction");
     g_assert_nonnull (str);
     g_assert_cmpstr (data->expected_direction == 0 ? "0" : "1", ==, str);
-    str = wp_properties_get (props, "si-factory-name");
+    str = wp_properties_get (props, "si.factory.name");
     g_assert_nonnull (str);
     g_assert_cmpstr ("si-node", ==, str);
   }
diff --git a/tests/modules/si-standard-link.c b/tests/modules/si-standard-link.c
index 27d111da2c630ec0cd94f178b9a7fc0e729f83b2..56ebe3111cce71e04acbb49e8808326e2b63a3a2 100644
--- a/tests/modules/si-standard-link.c
+++ b/tests/modules/si-standard-link.c
@@ -47,7 +47,7 @@ load_endpoint (TestFixture * f, const gchar * factory, const gchar * media_class
     WpProperties *props = wp_properties_new_empty ();
     wp_properties_setf (props, "node", "%p", target_node);
     wp_properties_set (props, "name", factory);
-    wp_properties_set (props, "media-class", media_class);
+    wp_properties_set (props, "media.class", media_class);
     wp_properties_set (props, "role", "role");
     g_assert_true (wp_session_item_configure (target, props));
     g_assert_true (wp_session_item_is_configured (target));