diff --git a/src/arping_test.c b/src/arping_test.c
index 438670b..0133fe7 100644
--- a/src/arping_test.c
+++ b/src/arping_test.c
@@ -40,35 +40,10 @@ extern libnet_t* libnet;
 extern int mock_libnet_lo_ok;
 extern int mock_libnet_null_ok;

-struct registered_test {
-        void* fn;
-        const char* name;
-};
-
-static int numtests = 0;
-static struct registered_test test_registry[1024];
-
-static int num_exit_tests = 0;
-static struct registered_test test_exit_registry[1024];
-
 int get_mac_addr(const char *in, char *out);
 void strip_newline(char* s);


-#define MYTEST(a) static void a(int);__attribute__((constructor)) \
-static void cons_##a() {                           \
-                test_registry[numtests].fn = a;    \
-                test_registry[numtests].name = #a; \
-                numtests++;                        \
-} START_TEST(a)
-
-#define MY_EXIT_TEST(a) static void a(int);__attribute__((constructor)) \
-static void cons_##a() {                                      \
-                test_exit_registry[num_exit_tests].fn = a;    \
-                test_exit_registry[num_exit_tests].name = #a; \
-                num_exit_tests++;                             \
-} START_TEST(a)
-
 /**
  *
  */
@@ -236,7 +211,7 @@ dump_packet(uint8_t* packet, int len)
         fprintf(stderr, "\n");
 }

-MYTEST(test_mkpacket)
+START_TEST(test_mkpacket)
 {
         uint8_t correct_packet[] = {
                 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
@@ -261,7 +236,7 @@ MYTEST(test_mkpacket)


 // Received uninteresting packet, should not record anything.
-MYTEST(pingip_uninteresting_packet)
+START_TEST(pingip_uninteresting_packet)
 {
         struct pcap_pkthdr pkthdr;
         uint8_t* packet;
@@ -389,7 +364,7 @@ MYTEST(pingip_uninteresting_packet)
 } END_TEST

 // Received reply that actually matches. Things should happen.
-MYTEST(pingip_interesting_packet)
+START_TEST(pingip_interesting_packet)
 {
         struct pcap_pkthdr pkthdr;
         extern uint8_t srcmac[ETH_ALEN];
@@ -449,7 +424,7 @@ MYTEST(pingip_interesting_packet)
                     "numrecvd not incremented second time");
 } END_TEST

-MYTEST(strip_newline_test)
+START_TEST(strip_newline_test)
 {
         const char *tests[][2] = {
                 {"", ""},
@@ -469,7 +444,7 @@ MYTEST(strip_newline_test)
         }
 } END_TEST

-MYTEST(get_mac_addr_success)
+START_TEST(get_mac_addr_success)
 {
         const char *tests[][2] = {
                 // Null.
@@ -501,7 +476,7 @@ MYTEST(get_mac_addr_success)
         }
 } END_TEST

-MYTEST(get_mac_addr_fail)
+START_TEST(get_mac_addr_fail)
 {
         const char *tests[] = {
                 "",
@@ -517,7 +492,7 @@ MYTEST(get_mac_addr_fail)
         }
 } END_TEST

-MY_EXIT_TEST(libnet_init_bad_nolo)
+START_TEST(libnet_init_bad_nolo)
 {
         // It'll only try lo if named interface fails.
         // So by accepting lo, we make sure it doesn't try lo.
@@ -525,27 +500,28 @@ MY_EXIT_TEST(libnet_init_bad_nolo)
         do_libnet_init("bad", 0);
 } END_TEST

-MY_EXIT_TEST(libnet_init_null_nolo_nonull)
+START_TEST(libnet_init_null_nolo_nonull)
 {
         mock_libnet_lo_ok = 0;
         mock_libnet_null_ok = 0;
         do_libnet_init(NULL, 0);
 } END_TEST

-MYTEST(libnet_init_good)
+START_TEST(libnet_init_good)
 {
         mock_libnet_lo_ok = 0; // Don't even try falling back to lo.
         do_libnet_init("good", 0);
         fail_if(libnet == NULL);
 } END_TEST

-MYTEST(libnet_init_null_nolo)
+START_TEST(libnet_init_null_nolo)
 {
         mock_libnet_lo_ok = 0;
         mock_libnet_null_ok = 1;
         do_libnet_init(NULL, 0);
         fail_if(libnet == NULL);
-} END_TEST
+}
+END_TEST

 static Suite*
 arping_suite(void)
@@ -553,17 +529,34 @@ arping_suite(void)
         int c;
         Suite* s = suite_create("Arping");

-        //tcase_add_checked_fixture (tc_core, setup, teardown);
-        for (c = 0; c < numtests; c++) {
-                TCase *tc_core = tcase_create(test_registry[c].name);
-                tcase_add_test(tc_core, test_registry[c].fn);
-                suite_add_tcase(s, tc_core);
-        }
-        for (c = 0; c < num_exit_tests; c++) {
-                TCase *tc_core = tcase_create(test_exit_registry[c].name);
-                tcase_add_exit_test(tc_core, test_exit_registry[c].fn, 1);
-                suite_add_tcase(s, tc_core);
-        }
+
+        TCase *tc_core;
+
+        // libcheck broke test registries, so have to resort to code duplication. :-(
+        // https://github.com/libcheck/check/pull/158/files
+#define SIGH_LIBCHECK(tn) \
+        tc_core = tcase_create(#tn);   \
+        tcase_add_test(tc_core, tn); \
+        suite_add_tcase(s, tc_core);
+
+        SIGH_LIBCHECK(libnet_init_null_nolo);
+        SIGH_LIBCHECK(test_mkpacket);
+        SIGH_LIBCHECK(pingip_uninteresting_packet);
+        SIGH_LIBCHECK(pingip_interesting_packet);
+        SIGH_LIBCHECK(strip_newline_test);
+        SIGH_LIBCHECK(get_mac_addr_success);
+        SIGH_LIBCHECK(get_mac_addr_fail);
+        SIGH_LIBCHECK(libnet_init_good);
+
+
+#define SIGH_LIBCHECK_EXIT(tn)          \
+        tc_core = tcase_create(#tn);   \
+        tcase_add_exit_test(tc_core, tn, 1);      \
+        suite_add_tcase(s, tc_core);
+
+        SIGH_LIBCHECK_EXIT(libnet_init_bad_nolo);
+        SIGH_LIBCHECK_EXIT(libnet_init_null_nolo_nonull);
+
         return s;
 }

@@ -577,6 +570,7 @@ main()
         number_failed = srunner_ntests_failed (sr);
         srunner_free (sr);
         return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+        return 0;
 }
 /* ---- Emacs Variables ----
  * Local Variables:
