diff --git a/common b/common
index aa0d1d0..fd7ca04 160000
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit aa0d1d0399c8095314394d869ceab21a371e6fbb
+Subproject commit fd7ca04c3d583586cb06b5323d0790e131804482
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index 12b4e3e..0f00aea 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -454,7 +454,6 @@ gst_rtspsrc_class_init (GstRTSPSrcClass * klass)
   gst_rtsp_ext_list_init ();
 }
 
-
 static void
 gst_rtspsrc_init (GstRTSPSrc * src, GstRTSPSrcClass * g_class)
 {
@@ -1018,7 +1017,10 @@ gst_rtspsrc_create_stream (GstRTSPSrc * src, GstSDPMessage * sdp, gint idx)
   GST_DEBUG_OBJECT (src, " caps: %" GST_PTR_FORMAT, stream->caps);
   GST_DEBUG_OBJECT (src, " control: %s", GST_STR_NULL (control_url));
 
-  if (control_url != NULL) {
+   if(src->is_kasenna){
+	  stream->control_url = g_strdup(src->conninfo.url_str);
+	  stream->conninfo.location = g_strdup(src->conninfo.url_str);
+   } else if (control_url != NULL) {
     stream->control_url = g_strdup (control_url);
     /* Build a fully qualified url using the content_base if any or by prefixing
      * the original request.
@@ -5236,6 +5238,102 @@ setup_failed:
   }
 }
 
+#define MAX_LEN 1024 * 16
+
+static GstSDPResult
+gst_rtspsrc_rtspmh_to_sdp (const guint8 * data, guint size,
+    GstSDPMessage * msg, GstRTSPSrc * src)
+{
+  GstSDPResult res;
+  gchar *sdp_buffer;
+  gchar *st;
+  gchar *current_word;
+  gchar *current_pos;
+
+  gint32 video_pid;
+  gint64 duration;
+
+  g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL);
+  g_return_val_if_fail (data != NULL, GST_SDP_EINVAL);
+  g_return_val_if_fail (size != 0, GST_SDP_EINVAL);
+  g_return_val_if_fail (src != NULL, GST_SDP_EINVAL);
+  g_return_val_if_fail (g_str_has_prefix((const gchar *)data,(const gchar *)"<MediaDescription>"),GST_SDP_EINVAL);
+
+  if((sdp_buffer=g_malloc(MAX_LEN))==NULL)
+	  return GST_SDP_EINVAL;
+
+  if((current_word=g_malloc(MAX_LEN))==NULL){
+	  g_free(sdp_buffer);
+	  return GST_SDP_EINVAL;
+  }
+
+  g_snprintf(sdp_buffer,MAX_LEN,
+		  "v=0\n"
+		  "o=NoSpacesAllowed 1 1 IN IP4 %s\n"
+		  "s=%s\n"
+ 		  "c=IN IP4 %s\n"
+		  "t=0 0\n"
+		  "a=control:*\n",
+		   gst_rtsp_connection_get_ip(src->conninfo.connection),
+		   GST_STR_NULL(src->conninfo.url_str),
+		   gst_rtsp_connection_get_ip(src->conninfo.connection)
+		  );
+
+  current_pos=(gchar *)data;
+
+  while (g_strcmp0(current_word, "</MediaDescription>") != 0) {
+      sscanf(current_pos, "%s", current_word);
+
+      if (g_strcmp0(current_word, "VideoPid") == 0) {
+		  gchar *endptr=NULL;
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%s", current_word);
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%"G_GINT32_FORMAT, &video_pid);
+    	  current_pos += 3;
+		  GST_DEBUG("video_pid=%"G_GINT32_FORMAT,video_pid);
+      }
+
+      if (g_strcmp0(current_word, "Duration") == 0) {
+		  gchar *endptr=NULL;
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%s", current_word);
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%"G_GINT64_FORMAT, &duration);
+    	  current_pos += 3;
+		  GST_DEBUG("duration=%"G_GINT64_FORMAT,duration);
+      }
+
+      /*if (strcmp(current_word, "TypeSpecificData") == 0) {
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%s", current_word);
+    	  current_pos += strlen(current_word) + 1;
+    	  sscanf(current_pos, "%s", fKasennaContentType);
+    	  currentPos += 3;
+      }*/
+
+   	//TODO: добыть TrickSpeed
+      current_pos += strlen(current_word) + 1;
+  }
+
+  st=g_strdup_printf("a=range:npt=0-%d\n"
+					 "m=video 1554 RAW/RAW/UDP 33\n"
+					 "a=control:trackID=%d\n"
+		  ,(int)(duration/1000000L)
+		  ,video_pid
+		  );
+  g_strlcat(sdp_buffer,st,MAX_LEN);
+  g_free(st);
+
+  if(src->debug)
+	g_print("constructed sdp: %s",sdp_buffer);
+
+  res=gst_sdp_message_parse_buffer((const guint8 *)sdp_buffer,strlen(sdp_buffer),msg);
+
+  g_free(sdp_buffer);
+  return res;
+}
+
 static gboolean
 gst_rtspsrc_retrieve_sdp (GstRTSPSrc * src, GstSDPMessage ** sdp)
 {
@@ -5283,9 +5381,8 @@ restart:
   if (res < 0)
     goto create_request_failed;
 
-  /* we only accept SDP for now */
   gst_rtsp_message_add_header (&request, GST_RTSP_HDR_ACCEPT,
-      "application/sdp");
+      "application/x-rtsp-mh,application/sdp");
 
   /* send DESCRIBE */
   GST_DEBUG_OBJECT (src, "send describe...");
@@ -5316,7 +5413,8 @@ restart:
   /* could not be set but since the request returned OK, we assume it
    * was SDP, else check it. */
   if (respcont) {
-    if (!g_ascii_strcasecmp (respcont, "application/sdp") == 0)
+    if ((g_ascii_strcasecmp (respcont, "application/sdp") != 0) &&
+    		(g_ascii_strcasecmp (respcont, "application/x-rtsp-mh") != 0))
       goto wrong_content_type;
   }
 
@@ -5325,9 +5423,21 @@ restart:
   if (data == NULL || size == 0)
     goto no_describe;
 
+  src->is_kasenna=FALSE;
+
   GST_DEBUG_OBJECT (src, "parse SDP...");
   gst_sdp_message_new (sdp);
+
+  if(g_ascii_strcasecmp (respcont, "application/sdp") == 0){
   gst_sdp_message_parse_buffer (data, size, *sdp);
+  }else{
+	  if(gst_rtspsrc_rtspmh_to_sdp(data, size, *sdp, src) == GST_SDP_OK ){
+		  src->is_kasenna = TRUE;
+	  }else{
+		  gst_sdp_message_free(*sdp);
+		  goto no_describe;
+	  }
+  }
 
   /* clean up any messages */
   gst_rtsp_message_unset (&request);
diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h
index a15ec88..494b8c6 100644
--- a/gst/rtsp/gstrtspsrc.h
+++ b/gst/rtsp/gstrtspsrc.h
@@ -193,6 +193,7 @@ struct _GstRTSPSrc {
   GList           *streams;
   GstStructure    *props;
   gboolean         need_activate;
+  gboolean		   is_kasenna;
 
   /* properties */
   GstRTSPLowerTrans protocols;
