diff -uNr vlc-0.8.6c-orig/include/vlc_demux.h vlc-0.8.6c-modified/include/vlc_demux.h
--- vlc-0.8.6c-orig/include/vlc_demux.h	2007-06-16 15:25:18.000000000 +0100
+++ vlc-0.8.6c-modified/include/vlc_demux.h	2007-11-02 16:14:15.000000000 +0000
@@ -105,7 +105,10 @@
     DEMUX_CAN_PAUSE,            /* arg1= vlc_bool_t*    cannot fail */
     DEMUX_CAN_CONTROL_PACE,     /* arg1= vlc_bool_t*    cannot fail */
     DEMUX_GET_PTS_DELAY,        /* arg1= int64_t*       cannot fail */
-    DEMUX_SET_PAUSE_STATE       /* arg1= vlc_bool_t     can fail */
+    DEMUX_SET_PAUSE_STATE,      /* arg1= vlc_bool_t     can fail */
+    DEMUX_HAS_SCALE_TRICKPLAY,  /* arg1= vlc_bool_t     cannot fail */
+    DEMUX_GET_SCALE,            /* arg1= int            cannot fail */
+    DEMUX_SET_SCALE             /* arg1= int, arg2= vlc_bool_t can fail */
 };
 
 /* stream_t *s could be null and then it mean a access+demux in one */
diff -uNr vlc-0.8.6c-orig/modules/control/rc.c vlc-0.8.6c-modified/modules/control/rc.c
--- vlc-0.8.6c-orig/modules/control/rc.c	2007-06-16 15:25:07.000000000 +0100
+++ vlc-0.8.6c-modified/modules/control/rc.c	2007-11-02 17:26:01.000000000 +0000
@@ -1133,15 +1133,61 @@
     }
     else if ( !strcmp( psz_cmd, "fastforward" ) )
     {
-        val.i_int = config_GetInt( p_intf, "key-jump+extrashort" );
-        var_Set( p_intf->p_vlc, "key-pressed", val );
+        if( config_GetInt( p_intf, "rtsp-scaled-trickplay" ) == 0 
+            && config_GetInt( p_intf, "rtsp-kasenna") == 0 )
+        {
+            val.i_int = config_GetInt( p_intf, "key-jump+extrashort" );
+            var_Set( p_intf->p_vlc, "key-pressed", val );
+        }
+        else
+        {
+            if( strlen( newval.psz_string ) > 0 )
+            {
+                val.i_int = atoi( newval.psz_string );
+                val.f_float = (float)val.i_int;
+            }
+            else
+            {
+                /* If the user didn't ask for a scale factor then use this
+                 * define as an indicator that we want to use the next scale
+                 * available.
+                 */
+                val.i_int = INPUT_RATE_MAX;
+                val.f_float = (float)INPUT_RATE_MAX;
+            }
+            var_Set( p_input, "rate", val);
+        }
         vlc_object_release( p_input );
         return VLC_SUCCESS;
     }
     else if ( !strcmp( psz_cmd, "rewind" ) )
     {
-        val.i_int = config_GetInt( p_intf, "key-jump-extrashort" );
-        var_Set( p_intf->p_vlc, "key-pressed", val );
+        if( config_GetInt( p_intf, "rtsp-scaled-trickplay" ) == 0 
+            && config_GetInt( p_intf, "rtsp-kasenna") == 0 )
+        {
+            val.i_int = config_GetInt( p_intf, "key-jump-extrashort" );
+            var_Set( p_intf->p_vlc, "key-pressed", val );
+        }
+        else
+        {
+            if( strlen( newval.psz_string ) > 0 )
+            {
+                val.i_int = atoi( newval.psz_string );
+                if( val.i_int > 0 )
+                    val.i_int *= -1; 
+                val.f_float = (float)val.i_int;
+            }
+            else
+            {
+                /* If the user didn't ask for a scale factor then use this
+                 * define as an indicator that we want to use the next scale
+                 * available.
+                 */
+                val.i_int = INPUT_RATE_MIN;
+                val.f_float = (float)INPUT_RATE_MIN;
+            }
+            var_Set( p_input, "rate", val);
+        }
         vlc_object_release( p_input );
         return VLC_SUCCESS;
     }
diff -uNr vlc-0.8.6c-orig/modules/demux/live555.cpp vlc-0.8.6c-modified/modules/demux/live555.cpp
--- vlc-0.8.6c-orig/modules/demux/live555.cpp	2007-11-02 16:15:37.000000000 +0000
+++ vlc-0.8.6c-modified/modules/demux/live555.cpp	2007-11-02 16:14:15.000000000 +0000
@@ -64,14 +64,23 @@
     "Allows you to modify the default caching value for RTSP streams. This " \
     "value should be set in millisecond units." )
 
-#define KASENNA_TEXT N_( "Kasenna RTSP dialect")
-#define KASENNA_LONGTEXT N_( "Kasenna servers use an old and unstandard " \
+#define KASENNA_TEXT N_("Kasenna RTSP dialect")
+#define KASENNA_LONGTEXT N_("Kasenna servers use an old and unstandard " \
     "dialect of RTSP. When you set this parameter, VLC will try this dialect "\
     "for communication. In this mode you cannot connect to normal RTSP servers." )
 
+#define SCALE_TEXT N_("RTSP Scaled trickplay")
+#define SCALE_LONGTEXT N_("RTSP servers can scale the rate of play " \
+    "when delivering a stream. Implementation of scale changes depends on the" \
+    "server and media type. For video, a server may, for example, deliver " \
+    "only key frames or selected key frames. For audio, it may time-scale the" \
+    "audio while preserving pitch or, less desirably, deliver fragments of " \
+    "audio.")
+
 #define USER_TEXT N_("RTSP user name")
 #define USER_LONGTEXT N_("Allows you to modify the user name that will " \
     "be used for authenticating the connection.")
+
 #define PASS_TEXT N_("RTSP password")
 #define PASS_LONGTEXT N_("Allows you to modify the password that will be " \
     "used for the connection.")
@@ -115,6 +124,8 @@
                     USER_LONGTEXT, VLC_TRUE );
         add_string( "rtsp-pwd", NULL, NULL, PASS_TEXT,
                     PASS_LONGTEXT, VLC_TRUE );
+        add_bool(   "rtsp-scaled-trickplay", VLC_FALSE, NULL, SCALE_TEXT,
+                    SCALE_LONGTEXT, VLC_TRUE );
 vlc_module_end();
 
 
@@ -1093,6 +1104,9 @@
     int64_t *pi64;
     double  *pf, f;
     vlc_bool_t *pb, b_bool;
+    float f_scale;
+
+    f = f_scale = 0.0;
 
     switch( i_query )
     {
@@ -1125,7 +1139,8 @@
             f = (double)va_arg( args, double );
             if( p_sys->rtsp && p_sys->i_length > 0 )
             {
-                time = f * (double)p_sys->i_length / 1000000.0;   /* in second */
+                time = f * (double)p_sys->i_length / 1000000.0;  /* in second */
+
                 if( !p_sys->rtsp->playMediaSession( *p_sys->ms, time ) )
                 {
                     msg_Err( p_demux, "PLAY failed %s",
@@ -1135,6 +1150,7 @@
                 p_sys->i_start = (int64_t)(f * (double)p_sys->i_length);
                 p_sys->i_pcr_start = 0;
                 p_sys->i_pcr       = 0;
+                es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
 
                 return VLC_SUCCESS;
             }
@@ -1164,8 +1180,11 @@
         case DEMUX_SET_PAUSE_STATE:
             double d_npt;
 
-            d_npt = ( (double)( p_sys->i_pcr - p_sys->i_pcr_start +
-                                p_sys->i_start ) ) / 1000000.00;
+            d_npt = 0.0;
+            if( var_CreateGetBool( p_demux, "rtsp-kasenna" ) == VLC_FALSE )
+                d_npt = ( (double)( p_sys->i_pcr - p_sys->i_pcr_start +
+                                    p_sys->i_start ) ) / 1000000.00;
+        
 
             b_bool = (vlc_bool_t)va_arg( args, vlc_bool_t );
             if( p_sys->rtsp == NULL )
@@ -1200,6 +1219,7 @@
             p_sys->i_pcr_start = 0; /* FIXME Wrong */
             p_sys->i_pcr = 0;
 #endif
+            es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
             return VLC_SUCCESS;
 
         case DEMUX_GET_TITLE_INFO:
@@ -1212,6 +1232,78 @@
             *pi64 = (int64_t)var_GetInteger( p_demux, "rtsp-caching" ) * 1000;
             return VLC_SUCCESS;
 
+        case DEMUX_HAS_SCALE_TRICKPLAY:
+            pb = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
+            if( p_sys->rtsp && ( var_CreateGetBool( p_demux, "rtsp-kasenna" )
+                    || var_CreateGetBool( p_demux, "rtsp-scaled-trickplay" ) ) )
+                *pb = VLC_TRUE;
+            else
+                *pb = VLC_FALSE;
+            return VLC_SUCCESS;
+        case DEMUX_SET_SCALE:
+            f_scale = (double)va_arg( args, double );
+            if( (int)f_scale == INPUT_RATE_MAX 
+                || (int)f_scale == INPUT_RATE_MIN )
+            {
+                /* Double the current scale if none specified */
+                if( p_sys->ms != NULL )
+                {
+                    if( (int)f_scale == INPUT_RATE_MIN )
+                    {
+                        /* Need a negative value for rewind */
+                        if( (int)p_sys->ms->scale() > 0 )
+                        { 
+                            /* Default Scale (1.0) set to negative for rewind
+                             * And doubled for increased speed
+                             * ((1.0 * 2) * -1) == -2.0 */
+                            f_scale = -2.0; 
+                        } 
+                        else /* double the existing <1.0 scale */
+                        {
+                            f_scale = p_sys->ms->scale() * 2;
+                        }
+                    }
+                    else
+                    {
+                        f_scale = p_sys->ms->scale() * 2;
+                    }
+                }
+                else /* f_scale == INPUT_RATE_MAX */
+                    f_scale = 1.0;
+            }
+            else if( (int)f_scale == INPUT_RATE_DEFAULT || (int)f_scale == 0 )
+            {
+                f_scale = 1.0;
+            }
+
+            /* Passing -1 for the start and end time will mean liveMedia won't
+             * create a Range: section for the RTSP message. The server should 
+             * pick up from the current position */
+            es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
+            if( !p_sys->rtsp->playMediaSession( *p_sys->ms, -1, -1, f_scale ) )
+            {
+                msg_Err( p_demux, "PLAY with Scale %0.2f failed %s", f_scale, 
+                         p_sys->env->getResultMsg() );
+                return VLC_EGENERIC;
+            }
+            /* ReSync the stream */
+            p_sys->i_pcr_start = 0;
+            p_sys->i_pcr = 0;
+            es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
+            
+            return VLC_SUCCESS;
+
+        case DEMUX_GET_SCALE:
+            pf = (double*)va_arg( args, double* );
+            if( p_sys->i_length > 0 )
+            {
+                *pf = (double)( p_sys->ms->scale() );
+            }
+            else
+            {
+                *pf = 1.0;
+            }
+            return VLC_SUCCESS;
         default:
             return VLC_EGENERIC;
     }
diff -uNr vlc-0.8.6c-orig/src/input/input.c vlc-0.8.6c-modified/src/input/input.c
--- vlc-0.8.6c-orig/src/input/input.c	2007-06-16 15:25:04.000000000 +0100
+++ vlc-0.8.6c-modified/src/input/input.c	2007-11-02 16:14:15.000000000 +0000
@@ -1457,46 +1457,67 @@
         case INPUT_CONTROL_SET_RATE_SLOWER:
         case INPUT_CONTROL_SET_RATE_FASTER:
         {
-            int i_rate;
-
-            if( i_type == INPUT_CONTROL_SET_RATE_SLOWER )
-                i_rate = p_input->i_rate * 2;
-            else if( i_type == INPUT_CONTROL_SET_RATE_FASTER )
-                i_rate = p_input->i_rate / 2;
-            else
-                i_rate = val.i_int;
-
-            if( i_rate < INPUT_RATE_MIN )
-            {
-                msg_Dbg( p_input, "cannot set rate faster" );
-                i_rate = INPUT_RATE_MIN;
-            }
-            else if( i_rate > INPUT_RATE_MAX )
-            {
-                msg_Dbg( p_input, "cannot set rate slower" );
-                i_rate = INPUT_RATE_MAX;
-            }
-            if( i_rate != INPUT_RATE_DEFAULT &&
-                ( !p_input->b_can_pace_control ||
-                  ( p_input->p_sout && !p_input->b_out_pace_control ) ) )
-            {
-                msg_Dbg( p_input, "cannot change rate" );
-                i_rate = INPUT_RATE_DEFAULT;
+            int i_rate, i_ret;
+            vlc_bool_t b_scale_trickplay = VLC_FALSE;
+            
+            /* Check to see if the Demux allows us to use Scale trickplay */
+            i_ret = demux2_Control( p_input->input.p_demux, 
+                                    DEMUX_HAS_SCALE_TRICKPLAY, 
+                                    &b_scale_trickplay );
+            if( i_ret == VLC_SUCCESS && b_scale_trickplay == VLC_TRUE )
+            {
+                double scale = val.f_float;
+
+                msg_Dbg( p_input, "Setting RTSP Scale to %0.2f", scale);
+                demux2_Control( p_input->input.p_demux, DEMUX_SET_SCALE, 
+                                scale );
+                msg_Dbg( p_input, "Checking Scale....");
+                /* Now, readback the value actually used by the server */
+                demux2_Control( p_input->input.p_demux, DEMUX_GET_SCALE,
+                                &scale);
+                msg_Dbg( p_input, "Scale set to %0.2f", scale);
             }
-            if( i_rate != p_input->i_rate )
+            else
             {
-                p_input->i_rate  = i_rate;
-                val.i_int = i_rate;
-                var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
+                if( i_type == INPUT_CONTROL_SET_RATE_SLOWER )
+                    i_rate = p_input->i_rate * 2;
+                else if( i_type == INPUT_CONTROL_SET_RATE_FASTER )
+                    i_rate = p_input->i_rate / 2;
+                else
+                    i_rate = val.i_int;
 
-                /* We haven't send data to decoder when rate != default */
-                if( i_rate == INPUT_RATE_DEFAULT )
-                    input_EsOutDiscontinuity( p_input->p_es_out, VLC_TRUE );
+                if( i_rate < INPUT_RATE_MIN )
+                {
+                    msg_Dbg( p_input, "cannot set rate faster" );
+                    i_rate = INPUT_RATE_MIN;
+                }
+                else if( i_rate > INPUT_RATE_MAX )
+                {
+                    msg_Dbg( p_input, "cannot set rate slower" );
+                    i_rate = INPUT_RATE_MAX;
+                }
+                if( i_rate != INPUT_RATE_DEFAULT &&
+                    ( !p_input->b_can_pace_control ||
+                      ( p_input->p_sout && !p_input->b_out_pace_control ) ) )
+                {
+                    msg_Dbg( p_input, "cannot change rate" );
+                    i_rate = INPUT_RATE_DEFAULT;
+                }
+                if( i_rate != p_input->i_rate )
+                {
+                    p_input->i_rate  = i_rate;
+                    val.i_int = i_rate;
+                    var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
+
+                    /* We haven't send data to decoder when rate != default */
+                    if( i_rate == INPUT_RATE_DEFAULT )
+                        input_EsOutDiscontinuity( p_input->p_es_out, VLC_TRUE );
 
-                /* Reset clock */
-                es_out_Control( p_input->p_es_out, ES_OUT_RESET_PCR );
+                    /* Reset clock */
+                    es_out_Control( p_input->p_es_out, ES_OUT_RESET_PCR );
 
-                b_force_update = VLC_TRUE;
+                    b_force_update = VLC_TRUE;
+                }
             }
             break;
         }
