#endif
 
 #include "commands/user.h"
+#include "common/md5.h"
 #include "fmgr.h"
-#include "libpq/md5.h"
 
 PG_MODULE_MAGIC;
 
 
 #include "commands/dbcommands.h"
 #include "commands/seclabel.h"
 #include "commands/user.h"
-#include "libpq/md5.h"
+#include "common/md5.h"
 #include "miscadmin.h"
 #include "storage/lmgr.h"
 #include "utils/acl.h"
 
 
 # be-fsstubs is here for historical reasons, probably belongs elsewhere
 
-OBJS = be-fsstubs.o be-secure.o auth.o crypt.o hba.o ip.o md5.o pqcomm.o \
+OBJS = be-fsstubs.o be-secure.o auth.o crypt.o hba.o ifaddr.o pqcomm.o \
        pqformat.o pqmq.o pqsignal.o
 
 ifeq ($(with_openssl),yes)
 
 #include <arpa/inet.h>
 #include <unistd.h>
 
+#include "common/ip.h"
+#include "common/md5.h"
 #include "libpq/auth.h"
 #include "libpq/crypt.h"
-#include "libpq/ip.h"
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
-#include "libpq/md5.h"
 #include "miscadmin.h"
 #include "replication/walsender.h"
 #include "storage/ipc.h"
 
 #endif
 
 #include "catalog/pg_authid.h"
+#include "common/md5.h"
 #include "libpq/crypt.h"
-#include "libpq/md5.h"
 #include "miscadmin.h"
 #include "utils/builtins.h"
 #include "utils/syscache.h"
 
 #include <unistd.h>
 
 #include "catalog/pg_collation.h"
-#include "libpq/ip.h"
+#include "common/ip.h"
+#include "libpq/ifaddr.h"
 #include "libpq/libpq.h"
 #include "postmaster/postmaster.h"
 #include "regex/regex.h"
 
 /*-------------------------------------------------------------------------
  *
- * ip.c
- *       IPv6-aware network access.
+ * ifaddr.c
+ *       IP netmask calculations, and enumerating network interfaces.
  *
  * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *       src/backend/libpq/ip.c
+ *       src/backend/libpq/ifaddr.c
  *
  * This file and the IPV6 implementation were initially provided by
  * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
  *-------------------------------------------------------------------------
  */
 
-/* This is intended to be used in both frontend and backend, so use c.h */
-#include "c.h"
+#include "postgres.h"
 
 #include <unistd.h>
 #include <sys/types.h>
 #include <arpa/inet.h>
 #include <sys/file.h>
 
-#include "libpq/ip.h"
-
+#include "libpq/ifaddr.h"
 
 static int range_sockaddr_AF_INET(const struct sockaddr_in * addr,
                                           const struct sockaddr_in * netaddr,
                                                const struct sockaddr_in6 * netmask);
 #endif
 
-#ifdef HAVE_UNIX_SOCKETS
-static int getaddrinfo_unix(const char *path,
-                                const struct addrinfo * hintsp,
-                                struct addrinfo ** result);
-
-static int getnameinfo_unix(const struct sockaddr_un * sa, int salen,
-                                char *node, int nodelen,
-                                char *service, int servicelen,
-                                int flags);
-#endif
-
-
-/*
- *     pg_getaddrinfo_all - get address info for Unix, IPv4 and IPv6 sockets
- */
-int
-pg_getaddrinfo_all(const char *hostname, const char *servname,
-                                  const struct addrinfo * hintp, struct addrinfo ** result)
-{
-       int                     rc;
-
-       /* not all versions of getaddrinfo() zero *result on failure */
-       *result = NULL;
-
-#ifdef HAVE_UNIX_SOCKETS
-       if (hintp->ai_family == AF_UNIX)
-               return getaddrinfo_unix(servname, hintp, result);
-#endif
-
-       /* NULL has special meaning to getaddrinfo(). */
-       rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
-                                        servname, hintp, result);
-
-       return rc;
-}
-
-
-/*
- *     pg_freeaddrinfo_all - free addrinfo structures for IPv4, IPv6, or Unix
- *
- * Note: the ai_family field of the original hint structure must be passed
- * so that we can tell whether the addrinfo struct was built by the system's
- * getaddrinfo() routine or our own getaddrinfo_unix() routine.  Some versions
- * of getaddrinfo() might be willing to return AF_UNIX addresses, so it's
- * not safe to look at ai_family in the addrinfo itself.
- */
-void
-pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo * ai)
-{
-#ifdef HAVE_UNIX_SOCKETS
-       if (hint_ai_family == AF_UNIX)
-       {
-               /* struct was built by getaddrinfo_unix (see pg_getaddrinfo_all) */
-               while (ai != NULL)
-               {
-                       struct addrinfo *p = ai;
-
-                       ai = ai->ai_next;
-                       free(p->ai_addr);
-                       free(p);
-               }
-       }
-       else
-#endif   /* HAVE_UNIX_SOCKETS */
-       {
-               /* struct was built by getaddrinfo() */
-               if (ai != NULL)
-                       freeaddrinfo(ai);
-       }
-}
-
-
-/*
- *     pg_getnameinfo_all - get name info for Unix, IPv4 and IPv6 sockets
- *
- * The API of this routine differs from the standard getnameinfo() definition
- * in two ways: first, the addr parameter is declared as sockaddr_storage
- * rather than struct sockaddr, and second, the node and service fields are
- * guaranteed to be filled with something even on failure return.
- */
-int
-pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen,
-                                  char *node, int nodelen,
-                                  char *service, int servicelen,
-                                  int flags)
-{
-       int                     rc;
-
-#ifdef HAVE_UNIX_SOCKETS
-       if (addr && addr->ss_family == AF_UNIX)
-               rc = getnameinfo_unix((const struct sockaddr_un *) addr, salen,
-                                                         node, nodelen,
-                                                         service, servicelen,
-                                                         flags);
-       else
-#endif
-               rc = getnameinfo((const struct sockaddr *) addr, salen,
-                                                node, nodelen,
-                                                service, servicelen,
-                                                flags);
-
-       if (rc != 0)
-       {
-               if (node)
-                       strlcpy(node, "???", nodelen);
-               if (service)
-                       strlcpy(service, "???", servicelen);
-       }
-
-       return rc;
-}
-
-
-#if defined(HAVE_UNIX_SOCKETS)
-
-/* -------
- *     getaddrinfo_unix - get unix socket info using IPv6-compatible API
- *
- *     Bugs: only one addrinfo is set even though hintsp is NULL or
- *               ai_socktype is 0
- *               AI_CANONNAME is not supported.
- * -------
- */
-static int
-getaddrinfo_unix(const char *path, const struct addrinfo * hintsp,
-                                struct addrinfo ** result)
-{
-       struct addrinfo hints;
-       struct addrinfo *aip;
-       struct sockaddr_un *unp;
-
-       *result = NULL;
-
-       MemSet(&hints, 0, sizeof(hints));
-
-       if (strlen(path) >= sizeof(unp->sun_path))
-               return EAI_FAIL;
-
-       if (hintsp == NULL)
-       {
-               hints.ai_family = AF_UNIX;
-               hints.ai_socktype = SOCK_STREAM;
-       }
-       else
-               memcpy(&hints, hintsp, sizeof(hints));
-
-       if (hints.ai_socktype == 0)
-               hints.ai_socktype = SOCK_STREAM;
-
-       if (hints.ai_family != AF_UNIX)
-       {
-               /* shouldn't have been called */
-               return EAI_FAIL;
-       }
-
-       aip = calloc(1, sizeof(struct addrinfo));
-       if (aip == NULL)
-               return EAI_MEMORY;
-
-       unp = calloc(1, sizeof(struct sockaddr_un));
-       if (unp == NULL)
-       {
-               free(aip);
-               return EAI_MEMORY;
-       }
-
-       aip->ai_family = AF_UNIX;
-       aip->ai_socktype = hints.ai_socktype;
-       aip->ai_protocol = hints.ai_protocol;
-       aip->ai_next = NULL;
-       aip->ai_canonname = NULL;
-       *result = aip;
-
-       unp->sun_family = AF_UNIX;
-       aip->ai_addr = (struct sockaddr *) unp;
-       aip->ai_addrlen = sizeof(struct sockaddr_un);
-
-       strcpy(unp->sun_path, path);
-
-#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
-       unp->sun_len = sizeof(struct sockaddr_un);
-#endif
-
-       return 0;
-}
-
-/*
- * Convert an address to a hostname.
- */
-static int
-getnameinfo_unix(const struct sockaddr_un * sa, int salen,
-                                char *node, int nodelen,
-                                char *service, int servicelen,
-                                int flags)
-{
-       int                     ret = -1;
-
-       /* Invalid arguments. */
-       if (sa == NULL || sa->sun_family != AF_UNIX ||
-               (node == NULL && service == NULL))
-               return EAI_FAIL;
-
-       if (node)
-       {
-               ret = snprintf(node, nodelen, "%s", "[local]");
-               if (ret == -1 || ret > nodelen)
-                       return EAI_MEMORY;
-       }
-
-       if (service)
-       {
-               ret = snprintf(service, servicelen, "%s", sa->sun_path);
-               if (ret == -1 || ret > servicelen)
-                       return EAI_MEMORY;
-       }
-
-       return 0;
-}
-#endif   /* HAVE_UNIX_SOCKETS */
-
 
 /*
  * pg_range_sockaddr - is addr within the subnet specified by netaddr/netmask ?
 
 #include <mstcpip.h>
 #endif
 
-#include "libpq/ip.h"
+#include "common/ip.h"
 #include "libpq/libpq.h"
 #include "miscadmin.h"
 #include "storage/ipc.h"
 
 #include "access/xact.h"
 #include "catalog/pg_database.h"
 #include "catalog/pg_proc.h"
-#include "libpq/ip.h"
+#include "common/ip.h"
 #include "libpq/libpq.h"
 #include "libpq/pqsignal.h"
 #include "mb/pg_wchar.h"
 
 #include "access/xlog.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/pg_control.h"
+#include "common/ip.h"
 #include "lib/ilist.h"
 #include "libpq/auth.h"
-#include "libpq/ip.h"
 #include "libpq/libpq.h"
 #include "libpq/pqsignal.h"
 #include "miscadmin.h"
 
 
 #include "access/hash.h"
 #include "catalog/pg_type.h"
-#include "libpq/ip.h"
+#include "common/ip.h"
 #include "libpq/libpq-be.h"
 #include "libpq/pqformat.h"
 #include "miscadmin.h"
 
 
 #include "access/htup_details.h"
 #include "catalog/pg_type.h"
+#include "common/ip.h"
 #include "funcapi.h"
-#include "libpq/ip.h"
 #include "miscadmin.h"
 #include "pgstat.h"
 #include "storage/proc.h"
 
 #include "access/tuptoaster.h"
 #include "catalog/pg_collation.h"
 #include "catalog/pg_type.h"
+#include "common/md5.h"
 #include "lib/hyperloglog.h"
-#include "libpq/md5.h"
 #include "libpq/pqformat.h"
 #include "miscadmin.h"
 #include "parser/scansup.h"
 
 # This makefile generates two outputs:
 #
 #      libpgcommon.a - contains object files with FRONTEND defined,
-#              for use by client application and libraries
+#              for use by client applications
 #
 #      libpgcommon_srv.a - contains object files without FRONTEND defined,
 #              for use only by the backend binaries
 #
+# You can also symlink/copy individual source files from this directory,
+# to compile with different options. (libpq does that, because it needs
+# to use -fPIC on some platforms.)
+#
 # IDENTIFICATION
 #    src/common/Makefile
 #
 override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\""
 override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\""
 
-OBJS_COMMON = config_info.o controldata_utils.o exec.o keywords.o \
-       pg_lzcompress.o pgfnames.o psprintf.o relpath.o rmtree.o \
+OBJS_COMMON = config_info.o controldata_utils.o exec.o ip.o keywords.o \
+       md5.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o rmtree.o \
        string.o username.o wait_error.o
 
 OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o restricted_token.o
 
--- /dev/null
+/*-------------------------------------------------------------------------
+ *
+ * ip.c
+ *       IPv6-aware network access.
+ *
+ * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ *       src/common/ip.c
+ *
+ * This file and the IPV6 implementation were initially provided by
+ * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
+ * http://www.lbsd.net.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef FRONTEND
+#include "postgres.h"
+#else
+#include "postgres_fe.h"
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#ifdef HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
+#include <arpa/inet.h>
+#include <sys/file.h>
+
+#include "common/ip.h"
+
+
+
+#ifdef HAVE_UNIX_SOCKETS
+static int getaddrinfo_unix(const char *path,
+                                const struct addrinfo * hintsp,
+                                struct addrinfo ** result);
+
+static int getnameinfo_unix(const struct sockaddr_un * sa, int salen,
+                                char *node, int nodelen,
+                                char *service, int servicelen,
+                                int flags);
+#endif
+
+
+/*
+ *     pg_getaddrinfo_all - get address info for Unix, IPv4 and IPv6 sockets
+ */
+int
+pg_getaddrinfo_all(const char *hostname, const char *servname,
+                                  const struct addrinfo * hintp, struct addrinfo ** result)
+{
+       int                     rc;
+
+       /* not all versions of getaddrinfo() zero *result on failure */
+       *result = NULL;
+
+#ifdef HAVE_UNIX_SOCKETS
+       if (hintp->ai_family == AF_UNIX)
+               return getaddrinfo_unix(servname, hintp, result);
+#endif
+
+       /* NULL has special meaning to getaddrinfo(). */
+       rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
+                                        servname, hintp, result);
+
+       return rc;
+}
+
+
+/*
+ *     pg_freeaddrinfo_all - free addrinfo structures for IPv4, IPv6, or Unix
+ *
+ * Note: the ai_family field of the original hint structure must be passed
+ * so that we can tell whether the addrinfo struct was built by the system's
+ * getaddrinfo() routine or our own getaddrinfo_unix() routine.  Some versions
+ * of getaddrinfo() might be willing to return AF_UNIX addresses, so it's
+ * not safe to look at ai_family in the addrinfo itself.
+ */
+void
+pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo * ai)
+{
+#ifdef HAVE_UNIX_SOCKETS
+       if (hint_ai_family == AF_UNIX)
+       {
+               /* struct was built by getaddrinfo_unix (see pg_getaddrinfo_all) */
+               while (ai != NULL)
+               {
+                       struct addrinfo *p = ai;
+
+                       ai = ai->ai_next;
+                       free(p->ai_addr);
+                       free(p);
+               }
+       }
+       else
+#endif   /* HAVE_UNIX_SOCKETS */
+       {
+               /* struct was built by getaddrinfo() */
+               if (ai != NULL)
+                       freeaddrinfo(ai);
+       }
+}
+
+
+/*
+ *     pg_getnameinfo_all - get name info for Unix, IPv4 and IPv6 sockets
+ *
+ * The API of this routine differs from the standard getnameinfo() definition
+ * in two ways: first, the addr parameter is declared as sockaddr_storage
+ * rather than struct sockaddr, and second, the node and service fields are
+ * guaranteed to be filled with something even on failure return.
+ */
+int
+pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen,
+                                  char *node, int nodelen,
+                                  char *service, int servicelen,
+                                  int flags)
+{
+       int                     rc;
+
+#ifdef HAVE_UNIX_SOCKETS
+       if (addr && addr->ss_family == AF_UNIX)
+               rc = getnameinfo_unix((const struct sockaddr_un *) addr, salen,
+                                                         node, nodelen,
+                                                         service, servicelen,
+                                                         flags);
+       else
+#endif
+               rc = getnameinfo((const struct sockaddr *) addr, salen,
+                                                node, nodelen,
+                                                service, servicelen,
+                                                flags);
+
+       if (rc != 0)
+       {
+               if (node)
+                       strlcpy(node, "???", nodelen);
+               if (service)
+                       strlcpy(service, "???", servicelen);
+       }
+
+       return rc;
+}
+
+
+#if defined(HAVE_UNIX_SOCKETS)
+
+/* -------
+ *     getaddrinfo_unix - get unix socket info using IPv6-compatible API
+ *
+ *     Bugs: only one addrinfo is set even though hintsp is NULL or
+ *               ai_socktype is 0
+ *               AI_CANONNAME is not supported.
+ * -------
+ */
+static int
+getaddrinfo_unix(const char *path, const struct addrinfo * hintsp,
+                                struct addrinfo ** result)
+{
+       struct addrinfo hints;
+       struct addrinfo *aip;
+       struct sockaddr_un *unp;
+
+       *result = NULL;
+
+       MemSet(&hints, 0, sizeof(hints));
+
+       if (strlen(path) >= sizeof(unp->sun_path))
+               return EAI_FAIL;
+
+       if (hintsp == NULL)
+       {
+               hints.ai_family = AF_UNIX;
+               hints.ai_socktype = SOCK_STREAM;
+       }
+       else
+               memcpy(&hints, hintsp, sizeof(hints));
+
+       if (hints.ai_socktype == 0)
+               hints.ai_socktype = SOCK_STREAM;
+
+       if (hints.ai_family != AF_UNIX)
+       {
+               /* shouldn't have been called */
+               return EAI_FAIL;
+       }
+
+       aip = calloc(1, sizeof(struct addrinfo));
+       if (aip == NULL)
+               return EAI_MEMORY;
+
+       unp = calloc(1, sizeof(struct sockaddr_un));
+       if (unp == NULL)
+       {
+               free(aip);
+               return EAI_MEMORY;
+       }
+
+       aip->ai_family = AF_UNIX;
+       aip->ai_socktype = hints.ai_socktype;
+       aip->ai_protocol = hints.ai_protocol;
+       aip->ai_next = NULL;
+       aip->ai_canonname = NULL;
+       *result = aip;
+
+       unp->sun_family = AF_UNIX;
+       aip->ai_addr = (struct sockaddr *) unp;
+       aip->ai_addrlen = sizeof(struct sockaddr_un);
+
+       strcpy(unp->sun_path, path);
+
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN
+       unp->sun_len = sizeof(struct sockaddr_un);
+#endif
+
+       return 0;
+}
+
+/*
+ * Convert an address to a hostname.
+ */
+static int
+getnameinfo_unix(const struct sockaddr_un * sa, int salen,
+                                char *node, int nodelen,
+                                char *service, int servicelen,
+                                int flags)
+{
+       int                     ret = -1;
+
+       /* Invalid arguments. */
+       if (sa == NULL || sa->sun_family != AF_UNIX ||
+               (node == NULL && service == NULL))
+               return EAI_FAIL;
+
+       if (node)
+       {
+               ret = snprintf(node, nodelen, "%s", "[local]");
+               if (ret == -1 || ret > nodelen)
+                       return EAI_MEMORY;
+       }
+
+       if (service)
+       {
+               ret = snprintf(service, servicelen, "%s", sa->sun_path);
+               if (ret == -1 || ret > servicelen)
+                       return EAI_MEMORY;
+       }
+
+       return 0;
+}
+#endif   /* HAVE_UNIX_SOCKETS */
 
  *     Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       src/backend/libpq/md5.c
+ *       src/common/md5.c
  */
 
-/* This is intended to be used in both frontend and backend, so use c.h */
-#include "c.h"
+#ifndef FRONTEND
+#include "postgres.h"
+#else
+#include "postgres_fe.h"
+#endif
 
-#include "libpq/md5.h"
+#include "common/md5.h"
 
 
 /*
 
  * ip.h
  *       Definitions for IPv6-aware network access.
  *
- * These definitions are used by both frontend and backend code.  Be careful
- * what you include here!
+ * These definitions are used by both frontend and backend code.
  *
  * Copyright (c) 2003-2016, PostgreSQL Global Development Group
  *
- * src/include/libpq/ip.h
+ * src/include/common/ip.h
  *
  *-------------------------------------------------------------------------
  */
 #define IS_AF_UNIX(fam) (0)
 #endif
 
-typedef void (*PgIfAddrCallback) (struct sockaddr * addr,
-                                                                                         struct sockaddr * netmask,
-                                                                                         void *cb_data);
-
 extern int pg_getaddrinfo_all(const char *hostname, const char *servname,
                                   const struct addrinfo * hintp,
                                   struct addrinfo ** result);
                                   char *service, int servicelen,
                                   int flags);
 
-extern int pg_range_sockaddr(const struct sockaddr_storage * addr,
-                                 const struct sockaddr_storage * netaddr,
-                                 const struct sockaddr_storage * netmask);
-
-extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask,
-                                         char *numbits, int family);
-
-extern int     pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data);
-
 #endif   /* IP_H */
 
  * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * src/include/libpq/md5.h
+ * src/include/common/md5.h
  *
  *-------------------------------------------------------------------------
  */
 
--- /dev/null
+/*-------------------------------------------------------------------------
+ *
+ * ifaddr.h
+ *       IP netmask calculations, and enumerating network interfaces.
+ *
+ * Copyright (c) 2003-2016, PostgreSQL Global Development Group
+ *
+ * src/include/libpq/ifaddr.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef IFADDR_H
+#define IFADDR_H
+
+#include "libpq/pqcomm.h"              /* pgrminclude ignore */
+
+typedef void (*PgIfAddrCallback) (struct sockaddr * addr,
+                                                                                         struct sockaddr * netmask,
+                                                                                         void *cb_data);
+
+extern int pg_range_sockaddr(const struct sockaddr_storage * addr,
+                                 const struct sockaddr_storage * netaddr,
+                                 const struct sockaddr_storage * netmask);
+
+extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask,
+                                         char *numbits, int family);
+
+extern int     pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data);
+
+#endif   /* IFADDR_H */
 
        thread.o
 # libpgport C files that are needed if identified by configure
 OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strerror.o strlcpy.o win32error.o win32setlocale.o, $(LIBOBJS))
-# backend/libpq
-OBJS += ip.o md5.o
-# utils/mb
+# src/backend/utils/mb
 OBJS += encnames.o wchar.o
+# src/common
+OBJS += ip.o md5.o
 
 ifeq ($(with_openssl),yes)
 OBJS += fe-secure-openssl.o
 chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c system.c pgsleep.c pgstrcasecmp.c pqsignal.c snprintf.c strerror.c strlcpy.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/%
        rm -f $@ && $(LN_S) $< .
 
-ip.c md5.c: % : $(backend_src)/libpq/%
+ip.c md5.c: % : $(top_srcdir)/src/common/%
        rm -f $@ && $(LN_S) $< .
 
 encnames.c wchar.c: % : $(backend_src)/utils/mb/%
 
 #include <pwd.h>
 #endif
 
+#include "common/md5.h"
 #include "libpq-fe.h"
 #include "fe-auth.h"
-#include "libpq/md5.h"
 
 
 #ifdef ENABLE_GSS
 
                                  PQExpBuffer errorMessage);
 #endif
 
-#include "libpq/ip.h"
+#include "common/ip.h"
 #include "mb/pg_wchar.h"
 
 #ifndef FD_CLOEXEC
 
 
 all: test_ifaddrs
 
-test_ifaddrs: test_ifaddrs.o $(libpq_backend_dir)/ip.o
-       $(CC) $(CFLAGS) test_ifaddrs.o $(libpq_backend_dir)/ip.o $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+test_ifaddrs: test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o
+       $(CC) $(CFLAGS) test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 clean distclean maintainer-clean:
        rm -f test_ifaddrs$(X) $(OBJS)
 
 #include <netinet/in.h>
 #include <sys/socket.h>
 
-#include "libpq/ip.h"
+#include "libpq/ifaddr.h"
 
 
 static void
 
        }
 
        our @pgcommonallfiles = qw(
-         config_info.c controldata_utils.c exec.c keywords.c
-         pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
+         config_info.c controldata_utils.c exec.c ip.c keywords.c
+         md5.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
          string.c username.c wait_error.c);
 
        our @pgcommonfrontendfiles = (