diff --git a/ChangeLog b/ChangeLog
index 49d570dd8d..ee0d9d79fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-04-18  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
+	* gst/wavparse/gstwavparse.c: (gst_wavparse_init),
+	(gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad),
+	(gst_wavparse_parse_fmt), (gst_wavparse_change_state):
+	  Hack to make wavparse work with spider (always -> sometimes pad).
+	  Fixes #135862 && #140411.
+
 2004-04-18  Benjamin Otte  <otte@gnome.org>
 
 	* sys/oss/gstosselement.c: (gst_osselement_sync_parms),
diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c
index 3c600ae6d1..b77802073b 100644
--- a/gst/wavparse/gstwavparse.c
+++ b/gst/wavparse/gstwavparse.c
@@ -63,7 +63,7 @@ GST_STATIC_PAD_TEMPLATE ("wavparse_sink",
 static GstStaticPadTemplate src_template_factory =
     GST_STATIC_PAD_TEMPLATE ("wavparse_src",
     GST_PAD_SRC,
-    GST_PAD_ALWAYS,
+    GST_PAD_SOMETIMES,          /* FIXME: spider */
     GST_STATIC_CAPS ("audio/x-raw-int, "
         "endianness = (int) little_endian, "
         "signed = (boolean) { true, false }, "
@@ -171,7 +171,7 @@ gst_wavparse_init (GstWavParse * wavparse)
   gst_pad_set_query_type_function (wavparse->sinkpad,
       gst_wavparse_get_query_types);
   gst_pad_set_query_function (wavparse->sinkpad, gst_wavparse_pad_query);
-
+#if 0
   /* source */
   wavparse->srcpad =
       gst_pad_new_from_template (gst_static_pad_template_get
@@ -186,7 +186,7 @@ gst_wavparse_init (GstWavParse * wavparse)
   gst_pad_set_event_function (wavparse->srcpad, gst_wavparse_srcpad_event);
   gst_pad_set_event_mask_function (wavparse->srcpad,
       gst_wavparse_get_event_masks);
-
+#endif
   gst_element_set_loop_function (GST_ELEMENT (wavparse), gst_wavparse_loop);
 
   wavparse->state = GST_WAVPARSE_UNKNOWN;
@@ -195,6 +195,35 @@ gst_wavparse_init (GstWavParse * wavparse)
   wavparse->seek_offset = 0;
 }
 
+static void
+gst_wavparse_destroy_sourcepad (GstWavParse * wavparse)
+{
+  gst_element_remove_pad (GST_ELEMENT (wavparse), wavparse->srcpad);
+  wavparse->srcpad = NULL;
+}
+
+static void
+gst_wavparse_create_sourcepad (GstWavParse * wavparse)
+{
+  if (wavparse->srcpad)
+    gst_wavparse_destroy_sourcepad (wavparse);
+
+  /* source */
+  wavparse->srcpad =
+      gst_pad_new_from_template (gst_static_pad_template_get
+      (&src_template_factory), "src");
+  gst_pad_use_explicit_caps (wavparse->srcpad);
+  /*gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->srcpad); */
+  gst_pad_set_formats_function (wavparse->srcpad, gst_wavparse_get_formats);
+  gst_pad_set_convert_function (wavparse->srcpad, gst_wavparse_pad_convert);
+  gst_pad_set_query_type_function (wavparse->srcpad,
+      gst_wavparse_get_query_types);
+  gst_pad_set_query_function (wavparse->srcpad, gst_wavparse_pad_query);
+  gst_pad_set_event_function (wavparse->srcpad, gst_wavparse_srcpad_event);
+  gst_pad_set_event_mask_function (wavparse->srcpad,
+      gst_wavparse_get_event_masks);
+}
+
 static void
 gst_wavparse_get_property (GObject * object,
     guint prop_id, GValue * value, GParamSpec * pspec)
@@ -597,6 +626,8 @@ gst_wavparse_parse_fmt (GstWavParse * wavparse, guint size)
     wavparse->width = GUINT16_FROM_LE (format->wBitsPerSample);
     wavparse->format = GINT16_FROM_LE (format->wFormatTag);
 
+    gst_wavparse_create_sourcepad (wavparse);
+
     /* set the caps on the src pad */
     /* FIXME: handle all of the other formats as well */
     switch (wavparse->format) {
@@ -655,6 +686,7 @@ gst_wavparse_parse_fmt (GstWavParse * wavparse, guint size)
       gst_pad_set_explicit_caps (wavparse->srcpad, caps);
       gst_caps_free (caps);
     }
+    gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->srcpad);
 
     GST_DEBUG ("frequency %d, channels %d", wavparse->rate, wavparse->channels);
   }
@@ -1118,6 +1150,7 @@ gst_wavparse_change_state (GstElement * element)
     case GST_STATE_PLAYING_TO_PAUSED:
       break;
     case GST_STATE_PAUSED_TO_READY:
+      gst_wavparse_destroy_sourcepad (wavparse);
       gst_bytestream_destroy (wavparse->bs);
       wavparse->state = GST_WAVPARSE_UNKNOWN;
       wavparse->bps = 0;