diff --git a/modules/codec/kate.c b/modules/codec/kate.c
index a6d8ef4..ba6837d 100644
--- a/modules/codec/kate.c
+++ b/modules/codec/kate.c
@@ -80,6 +80,7 @@ struct decoder_sys_t
      * Kate properties
      */
     bool           b_ready;
+    bool           b_use_separate_vout;
     kate_info      ki;
     kate_comment   kc;
     kate_state     k;
@@ -158,11 +159,11 @@ static void CloseDecoder  ( vlc_object_t * );
 static int OpenPacketizer( vlc_object_t *p_this );
 #endif
 
-static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block );
+static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block );
 static int ProcessHeaders( decoder_t *p_dec );
-static subpicture_t *ProcessPacket( decoder_t *p_dec, kate_packet *p_kp,
+static void *ProcessPacket( decoder_t *p_dec, kate_packet *p_kp,
                             block_t **pp_block );
-static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp,
+static void *DecodePacket( decoder_t *p_dec, kate_packet *p_kp,
                             block_t *p_block );
 static void ParseKateComments( decoder_t * );
 static subpicture_t *SetupSimpleKateSPU( decoder_t *p_dec, subpicture_t *p_spu,
@@ -351,18 +352,17 @@ static int OpenDecoder( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    msg_Dbg( p_dec, "kate: OpenDecoder");
-
     /* Set callbacks */
-    p_dec->pf_decode_sub = (subpicture_t *(*)(decoder_t *, block_t **))
-        DecodeBlock;
-    p_dec->pf_packetize    = (block_t *(*)(decoder_t *, block_t **))
-        DecodeBlock;
+    p_dec->pf_decode_sub = (subpicture_t *(*)(decoder_t *, block_t **)) DecodeBlock;
+    p_dec->pf_decode_video = (picture_t *(*)(decoder_t *, block_t **))DecodeBlock;
+    p_dec->pf_packetize    = (block_t *(*)(decoder_t *, block_t **))DecodeBlock;
 
     /* Allocate the memory needed to store the decoder's structure */
     if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
         return VLC_ENOMEM;
 
+    msg_Err( p_dec, "kate: OpenDecoder");
+
     vlc_mutex_init( &p_sys->lock );
     p_sys->i_refcount = 0;
     DecSysHold( p_sys );
@@ -372,6 +372,7 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_sys->b_packetizer = false;
 #endif
     p_sys->b_ready = false;
+    p_sys->b_use_separate_vout = false;
     p_sys->i_pts = 0;
 
     kate_comment_init( &p_sys->kc );
@@ -425,7 +426,15 @@ static int OpenDecoder( vlc_object_t *p_this )
 
 #endif
 
-    es_format_Init( &p_dec->fmt_out, SPU_ES, 0 );
+    msg_Err( p_dec, "----------------- %d", p_dec->fmt_in.i_extra );
+    if( ProcessHeaders( p_dec ) )
+    {
+        vlc_mutex_unlock( &kate_decoder_list_mutex );
+        DecSysRelease( p_dec->p_sys );
+        return VLC_EGENERIC;
+    }
+
+    es_format_Init( &p_dec->fmt_out, p_sys->b_use_separate_vout ? VIDEO_ES : SPU_ES, 0 );
 
     /* add the decoder to the global list */
     decoder_t **list = realloc( kate_decoder_list, (kate_decoder_list_size+1) * sizeof( *list ));
@@ -462,7 +471,7 @@ static int OpenPacketizer( vlc_object_t *p_this )
  ****************************************************************************
  * This function must be fed with kate packets.
  ****************************************************************************/
-static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
+static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     block_t *p_block;
@@ -494,6 +503,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     /* Block to Kate packet */
     kate_packet_wrap(&kp, p_block->i_buffer, p_block->p_buffer);
 
+#if 0
     if( p_sys->i_headers == 0 && p_dec->fmt_in.i_extra )
     {
         /* Headers already available as extra data */
@@ -531,10 +541,28 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         }
         else p_sys->i_headers++;
     }
-
+#endif
     return ProcessPacket( p_dec, &kp, pp_block );
 }
 
+static bool ShouldUseSeparateVOut( kate_info *ki )
+{
+#ifndef HAVE_TIGER
+    return false;
+#endif
+    ki->original_canvas_width = 256;
+    ki->original_canvas_height = 256;
+    /* only if we know the size we should be displaying at */
+    if( !ki->original_canvas_width || !ki->original_canvas_height )
+        return false;
+
+    return true;
+
+    /* only for slides - display either alone, or in addition to accompanying video */
+    return !strcmp( ki->category, "K-SLD-I" ) ||
+           !strcmp( ki->category, "K-SLD-T" );
+}
+
 /*****************************************************************************
  * ProcessHeaders: process Kate headers.
  *****************************************************************************/
@@ -620,6 +648,7 @@ static int ProcessHeaders( decoder_t *p_dec )
             msg_Err( p_dec, "Kate failed to initialize for decoding: %d", i_ret );
             return VLC_EGENERIC;
         }
+        p_sys->b_use_separate_vout = ShouldUseSeparateVOut( &p_sys->ki );
         p_sys->b_ready = true;
     }
 #ifdef ENABLE_PACKETIZER
@@ -639,12 +668,11 @@ static int ProcessHeaders( decoder_t *p_dec )
 /*****************************************************************************
  * ProcessPacket: processes a kate packet.
  *****************************************************************************/
-static subpicture_t *ProcessPacket( decoder_t *p_dec, kate_packet *p_kp,
+static void *ProcessPacket( decoder_t *p_dec, kate_packet *p_kp,
                             block_t **pp_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     block_t *p_block = *pp_block;
-    subpicture_t *p_buf = NULL;
 
     /* Date management */
     if( p_block->i_pts > 0 && p_block->i_pts != p_sys->i_pts )
@@ -665,20 +693,20 @@ static subpicture_t *ProcessPacket( decoder_t *p_dec, kate_packet *p_kp,
         else
             p_block->i_length = 0;
 
-        p_buf = p_block;
+        return p_block;
     }
     else
 #endif
     {
-        if( p_sys->i_headers >= p_sys->i_num_headers && p_sys->i_num_headers > 0)
-            p_buf = DecodePacket( p_dec, p_kp, p_block );
+        void *p_ret;
+        if( p_sys->b_ready )
+            p_ret = DecodePacket( p_dec, p_kp, p_block );
         else
-            p_buf = NULL;
+            p_ret = NULL;
 
         if( p_block ) block_Release( p_block );
+        return p_ret;
     }
-
-    return p_buf;
 }
 
 /* nicked off blend.c */
@@ -1212,10 +1240,49 @@ static int TigerConfigurationCallback( vlc_object_t *p_this, const char *psz_var
 
 #endif
 
+static picture_t *SendToVout( decoder_t *p_dec, const kate_event *ev, mtime_t i_pts )
+{
+    decoder_sys_t *p_sys = p_dec->p_sys;
+    es_format_t *p_fmt = &p_dec->fmt_out;
+    const kate_float t = i_pts / 1000000.0f;
+
+    p_fmt->i_codec = VLC_FOURCC('R','G','B','A');
+    p_fmt->video.i_aspect = VOUT_ASPECT_FACTOR;
+    p_fmt->video.i_sar_num = 1;
+    p_fmt->video.i_sar_den = 1;
+    p_fmt->video.i_width = ev->ki->original_canvas_width;
+    p_fmt->video.i_height = ev->ki->original_canvas_height;
+
+    picture_t *p_pic = decoder_NewPicture( p_dec );
+    if( !p_pic )
+        return NULL;
+    p_pic->date = i_pts;
+
+    vlc_mutex_lock( &p_sys->lock );
+    CHECK_TIGER_RET( tiger_renderer_add_event( p_sys->p_tr, ev->ki, ev ) );
+    if( tiger_renderer_set_buffer( p_sys->p_tr, p_pic->p[0].p_pixels, p_fmt->video.i_width, p_fmt->video.i_height, p_fmt->video.i_width*4, 1 ) >= 0 )
+    {
+        if( tiger_renderer_update( p_sys->p_tr, t, 1 ) >= 0 )
+        {
+            if( tiger_renderer_render( p_sys->p_tr ) >= 0 )
+            {
+                PostprocessTigerImage( &p_pic->p[0], p_fmt->video.i_width );
+                vlc_mutex_unlock( &p_sys->lock );
+                return p_pic;
+            }
+        }
+    }
+    vlc_mutex_unlock( &p_sys->lock );
+
+    decoder_DeletePicture( p_dec, p_pic );
+    return NULL;
+}
+
+
 /*****************************************************************************
  * DecodePacket: decodes a Kate packet.
  *****************************************************************************/
-static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t *p_block )
+static void *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t *p_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     const kate_event *ev = NULL;
@@ -1247,6 +1314,11 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, kate_packet *p_kp, block_t
         return NULL;
     }
 
+    if( p_sys->b_use_separate_vout )
+    {
+        return SendToVout( p_dec, ev, p_block->i_pts );
+    }
+
     /* we have an event */
 
     /* Get a new spu */
