diff --git a/ChangeLog b/ChangeLog
index 5d77d60dac7a15af87770b1ae6980f79385e51fa..b069d6303dd2feb7aa0b11116f20aefde2b596c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-03-28  Niels Möller  <nisse@lysator.liu.se>
+
+	* dsa-keygen.c (dsa_generate_keypair): New interface, generating
+	only a keypair, and no new parameters.
+	* dsa-compat-keygen.c (dsa_compat_generate_keypair): New file.
+	Moved old key generation function here. Use dsa_generate_keypair.
+
 2014-03-27  Niels Möller  <nisse@lysator.liu.se>
 
 	* dsa-compat.c (dsa_public_key_init, dsa_public_key_clear)
diff --git a/Makefile.in b/Makefile.in
index fe9936b0277003d8469687860259eef90884c214..5fbc1eee043946fbb9060674a881013b1871986e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -148,7 +148,7 @@ hogweed_SOURCES = sexp.c sexp-format.c \
 		  rsa-encrypt.c rsa-decrypt.c rsa-decrypt-tr.c \
 		  rsa-keygen.c rsa-compat.c rsa-blind.c \
 		  rsa2sexp.c sexp2rsa.c \
-		  dsa.c dsa-compat.c dsa-gen-params.c \
+		  dsa.c dsa-compat.c dsa-compat-keygen.c dsa-gen-params.c \
 		  dsa-sign.c dsa-verify.c dsa-keygen.c dsa-hash.c \
 		  dsa-sha1-sign.c dsa-sha1-verify.c \
 		  dsa-sha256-sign.c dsa-sha256-verify.c  \
diff --git a/dsa-compat-keygen.c b/dsa-compat-keygen.c
new file mode 100644
index 0000000000000000000000000000000000000000..390b0a6290a53fc3da4cbd7a1f7cad2be1b605e9
--- /dev/null
+++ b/dsa-compat-keygen.c
@@ -0,0 +1,79 @@
+/* dsa-compat-keygen.c
+ *
+ * Generation of DSA keypairs
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002, 2014 Niels Möller
+ *  
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ * 
+ * The nettle library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+ * License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02111-1301, USA.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "dsa-compat.h"
+
+#include "bignum.h"
+
+/* Undo name mangling */
+#undef dsa_generate_keypair
+#define dsa_generate_keypair nettle_dsa_generate_keypair
+
+/* Valid sizes, according to FIPS 186-3 are (1024, 160), (2048, 224),
+   (2048, 256), (3072, 256). */
+int
+dsa_compat_generate_keypair(struct dsa_public_key *pub,
+			    struct dsa_private_key *key,
+			    void *random_ctx, nettle_random_func *random,
+			    void *progress_ctx, nettle_progress_func *progress,
+			    unsigned p_bits, unsigned q_bits)
+{
+  struct dsa_params *params;
+
+  switch (q_bits)
+    {
+    case 160:
+      if (p_bits < DSA_SHA1_MIN_P_BITS)
+	return 0;
+      break;
+    case 224:
+    case 256:
+      if (p_bits < DSA_SHA256_MIN_P_BITS)
+	return 0;
+      break;
+    default:
+      return 0;
+    }
+
+  /* NOTE: Depends on identical layout! */
+  params = (struct dsa_params *) pub;
+
+  if (!dsa_generate_params (params,
+			    random_ctx, random,
+			    progress_ctx, progress,
+			    p_bits, q_bits))
+    return 0;
+
+  dsa_generate_keypair (params, pub->y, key->x, random_ctx, random);
+
+  return 1;
+}
diff --git a/dsa-compat.h b/dsa-compat.h
index 427c15d84e232c593b0ad5bda141bd10560bdc1c..05e5a7ac1160a84d3ca68faba09efce40609f710 100644
--- a/dsa-compat.h
+++ b/dsa-compat.h
@@ -49,7 +49,6 @@
 /* Switch meaning of dsa_generate_keypair */
 #undef dsa_generate_keypair
 #define dsa_generate_keypair nettle_dsa_compat_generate_keypair
-#define dsa_generate_keypair_new nettle_dsa_generate_keypair
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/dsa-keygen.c b/dsa-keygen.c
index 794810ddcb8fd971c8937a0ff1e23af1eeb9a6e4..4e432c2d8c8ecc679e16b716259ea200e6a87250 100644
--- a/dsa-keygen.c
+++ b/dsa-keygen.c
@@ -27,62 +27,29 @@
 # include "config.h"
 #endif
 
-#include <assert.h>
 #include <stdlib.h>
 
-#include "dsa-compat.h"
+#include "dsa.h"
 
 #include "bignum.h"
 
 
 /* Valid sizes, according to FIPS 186-3 are (1024, 160), (2048, 224),
-   (2048, 256), (3072, 256). */
-int
-dsa_generate_keypair(struct dsa_public_key *pub,
-		     struct dsa_private_key *key,
-		     void *random_ctx, nettle_random_func *random,
-		     void *progress_ctx, nettle_progress_func *progress,
-		     unsigned p_bits, unsigned q_bits)
+   (2048, 256), (3072, 256). Currenty, we use only q_bits of 160 or
+   256. */
+void
+dsa_generate_keypair (const struct dsa_params *params,
+		      mpz_t pub, mpz_t key,
+
+		      void *random_ctx, nettle_random_func *random)
 {
-  struct dsa_params *params;
   mpz_t r;
 
-  switch (q_bits)
-    {
-    case 160:
-      if (p_bits < DSA_SHA1_MIN_P_BITS)
-	return 0;
-      break;
-    case 224:
-    case 256:
-      if (p_bits < DSA_SHA256_MIN_P_BITS)
-	return 0;
-      break;
-    default:
-      return 0;
-    }
-
-  /* NOTE: Depends on identical layout! */
-  params = (struct dsa_params *) pub;
-
-  if (!dsa_generate_params (params,
-			    random_ctx, random,
-			    progress_ctx, progress,
-			    p_bits, q_bits))
-    return 0;
-  
-  mpz_init_set(r, pub->q);
+  mpz_init_set(r, params->q);
   mpz_sub_ui(r, r, 2);
-  nettle_mpz_random(key->x, random_ctx, random, r);
+  nettle_mpz_random(key, random_ctx, random, r);
 
-  mpz_add_ui(key->x, key->x, 1);
-
-  mpz_powm(pub->y, pub->g, key->x, pub->p);
-
-  if (progress)
-    progress (progress_ctx, '\n');
-  
+  mpz_add_ui(key, key, 1);
+  mpz_powm(pub, params->g, key, params->p);
   mpz_clear (r);
-
-  return 1;
 }
diff --git a/dsa.h b/dsa.h
index 4f15e78499b1352a3ca42e99397bad5e15afa4bd..094544d7df267fd5a4625652a0f72477f713d990 100644
--- a/dsa.h
+++ b/dsa.h
@@ -119,6 +119,11 @@ dsa_generate_params(struct dsa_params *params,
 		    void *progress_ctx, nettle_progress_func *progress,
 		    unsigned p_bits, unsigned q_bits);
 
+void
+dsa_generate_keypair (const struct dsa_params *params,
+		      mpz_t pub, mpz_t key,
+		      void *random_ctx, nettle_random_func *random);
+
 /* Keys in sexp form. */
 
 struct nettle_buffer;