diff --git a/Makefile.in b/Makefile.in
index efff06018ca433cc511805042a7d6d5a117f3e66..19061b36dc8d62d6a5e3090a559e020d04af8138 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -19,9 +19,11 @@ SUBDIRS = tools testsuite examples
 include config.make
 
 PRE_CPPFLAGS = -I.
+LIBTARGETS = libnettle.a @IF_HOGWEED@ libhogweed.a
+SHLIBTARGETS = $(LIBNETTLE_FORLINK) @IF_HOGWEED@ $(LIBHOGWEED_FORLINK)
 
 TARGETS = aesdata$(EXEEXT) desdata$(EXEEXT) shadata$(EXEEXT) \
-	  libnettle.a $(SHLIBTARGET)
+	  $(LIBTARGETS) @IF_SHARED@ $(SHLIBTARGETS)
 
 DOCTARGETS = nettle.info nettle.html nettle.pdf
 
@@ -65,24 +67,25 @@ nettle_SOURCES = aes-decrypt-internal.c aes-decrypt.c \
 		 serpent.c serpent-meta.c \
 		 twofish.c twofish-meta.c \
 		 yarrow256.c yarrow_key_event.c \
-		 sexp.c sexp-format.c \
-		 sexp-transport.c sexp-transport-format.c \
-		 bignum.c bignum-random.c sexp2bignum.c \
-		 pkcs1.c pkcs1-rsa-md5.c pkcs1-rsa-sha1.c pkcs1-rsa-sha256.c \
-		 rsa.c rsa-sign.c rsa-verify.c \
-		 rsa-md5-sign.c rsa-md5-verify.c \
-		 rsa-sha1-sign.c rsa-sha1-verify.c \
-		 rsa-sha256-sign.c rsa-sha256-verify.c \
-		 rsa-encrypt.c rsa-decrypt.c \
-		 rsa-keygen.c rsa-compat.c \
-		 rsa2sexp.c sexp2rsa.c \
-		 dsa.c dsa-sign.c dsa-verify.c dsa-keygen.c \
-		 sexp2dsa.c \
-		 pgp-encode.c rsa2openpgp.c \
-		 der-iterator.c der2rsa.c \
 		 buffer.c buffer-init.c realloc.c \
 		 nettle-internal.c
 
+hogweed_SOURCES = sexp.c sexp-format.c \
+		  sexp-transport.c sexp-transport-format.c \
+		  bignum.c bignum-random.c sexp2bignum.c \
+		  pkcs1.c pkcs1-rsa-md5.c pkcs1-rsa-sha1.c pkcs1-rsa-sha256.c \
+		  rsa.c rsa-sign.c rsa-verify.c \
+		  rsa-md5-sign.c rsa-md5-verify.c \
+		  rsa-sha1-sign.c rsa-sha1-verify.c \
+		  rsa-sha256-sign.c rsa-sha256-verify.c \
+		  rsa-encrypt.c rsa-decrypt.c \
+		  rsa-keygen.c rsa-compat.c \
+		  rsa2sexp.c sexp2rsa.c \
+		  dsa.c dsa-sign.c dsa-verify.c dsa-keygen.c \
+		  sexp2dsa.c \
+		  pgp-encode.c rsa2openpgp.c \
+		  der-iterator.c der2rsa.c \
+
 HEADERS = aes.h arcfour.h arctwo.h asn1.h bignum.h blowfish.h \
 	  base16.h base64.h buffer.h cast128.h \
 	  cbc.h ctr.h \
@@ -101,7 +104,7 @@ HEADERS = aes.h arcfour.h arctwo.h asn1.h bignum.h blowfish.h \
 
 INSTALL_HEADERS = $(HEADERS) nettle-stdint.h
 
-SOURCES = $(nettle_SOURCES) aesdata.c desdata.c shadata.c
+SOURCES = $(nettle_SOURCES) $(hogweed_SOURCES) aesdata.c desdata.c shadata.c
 
 DISTFILES = $(SOURCES) $(HEADERS) .bootstrap aclocal.m4 configure.ac \
 	configure stamp-h.in \
@@ -114,26 +117,41 @@ DISTFILES = $(SOURCES) $(HEADERS) .bootstrap aclocal.m4 configure.ac \
 	asm.m4 \
 	nettle.texinfo nettle.info nettle.html nettle.pdf sha-example.c
 
-# Rules building libnettle.a
-# FIXME: Do we really need to delete the archive first?
+# Rules building static libraries
 nettle_OBJS = $(nettle_SOURCES:.c=.$(OBJEXT)) $(LIBOBJS)
 nettle_PURE_OBJS = $(nettle_OBJS:.$(OBJEXT)=.p$(OBJEXT))
 
+hogweed_OBJS = $(hogweed_SOURCES:.c=.$(OBJEXT)) $(LIBOBJS)
+hogweed_PURE_OBJS = $(hogweed_OBJS:.$(OBJEXT)=.p$(OBJEXT))
+
+# FIXME: Do we really need to delete the archive first?
 libnettle.a: $(nettle_OBJS)
 	-rm -f $@
 	$(AR) $(ARFLAGS) $@ $(nettle_OBJS)
 	$(RANLIB) $@
 
+# FIXME: Do we really need to delete the archive first?
+libhogweed.a: $(hogweed_OBJS)
+	-rm -f $@
+	$(AR) $(ARFLAGS) $@ $(hogweed_OBJS)
+	$(RANLIB) $@
+
 .c.$(OBJEXT):
 	$(COMPILE) $(CCPIC_MAYBE) -c $< \
 	&& $(DEP_PROCESS)
 
-# Rules building libnettle.so
-$(SHLIBFORLINK): $(nettle_PURE_OBJS)
-	$(SHLIBLINK) $(nettle_PURE_OBJS) -o $@ $(SHLIBLIBS)
+# Rules building shared libraries
+$(LIBNETTLE_FORLINK): $(nettle_PURE_OBJS)
+	$(SHLIBLINK) $(nettle_PURE_OBJS) -o $@ $(LIBNETTLE_LIBS)
+	-mkdir .lib 2>/dev/null
+	[ -z "$(LIBNETTLE_SONAME)" ] || (cd .lib \
+          && ln -sf ../$(LIBNETTLE_FORLINK) $(LIBNETTLE_SONAME))
+
+$(LIBHOGWEED_FORLINK): $(hogweed_PURE_OBJS)
+	$(SHLIBLINK) $(hogweed_PURE_OBJS) -o $@ $(LIBHOGWEED_LIBS)
 	-mkdir .lib 2>/dev/null
-	[ -z "$(SHLIBSONAME)" ] || (cd .lib \
-          && ln -sf ../$(SHLIBFORLINK) $(SHLIBSONAME))
+	[ -z "$(LIBHOGWEED_SONAME)" ] || (cd .lib \
+          && ln -sf ../$(LIBHOGWEED_FORLINK) $(LIBHOGWEED_SONAME))
 
 .c.p$(OBJEXT):
 	$(COMPILE) $(SHLIBCFLAGS) -c $< -o $@ \
@@ -229,18 +247,30 @@ config.m4: config.m4.in config.status
 	./config.status $@
 
 # Installation
-# FIXME: Use mkinstalldirs.
-install-here: install-info install-headers libnettle.a $(SHLIBINSTALL)
+install-here: install-info install-headers install-static \
+	@IF_SHARED$ install-shared-nettle @IF_HOGWEED@ install-shared-hogweed
+
+install-static: $(LIBTARGETS)
 	$(MKDIR_P) $(DESTDIR)$(libdir)
-	$(INSTALL_DATA) libnettle.a $(DESTDIR)$(libdir)
+	for f in $(LIBTARGETS); do \
+	  $(INSTALL_DATA) $$f $(DESTDIR)$(libdir) ; \
+	done
+
+install-shared-nettle: $(LIBNETTLE_FORLINK)
+	$(MKDIR_P) $(DESTDIR)$(libdir)
+	$(INSTALL_PROGRAM) $(LIBNETTLE_FORLINK) $(DESTDIR)$(libdir)/$(LIBNETTLE_FILE)
+	[ -z "$(LIBNETTLE_SONAME)" ] \
+                || (cd $(DESTDIR)$(libdir) \
+		&& ln -sf $(LIBNETTLE_FILE) $(LIBNETTLE_SONAME) \
+		&& ln -sf $(LIBNETTLE_FILE) $(LIBNETTLE_FORLINK)
 
-install-shared: $(SHLIBFORLINK)
+install-shared-hogweed: $(LIBHOGWEED_FORLINK)
 	$(MKDIR_P) $(DESTDIR)$(libdir)
-	$(INSTALL_PROGRAM) $(SHLIBFORLINK) $(DESTDIR)$(libdir)/$(SHLIBFILE)
-	[ -z "$(SHLIBSONAME)" ] \
+	$(INSTALL_PROGRAM) $(LIBHOGWEED_FORLINK) $(DESTDIR)$(libdir)/$(LIBHOGWEED_FILE)
+	[ -z "$(LIBHOGWEED_SONAME)" ] \
                 || (cd $(DESTDIR)$(libdir) \
-		&& ln -sf $(SHLIBFILE) $(SHLIBSONAME) \
-		&& ln -sf $(SHLIBFILE) $(SHLIBFORLINK) )
+		&& ln -sf $(LIBHOGWEED_FILE) $(LIBHOGWEED_SONAME) \
+		&& ln -sf $(LIBHOGWEED_FILE) $(LIBHOGWEED_FORLINK)
 
 # I'd like to use makes VPATH search to locate the files to be
 # installed. But it seems most make programs don't set $<, $^, $? and
@@ -268,8 +298,13 @@ install-headers: $(INSTALL_HEADERS)
 	  fi ; done
 
 # Uninstall
-uninstall-here: uninstall-info uninstall-headers uninstall-shared
-	rm -f $(DESTDIR)$(libdir)/libnettle.a
+uninstall-here: uninstall-info uninstall-headers uninstall-static \
+	        @IF_SHARED@ uninstall-shared
+
+uninstall-static:
+	for f in $(STATIC_LIBS) ; do \
+	  rm -f $(DESTDIR)$(libdir)/$$f ; \
+	done
 
 uninstall-headers:
 	for f in $(INSTALL_HEADERS) ; do \
@@ -284,8 +319,17 @@ uninstall-info:
 	-rm -f $(DESTDIR)$(infodir)/nettle.info
 
 # FIXME: Leaves the links around
-uninstall-shared:
-	test -z "$(SHLIBINSTALL)" || rm -f $(DESTDIR)$(libdir)/$(SHLIBFILE)
+uninstall-shared: uninstall-shared-nettle @IF_HOGWEED@ uninstall-shared-hogweed
+
+uninstall-shared-nettle:
+	rm -f $(DESTDIR)$(libdir)/$(LIBNETTLE_FILE)
+	[ -z "$(LIBNETTLE_SONAME)" ] \
+		|| rm -f $(LIBNETTLE_SONAME) $(LIBNETTLE_FORLINK)
+
+uninstall-shared-hogweed:
+	rm -f $(DESTDIR)$(libdir)/$(LIBHOGWEED_FILE)
+	[ -z "$(LIBHOGWEED_SONAME)" ] \
+		|| rm -f $(LIBHOGWEED_SONAME) $(LIBHOGWEED_FORLINK)
 
 # Distribution
 distdir = $(PACKAGE_NAME)-$(PACKAGE_VERSION)