diff -uNr vlc-trunk/include/vlc_demux.h vlc-trunk.full_patch/include/vlc_demux.h
--- vlc-trunk/include/vlc_demux.h	2005-10-10 10:27:17.000000000 +0100
+++ vlc-trunk.full_patch/include/vlc_demux.h	2005-11-10 11:22:22.000000000 +0000
@@ -68,7 +68,7 @@
 {
     /* I. Common queries to access_demux and demux */
     /* POSITION double between 0.0 and 1.0 */
-    DEMUX_GET_POSITION,         /* arg1= double *       res=    */
+    
     DEMUX_SET_POSITION,         /* arg1= double         res=can fail    */
 
     /* LENGTH/TIME in microsecond, 0 if unknown */
@@ -105,7 +105,8 @@
     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_SET_RATE           /* arg1=int, arg2=vlc_bool_t *pb_recompute_pts */
 };
 
 /* stream_t *s could be null and then it mean a access+demux in one */
diff -uNr vlc-trunk/modules/control/rc.c vlc-trunk.full_patch/modules/control/rc.c
--- vlc-trunk/modules/control/rc.c	2005-10-21 09:07:02.000000000 +0100
+++ vlc-trunk.full_patch/modules/control/rc.c	2005-11-10 11:22:22.000000000 +0000
@@ -1086,15 +1086,30 @@
     }
     else if ( !strcmp( psz_cmd, "fastforward" ) )
     {
-        val.i_int = config_GetInt( p_intf, "key-jump+3sec" );
-        var_Set( p_intf->p_vlc, "key-pressed", val );
+        if( strlen( newval.psz_string ))
+        {
+            val.i_int = atoi( newval.psz_string );
+        }
+        else
+        {
+            val.i_int = 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-3sec" );
-        var_Set( p_intf->p_vlc, "key-pressed", val );
+        if( strlen( newval.psz_string ))
+        {
+            val.i_int = atoi( newval.psz_string );
+            val.i_int *= -1; //Make this a negative scale value
+        }
+        else
+        {
+            val.i_int = INPUT_RATE_MIN;
+        }
+        var_Set( p_input, "rate", val );
         vlc_object_release( p_input );
         return VLC_SUCCESS;
     }
diff -uNr vlc-trunk/modules/demux/livedotcom.cpp vlc-trunk.full_patch/modules/demux/livedotcom.cpp
--- vlc-trunk/modules/demux/livedotcom.cpp	2005-10-13 14:51:50.000000000 +0100
+++ vlc-trunk.full_patch/modules/demux/livedotcom.cpp	2005-11-10 11:22:22.000000000 +0000
@@ -849,15 +849,19 @@
     demux_sys_t *p_sys = p_demux->p_sys;
     int64_t *pi64;
     double  *pf, f;
+    double d_npt;
     vlc_bool_t *pb, b_bool;
+    int i_rate;
+
+    f = d_npt = 0;
+    i_rate = 1;
 
     switch( i_query )
     {
         case DEMUX_GET_TIME:
             pi64 = (int64_t*)va_arg( args, int64_t * );
             *pi64 = p_sys->i_pcr - p_sys->i_pcr_start + p_sys->i_start;
-            return VLC_SUCCESS;
-
+        return VLC_SUCCESS;
         case DEMUX_GET_LENGTH:
             pi64 = (int64_t*)va_arg( args, int64_t * );
             *pi64 = p_sys->i_length;
@@ -878,30 +882,30 @@
 
         case DEMUX_SET_POSITION:
         {
-            float time;
+            float start_time;
 
             f = (double)va_arg( args, double );
-            time = f * (double)p_sys->i_length / 1000000.0;   /* in second */
+            start_time = f * (double)p_sys->i_length/1000000.0; /* in second */
 
             if( p_sys->rtsp && p_sys->i_length > 0 )
             {
-                int i;
-
-                if( !p_sys->rtsp->playMediaSession( *p_sys->ms, time ) )
+                if( !p_sys->rtsp->pauseMediaSession( *p_sys->ms ) )
                 {
-                    msg_Err( p_demux, "PLAY failed %s", p_sys->env->getResultMsg() );
+                        msg_Err( p_demux, "PAUSE failed %s", 
+                                          p_sys->env->getResultMsg() );
+                        return VLC_EGENERIC;
+                }
+                if( !p_sys->rtsp->playMediaSession( *p_sys->ms, start_time) )
+                {
+                    msg_Err( p_demux, "PLAY failed %s", 
+                                      p_sys->env->getResultMsg() );
                     return VLC_EGENERIC;
                 }
                 p_sys->i_start = (mtime_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 );
 
-#if 0 /* disabled. probably useless */
-                for( i = 0; i < p_sys->i_track; i++ )
-                {
-                    p_sys->track[i]->i_pts = 0;
-                }
-#endif
                 return VLC_SUCCESS;
             }
             return VLC_SUCCESS;
@@ -919,17 +923,10 @@
 
         case DEMUX_CAN_CONTROL_PACE:
             pb = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
-
-#if 0       /* Disable for now until we have a clock synchro algo
-             * which works with something else than MPEG over UDP */
-            *pb = VLC_FALSE;
-#else
             *pb = VLC_TRUE;
-#endif
             return VLC_SUCCESS;
 
         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;
@@ -942,19 +939,56 @@
                     ( !b_bool && !p_sys->rtsp->playMediaSession( *p_sys->ms,
                       d_npt > 0 ? d_npt : -1 ) ) )
             {
-                    msg_Err( p_demux, "PLAY or PAUSE failed %s", p_sys->env->getResultMsg() );
+                    msg_Err( p_demux, "PLAY or PAUSE failed %s", 
+                                      p_sys->env->getResultMsg() );
                     return VLC_EGENERIC;
             }
-#if 0
-            /* reset PCR and PCR start, mmh won't work well for multi-stream I fear */
-            for( i = 0; i < p_sys->i_track; i++ )
+
+	    return VLC_SUCCESS;
+	     
+        case DEMUX_SET_RATE:
+            i_rate = (int)va_arg( args, int );
+
+            if( i_rate == INPUT_RATE_MAX )
+              i_rate = 30;
+            else if( i_rate == INPUT_RATE_MIN )
+              i_rate = -30;
+            else if( i_rate == INPUT_RATE_DEFAULT || i_rate == 0 )
+              i_rate = 1;
+
+            /* Resync the stream */
+            p_sys->i_start = (mtime_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 );
+
+            //First of all we need to Pause the stream
+            if( !p_sys->rtsp->pauseMediaSession( *p_sys->ms ) )
             {
-                p_sys->track[i]->i_pts = 0;
+                msg_Err( p_demux, "PAUSE failed %s", 
+                                  p_sys->env->getResultMsg() );
+                return VLC_EGENERIC;
             }
-            p_sys->i_pcr_start = 0; /* FIXME Wrong */
-            p_sys->i_pcr = 0;
-#endif
-            return VLC_SUCCESS;
+
+            d_npt = -1;
+
+            //Passing -1 for the start and end time will mean liveMedia won't
+            //create a Range: section for the RTSP message. Server should pick
+            //up from current position.
+            if( ( !p_sys->rtsp->playMediaSession( *p_sys->ms, 
+                                                  d_npt, -1, i_rate ) ) )
+            {
+                    msg_Err( p_demux, "PLAY with Scale %d failed %s", 
+                                      i_rate, p_sys->env->getResultMsg() );
+                    return VLC_EGENERIC;
+            }
+          
+            /* Resync the stream */
+            p_sys->i_start = (mtime_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;
 
         case DEMUX_GET_TITLE_INFO:
         case DEMUX_SET_TITLE:
@@ -965,7 +999,6 @@
             pi64 = (int64_t*)va_arg( args, int64_t * );
             *pi64 = (int64_t)var_GetInteger( p_demux, "rtsp-caching" ) * 1000;
             return VLC_SUCCESS;
-
         default:
             return VLC_EGENERIC;
     }
@@ -1009,7 +1042,8 @@
         delete [] psz_options;
 
     p_sdp = (uint8_t*)p_sys->rtsp->describeURL( psz_url,
-                          NULL, var_CreateGetBool( p_demux, "rtsp-kasenna" ) );
+		    NULL, var_CreateGetBool( p_demux, "rtsp-kasenna" ) );
+
     free( psz_url );
     if( p_sdp == NULL )
     {
@@ -1109,8 +1143,8 @@
     demux_sys_t    *p_sys = p_demux->p_sys;
     block_t        *p_block;
 
-    mtime_t i_pts = (uint64_t)pts.tv_sec * UI64C(1000000) +
-        (uint64_t)pts.tv_usec;
+    mtime_t i_pts = (uint64_t)pts.tv_sec * UI64C(1000000) + 
+                                                        (uint64_t)pts.tv_usec;
 
     /* XXX Beurk beurk beurk Avoid having negative value XXX */
     i_pts &= UI64C(0x00ffffffffffffff);
diff -uNr vlc-trunk/src/input/input.c vlc-trunk.full_patch/src/input/input.c
--- vlc-trunk/src/input/input.c	2005-10-19 14:31:09.000000000 +0100
+++ vlc-trunk.full_patch/src/input/input.c	2005-11-10 11:22:22.000000000 +0000
@@ -1377,7 +1377,7 @@
         case INPUT_CONTROL_SET_RATE_SLOWER:
         case INPUT_CONTROL_SET_RATE_FASTER:
         {
-            int i_rate;
+            int i_rate, i_ret;
 
             if( i_type == INPUT_CONTROL_SET_RATE_SLOWER )
                 i_rate = p_input->i_rate * 2;
@@ -1386,37 +1386,43 @@
             else
                 i_rate = val.i_int;
 
-            if( i_rate < INPUT_RATE_MIN )
+            // The demuxer may be able to control the rate from the source
+            // e.g. FastForward stream from a VOD server
+            i_ret = demux2_Control( p_input->input.p_demux,
+                                  DEMUX_SET_RATE, i_rate, VLC_TRUE );
+            if( i_ret != VLC_SUCCESS )
             {
-                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 );
+                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 );
 
-                b_force_update = VLC_TRUE;
+                    /* Reset clock */
+                    es_out_Control( p_input->p_es_out, ES_OUT_RESET_PCR );
+                    b_force_update = VLC_TRUE;
+                }
             }
             break;
         }
@@ -1654,7 +1660,6 @@
                 free( val.psz_string );
             }
             break;
-
         case INPUT_CONTROL_SET_BOOKMARK:
         default:
             msg_Err( p_input, "not yet implemented" );
