diff --git a/gst-libs/gst/gl/gstglslstage.c b/gst-libs/gst/gl/gstglslstage.c
index 2b08adb2d6b..3e2d0e49912 100644
--- a/gst-libs/gst/gl/gstglslstage.c
+++ b/gst-libs/gst/gl/gstglslstage.c
@@ -74,12 +74,24 @@ G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT,
     GST_DEBUG_CATEGORY_INIT (gst_glsl_stage_debug, "glslstage", 0,
         "GLSL Stage"););
 
+static void
+_delete_shader (GstGLContext * context, GstGLSLStage * stage)
+{
+  GstGLSLStagePrivate *priv = stage->priv;
+
+  if (priv->handle)
+    priv->vtable.DeleteShader (priv->handle);
+}
+
 static void
 gst_glsl_stage_finalize (GObject * object)
 {
   GstGLSLStage *stage = GST_GLSL_STAGE (object);
   gint i;
 
+  gst_gl_context_thread_add (stage->context,
+      (GstGLContextThreadFunc) _delete_shader, stage);
+
   if (stage->context) {
     gst_object_unref (stage->context);
     stage->context = NULL;