diff --git a/gst/gstdebugutils.c b/gst/gstdebugutils.c
index 2e43fcb..23cc641 100644
--- a/gst/gstdebugutils.c
+++ b/gst/gstdebugutils.c
@@ -45,6 +45,7 @@
 #include "gstghostpad.h"
 #include "gstpad.h"
 #include "gstutils.h"
+#include "gstvalue.h"
 
 /*** PIPELINE GRAPHS **********************************************************/
 
@@ -204,6 +205,18 @@ debug_dump_element_pad (GstPad * pad, GstElement * element,
   g_free (spc);
 }
 
+static gboolean
+string_append_field (GQuark field, const GValue * value, gpointer ptr)
+{
+  GString *str = (GString *)ptr;
+  gchar *value_str = gst_value_serialize (value);
+
+  g_string_append_printf (str, "  %15s: %s\\l", g_quark_to_string (field), value_str);
+
+  g_free (value_str);
+  return TRUE;
+}
+
 static gchar *
 debug_dump_describe_caps (GstCaps * caps, GstDebugGraphDetails details,
     gboolean * need_free)
@@ -211,38 +224,34 @@ debug_dump_describe_caps (GstCaps * caps, GstDebugGraphDetails details,
   gchar *media = NULL;
 
   if (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS) {
-    gchar *tmp = gst_caps_to_string (caps);
-    gboolean in_bracket = FALSE;
-    gint i, sl = strlen (tmp);
-
-    for (i = 0; i < sl; i++) {
-      switch (tmp[i]) {
-        case ';':
-          if (i < (sl - 1))
-            tmp[i] = '\n';
-          else
-            tmp[i] = '\0';
-          break;
-        case ',':
-          if (!in_bracket)
-            tmp[i] = '\n';
-          break;
-        case '(':
-        case '{':
-        case '[':
-          in_bracket = TRUE;
-          break;
-        case ')':
-        case '}':
-        case ']':
-          in_bracket = FALSE;
-          break;
+
+    if (gst_caps_is_any (caps) || gst_caps_is_empty (caps)) {
+      media = gst_caps_to_string (caps);
+      *need_free = TRUE;
+
+    } else {
+      GString *str = NULL;
+      guint i;
+      guint slen = 0;
+
+      for (i = 0; i < gst_caps_get_size (caps); i++) {
+        slen +=
+            STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure (caps, i));
       }
-    }
 
-    media = g_strescape (tmp, NULL);
-    *need_free = TRUE;
-    g_free (tmp);
+      str = g_string_sized_new (slen);
+      for (i = 0; i < gst_caps_get_size (caps); i++) {
+        GstStructure *structure = gst_caps_get_structure (caps, i);
+
+        g_string_append (str, gst_structure_get_name (structure));
+        g_string_append (str, "\\l");
+
+        gst_structure_foreach (structure, string_append_field, (gpointer) str);
+      }
+
+      media = g_string_free (str, FALSE);
+      *need_free = TRUE;
+    }
 
   } else {
     if (GST_CAPS_IS_SIMPLE (caps))
@@ -398,7 +407,7 @@ debug_dump_element_pad_link (GstPad * pad, GstElement * element,
 
     /* pad link */
     if (media) {
-      fprintf (out, "%s%s_%s -> %s_%s [label=\"%s\"]\n", spc,
+      fprintf (out, "%s%s_%s -> %s_%s [fontname=\"monospace\" label=\"%s\"]\n", spc,
           element_name, pad_name, peer_element_name, peer_pad_name, media);
       if (free_media) {
         g_free (media);
