diff -Naur relayd.orig/carp.c relayd/carp.c
--- relayd.orig/carp.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/carp.c	2010-06-10 08:50:24.487544459 +0200
@@ -19,6 +19,7 @@
 #include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
+#include <sys/queue.h>
 
 #include <net/if.h>
 
diff -Naur relayd.orig/check_tcp.c relayd/check_tcp.c
--- relayd.orig/check_tcp.c	2010-06-10 08:50:20.371085750 +0200
+++ relayd/check_tcp.c	2010-06-10 08:50:24.488548211 +0200
@@ -31,7 +31,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <fnmatch.h>
-#include <sha1.h>
+#include <sha.h>
 
 #include <openssl/ssl.h>
 
@@ -285,7 +285,11 @@
 	if (b == NULL)
 		fatal("out of memory");
 	*b = '\0';
+#ifndef __FreeBSD__
 	if (fnmatch(cte->table->conf.exbuf, cte->buf->buf, 0) == 0) {
+#else
+	if (fnmatch(cte->table->conf.exbuf, (char *)cte->buf->buf, 0) == 0) {
+#endif
 		cte->host->he = HCE_SEND_EXPECT_OK;
 		cte->host->up = HOST_UP;
 		return (0);
@@ -318,7 +322,11 @@
 		fatal("out of memory");
 	*b = '\0';
 
+#ifndef __FreeBSD__
 	head = cte->buf->buf;
+#else
+	head = (char *)cte->buf->buf;
+#endif
 	host = cte->host;
 	host->he = HCE_HTTP_CODE_ERROR;
 
@@ -370,7 +378,11 @@
 		fatal("out of memory");
 	*b = '\0';
 
+#ifndef __FreeBSD__
 	head = cte->buf->buf;
+#else
+	head = (char *)cte->buf->buf;
+#endif
 	host = cte->host;
 	host->he = HCE_HTTP_DIGEST_ERROR;
 
@@ -382,7 +394,11 @@
 	}
 	head += strlen("\r\n\r\n");
 
+#ifndef __FreeBSD__
 	digeststr(cte->table->conf.digest_type, head, strlen(head), digest);
+#else
+	digeststr(cte->table->conf.digest_type, (u_int8_t*)head, strlen(head), digest);
+#endif
 
 	if (strcmp(cte->table->conf.digest, digest)) {
 		log_warnx("check_http_digest: %s failed "
diff -Naur relayd.orig/hce.c relayd/hce.c
--- relayd.orig/hce.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/hce.c	2010-06-10 08:50:24.489552523 +0200
@@ -167,7 +167,7 @@
 	struct timeval	 tv;
 	struct table	*table;
 
-	snmp_init(env, iev_main);
+//	snmp_init(env, iev_main);
 
 	if (!TAILQ_EMPTY(env->sc_tables)) {
 		evtimer_set(&env->sc_ev, hce_launch_checks, env);
@@ -336,8 +336,10 @@
 		    print_availability(host->check_cnt, host->up_cnt));
 	}
 
+/*
 	if (host->last_up != host->up)
 		snmp_hosttrap(table, host);
+*/
 
 	host->last_up = host->up;
 
diff -Naur relayd.orig/log.c relayd/log.c
--- relayd.orig/log.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/log.c	2010-06-10 08:50:24.489552523 +0200
@@ -16,7 +16,11 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
 #include <sys/types.h>
+#endif
 #include <sys/queue.h>
 #include <sys/socket.h>
 #include <sys/tree.h>
diff -Naur relayd.orig/parse.y relayd/parse.y
--- relayd.orig/parse.y	2010-06-10 08:50:20.372089782 +0200
+++ relayd/parse.y	2010-06-10 08:50:24.490556275 +0200
@@ -343,6 +343,7 @@
 			}
 			conf->sc_prefork_relay = $2;
 		}
+/* FreeBSD exclude
 		| DEMOTE STRING		{
 			conf->sc_flags |= F_DEMOTE;
 			if (strlcpy(conf->sc_demote_group, $2,
@@ -360,6 +361,7 @@
 			}
 		}
 		| SEND TRAP		{ conf->sc_flags |= F_TRAP; }
+*/
 		;
 
 loglevel	: UPDATES		{ $$ = RELAYD_OPT_LOGUPDATE; }
@@ -615,6 +617,7 @@
 			bcopy(&$2, &table->conf.timeout,
 			    sizeof(struct timeval));
 		}
+/* FreeBSD exclude
 		| DEMOTE STRING		{
 			table->conf.flags |= F_DEMOTE;
 			if (strlcpy(table->conf.demote_group, $2,
@@ -632,6 +635,7 @@
 				YYERROR;
 			}
 		}
+*/
 		| INTERVAL NUMBER	{
 			if ($2 < conf->sc_interval.tv_sec ||
 			    $2 % conf->sc_interval.tv_sec) {
@@ -1562,7 +1566,7 @@
 		{ "ciphers",		CIPHERS },
 		{ "code",		CODE },
 		{ "cookie",		COOKIE },
-		{ "demote",		DEMOTE },
+// FreeBSD	{ "demote",		DEMOTE },
 		{ "digest",		DIGEST },
 		{ "disable",		DISABLE },
 		{ "error",		ERROR },
@@ -1625,7 +1629,7 @@
 		{ "timeout",		TIMEOUT },
 		{ "to",			TO },
 		{ "transparent",	TRANSPARENT },
-		{ "trap",		TRAP },
+// FreeBSD	{ "trap",		TRAP },
 		{ "ttl",		TTL },
 		{ "updates",		UPDATES },
 		{ "url",		URL },
@@ -2260,7 +2264,8 @@
 	hints.ai_family = PF_UNSPEC;
 	hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
 	error = getaddrinfo(s, NULL, &hints, &res0);
-	if (error == EAI_AGAIN || error == EAI_NODATA || error == EAI_NONAME)
+//	if (error == EAI_AGAIN || error == EAI_NODATA || error == EAI_NONAME)
+	if (error == EAI_AGAIN || error == EAI_NONAME)
 		return (0);
 	if (error) {
 		log_warnx("host_dns: could not parse \"%s\": %s", s,
diff -Naur relayd.orig/pfe.c relayd/pfe.c
--- relayd.orig/pfe.c	2010-06-10 08:50:20.369077965 +0200
+++ relayd/pfe.c	2010-06-10 08:50:24.491560307 +0200
@@ -17,6 +17,9 @@
  */
 
 #include <sys/param.h>
+#ifdef __FreeBSD__
+#include <sys/queue.h>
+#endif
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -859,7 +862,9 @@
 	struct table		*table;
 	struct ctl_id		 id;
 	struct imsg		 imsg;
+#ifndef __FreeBSD__
 	struct ctl_demote	 demote;
+#endif
 
 	bzero(&id, sizeof(id));
 	bzero(&imsg, sizeof(imsg));
@@ -920,6 +925,7 @@
 		 */
 		table->conf.flags &= ~(F_CHANGED);
 
+#ifndef __FreeBSD__
 		/*
 		 * handle demotion.
 		 */
@@ -942,6 +948,7 @@
 		    sizeof(demote.group));
 		imsg_compose_event(iev_main, IMSG_DEMOTE, 0, 0, -1,
 		    &demote, sizeof(demote));
+#endif
 	}
 }
 
diff -Naur relayd.orig/pfe_filter.c relayd/pfe_filter.c
--- relayd.orig/pfe_filter.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/pfe_filter.c	2010-06-10 08:51:10.599999014 +0200
@@ -97,6 +97,10 @@
 		    sizeof(tables[i].pfrt_name))
 			goto toolong;
 		tables[i].pfrt_flags |= PFR_TFLAG_PERSIST;
+#ifdef __FreeBSD__
+		log_debug("init_tables: prepare anchor \"%s\" and table \"%s\"",
+#endif
+		    tables[i].pfrt_anchor, tables[i].pfrt_name);
 		i++;
 	}
 	if (i != env->sc_rdrcount)
@@ -280,12 +284,11 @@
 		}
 			
 		psnk.psnk_af = host->conf.ss.ss_family;
-		psnk.psnk_killed = 0;
 
 		if (ioctl(env->sc_pf->dev,
 		    DIOCKILLSRCNODES, &psnk) == -1)
 			fatal("kill_srcnodes: cannot kill src nodes");
-		cnt += psnk.psnk_killed;
+		cnt += psnk.psnk_af;
 	}
 
 	return (cnt);
@@ -370,7 +373,11 @@
 	struct sockaddr_in6	*sain6;
 	struct address		*address;
 	char			 anchor[PF_ANCHOR_NAME_SIZE];
+#ifndef __FreeBSD__
 	int			 rs;
+#else
+	int			 rs = 0;
+#endif
 	struct table		*t = rdr->table;
 
 	if (!(env->sc_flags & F_NEEDPF))
@@ -418,7 +425,9 @@
 
 			/* Use sloppy state handling for half connections */
 			rio.rule.keep_state = PF_STATE_NORMAL;
+#ifdef PFRULE_STATESLOPPY
 			rio.rule.rule_flag = PFRULE_STATESLOPPY;
+#endif
 			break;
 		default:
 			fatalx("sync_ruleset: invalid forward mode");
@@ -437,7 +446,9 @@
 		rio.rule.dst.port_op = address->port.op;
 		rio.rule.dst.port[0] = address->port.val[0];
 		rio.rule.dst.port[1] = address->port.val[1];
+#if 0
 		rio.rule.rtableid = -1; /* stay in the main routing table */
+#endif
 
 		if (rio.rule.proto == IPPROTO_TCP)
 			rio.rule.timeout[PFTM_TCP_ESTABLISHED] =
diff -Naur relayd.orig/relay.c relayd/relay.c
--- relayd.orig/relay.c	2010-06-10 08:50:20.371085750 +0200
+++ relayd/relay.c	2010-06-10 08:50:24.492564339 +0200
@@ -16,7 +16,11 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
 #include <sys/types.h>
+#endif
 #include <sys/queue.h>
 #include <sys/time.h>
 #include <sys/stat.h>
@@ -683,6 +687,7 @@
 		    &val, sizeof(val)) == -1)
 			goto bad;
 	}
+#ifndef __FreeBSD__
 	if (proto->tcpflags & (TCPFLAG_SACK|TCPFLAG_NSACK)) {
 		if (proto->tcpflags & TCPFLAG_NSACK)
 			val = 0;
@@ -692,6 +697,7 @@
 		    &val, sizeof(val)) == -1)
 			goto bad;
 	}
+#endif
 
 	return (s);
 
@@ -1027,7 +1033,11 @@
 	}
 	if (strstr(val, "$TIMEOUT") != NULL) {
 		snprintf(ibuf, sizeof(ibuf), "%lu",
+#ifdef __FreeBSD__
+		    (unsigned long)rlay->rl_conf.timeout.tv_sec);
+#else
 		    rlay->rl_conf.timeout.tv_sec);
+#endif
 		if (expand_string(buf, len, "$TIMEOUT", ibuf) != 0)
 			return (NULL);
 	}
@@ -1624,7 +1634,11 @@
 	switch (type) {
 	case DIGEST_SHA1:
 	case DIGEST_MD5:
+#ifdef __FreeBSD__
+		if ((md = digeststr(type, (u_int8_t*)val, strlen(val), NULL)) == NULL) {
+#else
 		if ((md = digeststr(type, val, strlen(val), NULL)) == NULL) {
+#endif
 			relay_close_http(con, 500,
 			    "failed to allocate digest", 0);
 			goto fail;
@@ -2642,8 +2656,12 @@
 		goto err;
 
 	/* Set session context to the local relay name */
-	if (!SSL_CTX_set_session_id_context(ctx, rlay->rl_conf.name,
-	    strlen(rlay->rl_conf.name)))
+	if (!SSL_CTX_set_session_id_context(ctx,
+#ifdef __FreeBSD__
+	    (unsigned char*)rlay->rl_conf.name, strlen(rlay->rl_conf.name)))
+#else
+	    rlay->rl_conf.name, strlen(rlay->rl_conf.name)))
+#endif
 		goto err;
 
 	return (ctx);
@@ -3104,7 +3122,11 @@
 	if (fstat(fd, &st) != 0)
 		goto fail;
 	size = st.st_size;
+#ifndef __FreeBSD__
 	if ((buf = (char *)calloc(1, size + 1)) == NULL)
+#else
+	if ((buf = (u_int8_t *)calloc(1, size + 1)) == NULL)
+#endif
 		goto fail;
 	if (read(fd, buf, size) != size)
 		goto fail;
@@ -3112,7 +3134,11 @@
 	close(fd);
 
 	*len = size + 1;
+#ifndef __FreeBSD__
 	return (buf);
+#else
+	return (char *)(buf);
+#endif
 
  fail:
 	if (buf != NULL)
@@ -3142,7 +3168,7 @@
 		return (-1);
 
 	if (snprintf(certfile, sizeof(certfile),
-	    "/etc/ssl/%s.crt", hbuf) == -1)
+	    "%%PREFIX%%/etc/ssl/%s.crt", hbuf) == -1)
 		return (-1);
 	if ((rlay->rl_ssl_cert = relay_load_file(certfile,
 	    &rlay->rl_ssl_cert_len)) == NULL)
@@ -3150,7 +3176,7 @@
 	log_debug("relay_load_certfiles: using certificate %s", certfile);
 
 	if (snprintf(certfile, sizeof(certfile),
-	    "/etc/ssl/private/%s.key", hbuf) == -1)
+	    "%%PREFIX%%/etc/ssl/private/%s.key", hbuf) == -1)
 		return -1;
 	if ((rlay->rl_ssl_key = relay_load_file(certfile,
 	    &rlay->rl_ssl_key_len)) == NULL)
diff -Naur relayd.orig/relay_udp.c relayd/relay_udp.c
--- relayd.orig/relay_udp.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/relay_udp.c	2010-06-10 08:50:24.493571444 +0200
@@ -16,7 +16,11 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#else
 #include <sys/types.h>
+#endif
 #include <sys/queue.h>
 #include <sys/time.h>
 #include <sys/stat.h>
diff -Naur relayd.orig/relayd.8 relayd/relayd.8
--- relayd.orig/relayd.8	2010-06-10 08:50:20.371085750 +0200
+++ relayd/relayd.8	2010-06-10 08:50:24.493571444 +0200
@@ -117,7 +117,7 @@
 .It Fl f Ar file
 Specify an alternative configuration file.
 The default is
-.Pa /etc/relayd.conf .
+.Pa %%PREFIX%%/etc/relayd.conf .
 .It Fl n
 Configtest mode.
 Only check the configuration file for validity.
@@ -126,7 +126,7 @@
 .El
 .Sh FILES
 .Bl -tag -width "/var/run/relayd.sockXX" -compact
-.It /etc/relayd.conf
+.It %%PREFIX%%/etc/relayd.conf
 Default configuration file.
 .It /var/run/relayd.sock
 Unix-domain socket used for communication with
diff -Naur relayd.orig/relayd.c relayd/relayd.c
--- relayd.orig/relayd.c	2010-06-10 08:50:20.370081718 +0200
+++ relayd/relayd.c	2010-06-10 08:50:24.494572682 +0200
@@ -17,7 +17,12 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <openssl/rand.h>
+#else
 #include <sys/types.h>
+#endif
 #include <sys/queue.h>
 #include <sys/socket.h>
 #include <sys/wait.h>
@@ -37,7 +42,11 @@
 #include <unistd.h>
 #include <ctype.h>
 #include <pwd.h>
+#ifdef __FreeBSD__
+#include <sha.h>
+#else
 #include <sha1.h>
+#endif
 #include <md5.h>
 
 #include <openssl/ssl.h>
@@ -126,6 +135,11 @@
 	int			 c;
 	int			 debug;
 	u_int32_t		 opts;
+#ifdef __FreeBSD__
+#if __FreeBSD_version > 800040
+	u_int32_t		rnd[256];
+#endif
+#endif
 	struct relayd		*env;
 	const char		*conffile;
 	struct event		 ev_sigint;
@@ -196,6 +210,16 @@
 
 	log_info("startup");
 
+#ifdef __FreeBSD__
+#if __FreeBSD_version > 800040
+	arc4random_stir();
+	arc4random_buf(rnd, sizeof(rnd));
+	RAND_seed(rnd, sizeof(rnd));
+#else
+	RAND_load_file("/dev/random",2048);
+#endif
+#endif
+
 	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC,
 	    pipe_parent2pfe) == -1)
 		fatal("socketpair");
@@ -292,9 +316,10 @@
 	    iev_hce->handler, iev_hce);
 	event_add(&iev_hce->ev, NULL);
 
+#ifndef __FreeBSD__
 	if (env->sc_flags & F_DEMOTE)
 		carp_demote_reset(env->sc_demote_group, 0);
-
+#endif
 	event_dispatch();
 
 	return (0);
@@ -319,9 +344,11 @@
 	} while (pid != -1 || (pid == -1 && errno == EINTR));
 
 	control_cleanup();
+#ifndef __FreeBSD__
 	carp_demote_shutdown();
 	if (env->sc_flags & F_DEMOTE)
 		carp_demote_reset(env->sc_demote_group, 128);
+#endif
 	log_info("terminating");
 	exit(0);
 }
@@ -383,8 +410,10 @@
 	memcpy(&env->sc_proto_default, &new_env->sc_proto_default,
 	    sizeof(env->sc_proto_default));
 	env->sc_prefork_relay = new_env->sc_prefork_relay;
+#ifndef __FreeBSD__
 	(void)strlcpy(env->sc_demote_group, new_env->sc_demote_group,
 	    sizeof(env->sc_demote_group));
+#endif
 
 	env->sc_tables = new_env->sc_tables;
 	env->sc_rdrs = new_env->sc_rdrs;
@@ -610,7 +639,9 @@
 	struct imsgbuf		*ibuf;
 	struct imsg		 imsg;
 	ssize_t			 n;
+#ifndef __FreeBSD__
 	struct ctl_demote	 demote;
+#endif
 
 	iev = ptr;
 	ibuf = &iev->ibuf;
@@ -638,6 +669,7 @@
 			break;
 
 		switch (imsg.hdr.type) {
+#ifndef __FreeBSD__
 		case IMSG_DEMOTE:
 			if (imsg.hdr.len - IMSG_HEADER_SIZE !=
 			    sizeof(demote))
@@ -646,6 +678,7 @@
 			memcpy(&demote, imsg.data, sizeof(demote));
 			carp_demote_set(demote.group, demote.level);
 			break;
+#endif
 		case IMSG_CTL_RELOAD:
 			/*
 			 * so far we only get here if no L7 (relay) is done.
@@ -709,9 +742,11 @@
 			imsg_compose_event(iev_hce, IMSG_SCRIPT,
 			    0, 0, -1, &scr, sizeof(scr));
 			break;
+/*
 		case IMSG_SNMPSOCK:
 			(void)snmp_sendsock(iev);
 			break;
+*/
 		default:
 			log_debug("main_dispatch_hce: unexpected imsg %d",
 			    imsg.hdr.type);
@@ -1021,7 +1056,11 @@
 {
 	switch (type) {
 	case DIGEST_SHA1:
+#ifdef __FreeBSD__
+		return (SHA1_Data(data, len, buf));
+#else
 		return (SHA1Data(data, len, buf));
+#endif
 		break;
 	case DIGEST_MD5:
 		return (MD5Data(data, len, buf));
@@ -1258,9 +1297,17 @@
 	    bnd->bnd_proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM,
 	    bnd->bnd_proto)) == -1)
 		goto fail;
+#ifdef SO_BINDANY
 	if (setsockopt(s, SOL_SOCKET, SO_BINDANY,
 	    &v, sizeof(v)) == -1)
 		goto fail;
+#else
+#ifdef IP_BINDANY
+	if (setsockopt(s, IPPROTO_IP, IP_BINDANY,
+	    &v, sizeof(v)) == -1)
+		goto fail;
+#endif
+#endif
 	if (bind(s, (struct sockaddr *)&bnd->bnd_ss,
 	    bnd->bnd_ss.ss_len) == -1)
 		goto fail;
diff -Naur relayd.orig/relayd.conf.5 relayd/relayd.conf.5
--- relayd.orig/relayd.conf.5	2010-06-10 08:50:20.371085750 +0200
+++ relayd/relayd.conf.5	2010-06-10 08:50:24.495576434 +0200
@@ -78,7 +78,7 @@
 .Ic include
 keyword, for example:
 .Bd -literal -offset indent
-include "/etc/relayd.conf.local"
+include "%%PREFIX%%/etc/relayd.conf.local"
 .Ed
 .Sh MACROS
 Macros can be defined that will later be expanded in context.
@@ -103,17 +103,6 @@
 .Sh GLOBAL CONFIGURATION
 Here are the settings that can be set globally:
 .Bl -tag -width Ds
-.It Ic demote Ar group
-Enable the global
-.Xr carp 4
-demotion option, resetting the carp demotion counter for the
-specified interface group to zero on startup and to 128 on shutdown of
-the daemon.
-For more information on interface groups,
-see the
-.Ic group
-keyword in
-.Xr ifconfig 8 .
 .It Ic interval Ar number
 Set the interval in seconds at which the hosts will be checked.
 The default interval is 10 seconds.
@@ -143,15 +132,6 @@
 .Xr relayd 8
 runs 5 relay processes by default and every process will handle
 all configured relays.
-.It Ic send trap
-Send an SNMP trap when the state of a host changes.
-.Xr relayd 8
-will try to connect to
-.Xr snmpd 8
-and request it send a trap to the registered trap receivers;
-see
-.Xr snmpd.conf 5
-for more information about the configuration.
 .It Ic timeout Ar number
 Set the global timeout in milliseconds for checks.
 This can be overridden by the timeout value in the table definitions.
@@ -349,17 +329,6 @@
 .Pp
 The following general table options are available:
 .Bl -tag -width Ds
-.It Ic demote Ar group
-Enable the per-table
-.Xr carp 4
-demotion option.
-This will increment the carp demotion counter for the
-specified interface group if all hosts in the table are down.
-For more information on interface groups,
-see the
-.Ic group
-keyword in
-.Xr ifconfig 8 .
 .It Ic interval Ar number
 Override the global interval and specify one for this table.
 It must be a multiple of the global interval.
@@ -604,9 +573,9 @@
 keyword is present, the relay will accept connections using the
 encrypted SSL protocol.
 The relay will look up a private key in
-.Pa /etc/ssl/private/address.key
+.Pa %%PREFIX%%/etc/ssl/private/address.key
 and a public certificate in
-.Pa /etc/ssl/address.crt ,
+.Pa %%PREFIX%%/etc/ssl/address.crt ,
 where
 .Ar address
 is the specified IP address of the relay to listen on.
@@ -955,9 +924,6 @@
 This option enables CA verification in SSL client mode.
 The daemon will load the CA (Certificate Authority) certificates from
 the specified path to verify the server certificates.
-.Ox
-provides a default CA bundle in
-.Pa /etc/ssl/cert.pem .
 .It Ic ciphers Ar string
 Set the string defining the SSL cipher suite.
 If not specified, the default value
@@ -1036,22 +1002,19 @@
 .El
 .El
 .Sh FILES
-.Bl -tag -width "/etc/ssl/private/address.keyXX" -compact
-.It Pa /etc/relayd.conf
+.Bl -tag -width "%%PREFIX%%/etc/ssl/private/address.keyXX" -compact
+.It Pa %%PREFIX%%/etc/relayd.conf
 .Xr relayd 8
 configuration file.
 .Pp
 .It Pa /etc/services
 Service name database.
 .Pp
-.It Pa /etc/ssl/address.crt
-.It Pa /etc/ssl/private/address.key
+.It Pa %%PREFIX%%/etc/ssl/address.crt
+.It Pa %%PREFIX%%/etc/ssl/private/address.key
 Location of the relay SSL server certificates, where
 .Ar address
 is the configured IP address of the relay.
-.It Pa /etc/ssl/cert.pem
-Default location of the CA bundle that can be used with
-.Xr relayd 8 .
 .El
 .Sh EXAMPLES
 This configuration file would create a redirection service
@@ -1146,7 +1109,6 @@
 .Sh SEE ALSO
 .Xr relayctl 8 ,
 .Xr relayd 8 ,
-.Xr snmpd 8 ,
 .Xr ssl 8
 .Sh HISTORY
 The
diff -Naur relayd.orig/relayd.h relayd/relayd.h
--- relayd.orig/relayd.h	2010-06-10 08:50:20.372089782 +0200
+++ relayd/relayd.h	2010-06-10 08:50:24.496580466 +0200
@@ -19,10 +19,18 @@
  */
 
 #include <sys/tree.h>
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <sys/queue.h>
+#endif
 
 #include <imsg.h>
 
+#ifdef __FreeBSD__
+#define CONF_FILE		"%%PREFIX%%/etc/relayd.conf"
+#else
 #define CONF_FILE		"/etc/relayd.conf"
+#endif
 #define RELAYD_SOCKET		"/var/run/relayd.sock"
 #define PF_SOCKET		"/dev/pf"
 #define RELAYD_USER		"_relayd"
@@ -57,7 +65,18 @@
 #define PURGE_PROTOS		0x08
 #define PURGE_EVERYTHING	0xff
 
+#ifndef __FreeBSD__
 #define SNMP_RECONNECT_TIMEOUT	{ 3, 0 }	/* sec, usec */
+#else
+#define	SIMPLEQ_HEAD		STAILQ_HEAD
+#define	SIMPLEQ_FIRST		STAILQ_FIRST
+#define	SIMPLEQ_REMOVE_HEAD	STAILQ_REMOVE_HEAD
+#define	SIMPLEQ_ENTRY		STAILQ_ENTRY
+#define	SIMPLEQ_INIT		STAILQ_INIT
+#define	SIMPLEQ_EMPTY		STAILQ_EMPTY
+#define	SIMPLEQ_NEXT		STAILQ_NEXT
+#define	SIMPLEQ_INSERT_TAIL	STAILQ_INSERT_TAIL
+#endif
 
 #if DEBUG > 1
 #define DPRINTF		log_debug
@@ -607,10 +626,11 @@
 	struct event		 sc_statev;
 	struct timeval		 sc_statinterval;
 
+#ifndef __FreeBSD__
 	int			 sc_snmp;
 	struct event		 sc_snmpto;
 	struct event		 sc_snmpev;
-
+#endif
 	int			 sc_has_icmp;
 	int			 sc_has_icmp6;
 	struct ctl_icmp_event	 sc_icmp_send;
@@ -688,7 +708,9 @@
 	IMSG_HOST_STATUS,	/* notifies from hce to pfe */
 	IMSG_SYNC,
 	IMSG_NATLOOK,
+#ifndef __FreeBSD__
 	IMSG_DEMOTE,
+#endif
 	IMSG_STATISTICS,
 	IMSG_RECONF,		/* reconfiguration notifies */
 	IMSG_RECONF_TABLE,
@@ -704,7 +726,9 @@
 	IMSG_RECONF_RELAY,
 	IMSG_RECONF_END,
 	IMSG_SCRIPT,
+#ifndef __FreeBSD__
 	IMSG_SNMPSOCK,
+#endif
 	IMSG_BINDANY
 };
 
@@ -857,10 +881,16 @@
 void		 pn_unref(u_int16_t);
 void		 pn_ref(u_int16_t);
 
+#ifndef __FreeBSD__
 /* snmp.c */
 void	 snmp_init(struct relayd *, struct imsgev *);
 int	 snmp_sendsock(struct imsgev *);
 void	 snmp_hosttrap(struct table *, struct host *);
+#else
+#if __FreeBSD_version < 800041
+u_int32_t	arc4random_uniform(u_int32_t upper_bound);
+#endif
+#endif
 
 /* shuffle.c */
 void		shuffle_init(struct shuffle *);
