--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -5180,6 +5180,14 @@ gst_rtspsrc_setup_streams (GstRTSPSrc * src, gboolean async)
       goto create_request_failed;
     }
 
+    /* add custom freebox headers */
+    if (src->freebox_ext) {
+      gst_rtsp_message_add_header (&request,
+          GST_RTSP_HDR_X_FREEBOX_MODEL, "fbxhd");
+      gst_rtsp_message_add_header (&request,
+          GST_RTSP_HDR_X_FREEBOX_CAPABILITIES, "ld,sd,hd,16_9,ac3");
+    }
+
     /* select transport, copy is made when adding to header so we can free it. */
     gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT, transports);
     g_free (transports);
@@ -5353,6 +5361,29 @@ setup_transport_failed:
 response_error:
   {
     const gchar *str = gst_rtsp_status_as_text (code);
+    GstStructure *structure;
+
+    structure = gst_structure_new ("rtsp-error",
+        "code", G_TYPE_INT, code, NULL);
+
+    if (src->freebox_ext) {
+      gchar *value;
+
+      gst_rtsp_message_get_header (&response,
+          GST_RTSP_HDR_X_FREEBOX_MISSING_BANDWIDTH, &value, 0);
+      if (value)
+        gst_structure_set (structure,
+            "missing-bandwidth", G_TYPE_INT, atoi (value), NULL);
+
+      gst_rtsp_message_get_header (&response,
+          GST_RTSP_HDR_X_FREEBOX_ERROR, &value, 0);
+      if (value)
+        gst_structure_set (structure,
+            "ext-code", G_TYPE_INT, atoi (value), NULL);
+    }
+
+    gst_element_post_message (GST_ELEMENT (src),
+        gst_message_new_element (GST_OBJECT (src), structure));
 
     GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL),
         ("Error (%d): %s", code, GST_STR_NULL (str)));
@@ -5403,6 +5434,20 @@ cleanup_error:
   }
 }
 
+static void
+gst_rtspsrc_detect_server (GstRTSPSrc * src, GstRTSPMessage * response)
+{
+  gchar *value;
+
+  src->freebox_ext = FALSE;
+
+  if (gst_rtsp_message_get_header (response, GST_RTSP_HDR_SERVER,
+          &value, 0) == GST_RTSP_OK) {
+    if (g_str_has_prefix (value, "fbxrtspd"))
+      src->freebox_ext = TRUE;
+  }
+}
+
 static gboolean
 gst_rtspsrc_parse_range (GstRTSPSrc * src, const gchar * range,
     GstSegment * segment)
@@ -5608,6 +5653,8 @@ restart:
               NULL)) < 0)
     goto send_error;
 
+  gst_rtspsrc_detect_server (src, &response);
+
   /* parse OPTIONS */
   if (!gst_rtspsrc_parse_methods (src, &response))
     goto methods_error;
--- a/gst/rtsp/gstrtspsrc.h
+++ b/gst/rtsp/gstrtspsrc.h
@@ -192,6 +192,7 @@ struct _GstRTSPSrc {
   GList           *streams;
   GstStructure    *props;
   gboolean         need_activate;
+  gboolean         freebox_ext;
 
   /* properties */
   GstRTSPLowerTrans protocols;
