diff -bu Coro-6.47-t1iQeZ/Coro/State.xs~ Coro-6.47-t1iQeZ/Coro/State.xs
--- Coro-6.47-t1iQeZ/Coro/State.xs~	2015-10-05 19:13:33.000000000 +0200
+++ Coro-6.47-t1iQeZ/Coro/State.xs	2015-10-05 19:35:56.000000000 +0200
@@ -1820,12 +1820,30 @@
   return 0;
 }
 
+/* get set len clear free copy dup local */
+static MGVTBL coro_sigelem_vtbl = {
+  coro_sigelem_get,
+  coro_sigelem_set,
+  0,
+  coro_sigelem_clr,
+  0, 0,
+#ifdef MGf_DUP
+  0
+#endif
+#ifdef MGf_LOCAL
+  ,0
+#endif
+};
+
 static MGVTBL coro_state_vtbl = {
   0, 0, 0, 0,
   coro_state_free,
   0,
 #ifdef MGf_DUP
   coro_state_dup,
+# ifdef MGf_LOCAL
+  0
+# endif
 #else
 # define MGf_DUP 0
 #endif
@@ -3608,11 +3626,18 @@
         irsgv    = gv_fetchpv ("/"     , GV_ADD|GV_NOTQUAL, SVt_PV);
         stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
 
-        orig_sigelem_get = PL_vtbl_sigelem.svt_get;   PL_vtbl_sigelem.svt_get   = coro_sigelem_get;
-        orig_sigelem_set = PL_vtbl_sigelem.svt_set;   PL_vtbl_sigelem.svt_set   = coro_sigelem_set;
-        orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; PL_vtbl_sigelem.svt_clear = coro_sigelem_clr;
-
+        orig_sigelem_get = PL_vtbl_sigelem.svt_get;
+        orig_sigelem_set = PL_vtbl_sigelem.svt_set;
+        orig_sigelem_clr = PL_vtbl_sigelem.svt_clear;
         hv_sig      = coro_get_hv (aTHX_ "SIG", TRUE);
+#if (PERL_VERSION < 22)
+        PL_vtbl_sigelem.svt_get   = coro_sigelem_get;
+        PL_vtbl_sigelem.svt_set   = coro_sigelem_set;
+        PL_vtbl_sigelem.svt_clear = coro_sigelem_clr;
+#else
+        /* not allowed to override the default anymore, attach it to %SIG */
+        sv_magicext ((SV *)hv_sig, 0, PERL_MAGIC_sigelem, &coro_sigelem_vtbl, NULL, 0);
+#endif
         rv_diehook  = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV));
         rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV));