diff --git a/ChangeLog b/ChangeLog
index b3273de7317f957a25a01d70b9819ce860f6792b..8b2e04ac9c40835495a4a3eaaa1ab3f7da71681a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2014-09-22  Niels Möller  <nisse@lysator.liu.se>
 
+	* testsuite/ecc-modinv-test.c (test_modulo): New function, same
+	organization as in ecc-mod-test.c below.
+
 	* testsuite/ecc-mod-test.c (test_modulo): New function, testing
 	one modulo. Replacing...
 	(test_curve): ... old function.
diff --git a/testsuite/ecc-modinv-test.c b/testsuite/ecc-modinv-test.c
index 8c78c700459210c2a6b02870e4c84bb24a6772a4..ea49c2b6ac7a0401576797706b71d73c39350042 100644
--- a/testsuite/ecc-modinv-test.c
+++ b/testsuite/ecc-modinv-test.c
@@ -37,110 +37,97 @@ ref_modinv (mp_limb_t *rp, const mp_limb_t *ap, const mp_limb_t *mp, mp_size_t m
 #define MAX_ECC_SIZE (1 + 521 / GMP_NUMB_BITS)
 #define COUNT 500
 
-void
-test_main (void)
+static void
+test_modulo (gmp_randstate_t rands, const char *name,
+	     const struct ecc_modulo *m)
 {
-  gmp_randstate_t rands;
   mp_limb_t a[MAX_ECC_SIZE];
   mp_limb_t ai[MAX_ECC_SIZE];
   mp_limb_t ref[MAX_ECC_SIZE];
   mp_limb_t scratch[ECC_MODINV_ITCH (MAX_ECC_SIZE)];
-  unsigned i;
+  unsigned j;
   mpz_t r;
 
-  gmp_randinit_default (rands);
   mpz_init (r);
   
-  for (i = 0; ecc_curves[i]; i++)
+  /* Check behaviour for zero input */
+  mpn_zero (a, m->size);
+  memset (ai, 17, m->size * sizeof(*ai));
+  m->invert (m, ai, a, scratch);
+  if (!mpn_zero_p (ai, m->size))
+    {
+      fprintf (stderr, "%s->invert failed for zero input (bit size %u):\n",
+	       name, m->bit_size);
+      gmp_fprintf (stderr, "p = %Nx\n"
+		   "t = %Nx (bad)\n",
+		   m->m, m->size,
+		   ai, m->size);
+      abort ();
+    }
+	  
+  /* Check behaviour for a = m */
+  mpn_copyi (a, m->m, m->size);
+  memset (ai, 17, m->size * sizeof(*ai));
+  m->invert (m, ai, a, scratch);
+  if (!mpn_zero_p (ai, m->size))
     {
-      const struct ecc_curve *ecc = ecc_curves[i];
-      unsigned j;
-      /* Check behaviour for zero input */
-      mpn_zero (a, ecc->p.size);
-      memset (ai, 17, ecc->p.size * sizeof(*ai));
-      ecc->p.invert (&ecc->p, ai, a, scratch);
-      if (!mpn_zero_p (ai, ecc->p.size))
+      fprintf (stderr, "%s->invert failed for a = p input (bit size %u):\n",
+	       name, m->bit_size);
+      gmp_fprintf (stderr, "p = %Nx\n"
+		   "t = %Nx (bad)\n",
+		   m->m, m->size,
+		   ai, m->size);
+      abort ();
+    }
+	
+  for (j = 0; j < COUNT; j++)
+    {
+      if (j & 1)
+	mpz_rrandomb (r, rands, m->size * GMP_NUMB_BITS);
+      else
+	mpz_urandomb (r, rands, m->size * GMP_NUMB_BITS);
+
+      mpz_limbs_copy (a, r, m->size);
+
+      if (!ref_modinv (ref, a, m->m, m->size))
 	{
-	  fprintf (stderr, "ecc->p.invert failed for zero input (bit size %u):\n",
-		       ecc->p.bit_size);
-	  gmp_fprintf (stderr, "p = %Nx\n"
-		       "t = %Nx (bad)\n",
-		       ecc->p.m, ecc->p.size,
-		       ai, ecc->p.size);
-	  abort ();
+	  if (verbose)
+	    fprintf (stderr, "Test %u (bit size %u) not invertible mod %s.\n",
+		     j, m->bit_size, name);
+	  continue;
 	}
-	  
-      /* Check behaviour for a = p */
-      mpn_copyi (a, ecc->p.m, ecc->p.size);
-      memset (ai, 17, ecc->p.size * sizeof(*ai));
-      ecc->p.invert (&ecc->p, ai, a, scratch);
-      if (!mpn_zero_p (ai, ecc->p.size))
+      m->invert (m, ai, a, scratch);
+      if (mpn_cmp (ref, ai, m->size))
 	{
-	  fprintf (stderr, "ecc->p.invert failed for a = p input (bit size %u):\n",
-		       ecc->p.bit_size);
-	  gmp_fprintf (stderr, "p = %Nx\n"
-		       "t = %Nx (bad)\n",
-		       ecc->p.m, ecc->p.size,
-		       ai, ecc->p.size);
+	  fprintf (stderr, "%s->invert failed (test %u, bit size %u):\n",
+		   name, j, m->bit_size);
+	  gmp_fprintf (stderr, "a = %Zx\n"
+		       "p = %Nx\n"
+		       "t = %Nx (bad)\n"
+		       "r = %Nx\n",
+		       r, m->m, m->size,
+		       ai, m->size,
+		       ref, m->size);
 	  abort ();
 	}
-	
-      for (j = 0; j < COUNT; j++)
-	{
-	  if (j & 1)
-	    mpz_rrandomb (r, rands, ecc->p.size * GMP_NUMB_BITS);
-	  else
-	    mpz_urandomb (r, rands, ecc->p.size * GMP_NUMB_BITS);
-
-	  mpz_limbs_copy (a, r, ecc->p.size);
+	  
+    }
+  mpz_clear (r);
+}
 
-	  if (!ref_modinv (ref, a, ecc->p.m, ecc->p.size))
-	    {
-	      if (verbose)
-		fprintf (stderr, "Test %u (bit size %u) not invertible.\n",
-			 j, ecc->p.bit_size);
-	      continue;
-	    }
-	  ecc->p.invert (&ecc->p, ai, a, scratch);
-	  if (mpn_cmp (ref, ai, ecc->p.size))
-	    {
-	      fprintf (stderr, "ecc->p.invert failed (test %u, bit size %u):\n",
-		       j, ecc->p.bit_size);
-	      gmp_fprintf (stderr, "a = %Zx\n"
-			   "p = %Nx\n"
-			   "t = %Nx (bad)\n"
-			   "r = %Nx\n",
-			   r, ecc->p.m, ecc->p.size,
-			   ai, ecc->p.size,
-			   ref, ecc->p.size);
-	      abort ();
-	    }
+void
+test_main (void)
+{
+  gmp_randstate_t rands;
+  unsigned i;
 
-	  mpz_limbs_copy (a, r, ecc->p.size);
+  gmp_randinit_default (rands);
 
-	  if (!ref_modinv (ref, a, ecc->q.m, ecc->p.size))
-	    {
-	      fprintf (stderr, "Test %u (bit size %u) not invertible.\n",
-		       j, ecc->q.bit_size);
-	      continue;
-	    }
-	  ecc->q.invert (&ecc->q, ai, a, scratch);
-	  if (mpn_cmp (ref, ai, ecc->p.size))
-	    {
-	      fprintf (stderr, "ecc->q.invert failed (test %u, bit size %u):\n",
-		       j, ecc->q.bit_size);
-	      gmp_fprintf (stderr, "a = %Zx\n"
-			   "p = %Nx\n"
-			   "t = %Nx (bad)\n"
-			   "r = %Nx\n",
-			   r, ecc->p.m, ecc->p.size,
-			   ai, ecc->p.size,
-			   ref, ecc->p.size);
-	      abort ();
-	    }
-	}
+  for (i = 0; ecc_curves[i]; i++)
+    {
+      test_modulo (rands, "p", &ecc_curves[i]->p);
+      test_modulo (rands, "q", &ecc_curves[i]->q);
     }
   gmp_randclear (rands);
-  mpz_clear (r);
 }
 #endif /* ! NETTLE_USE_MINI_GMP */