diff --git a/apps/sam/c/Makefile.freebsd b/apps/sam/c/Makefile.freebsd
new file mode 100644
index 0000000000000000000000000000000000000000..336c6897dc0d02a439be5bbd4d91f8a56783d742
--- /dev/null
+++ b/apps/sam/c/Makefile.freebsd
@@ -0,0 +1,63 @@
+#
+# This Makefile is compatible with GNU Make (gmake) and should work on FreeBSD
+#
+
+#
+# Your operating system
+#
+
+OS = FREEBSD
+
+#
+# Directories
+#
+
+INCDIR = inc
+LIBDIR = lib
+OBJDIR = obj
+SRCDIR = src
+
+#
+# Programs
+#
+
+AR = ar
+CC = gcc
+
+#
+# Flags
+#
+
+CFLAGS = -g -O2 -pipe -std=c99 -Wall
+CFLAGS += -DOS=$(OS)
+CFLAGS += -I$(INCDIR)
+
+#
+# Object files
+#
+
+OBJS =	$(OBJDIR)/sam.o
+
+#
+# Build rules
+#
+
+all: depend libsam
+
+depend:
+	$(CC) $(CFLAGS) -MM $(SRCDIR)/*.c > .depend
+
+$(OBJDIR)/%.o: $(SRCDIR)/%.c
+	$(CC) $(CFLAGS) -o $@ -c $<
+
+libsam: $(OBJS)
+	$(AR) rcs $(LIBDIR)/libsam.a $(OBJS)
+
+#
+# Cleanup rules
+#
+
+clean:
+	-rm -f $(LIBDIR)/libsam.a $(OBJDIR)/* .depend
+
+tidy: clean
diff --git a/apps/sam/c/doc/whatsnew.txt b/apps/sam/c/doc/whatsnew.txt
index b4a9d1aa5a5edc1761e03d968dfff4dee1d8fdce..1c18ce35acaca28176db6c1b3f974ca3aa7f13d5 100644
--- a/apps/sam/c/doc/whatsnew.txt
+++ b/apps/sam/c/doc/whatsnew.txt
@@ -1,4 +1,5 @@
-v1.20
+v1.20	2004-07-11
+	* Ported to FreeBSD (Makefile.freebsd)
 	* Full winsock compatibility - all Windows functions now return appropriate
 		error strings
 
diff --git a/apps/sam/c/inc/platform.h b/apps/sam/c/inc/platform.h
index 5ba6c63d3c55f9c18c187176bd856a21ea637461..dafb4e1c43d4d84601bbe7a54d17536b9cc1f511 100644
--- a/apps/sam/c/inc/platform.h
+++ b/apps/sam/c/inc/platform.h
@@ -34,7 +34,7 @@
 /*
  * Operating system
  */
-#define FREEBSD	0  // FreeBSD (untested)
+#define FREEBSD	0  // FreeBSD
 #define MINGW	1  // Windows native (Mingw)
 #define LINUX	2  // Linux
 #define CYGWIN	3  // Cygwin
@@ -83,9 +83,10 @@
 	#include <winsock.h>
 #else
 	#include <arpa/inet.h>
+	#include <netinet/in.h>
 	#include <sys/select.h>
-	#include <sys/types.h>
 	#include <sys/socket.h>
+	#include <sys/types.h>
 #endif
 #include <assert.h>
 #include <errno.h>
diff --git a/apps/sam/c/src/sam.c b/apps/sam/c/src/sam.c
index dd35f47cc2a365108cc971742fc5efebebfd93c7..0cef2b605f27c504e10a4e586e320a340135b1fd 100644
--- a/apps/sam/c/src/sam.c
+++ b/apps/sam/c/src/sam.c
@@ -189,7 +189,7 @@ samerr_t sam_dgram_send(const sam_pubkey_t dest, const void *data, size_t size)
 #ifdef NO_Z_FORMAT
 		SAMLOG("Invalid data send size (%u bytes)", size);
 #else
-		SAMLOG("Invalid data send size (%z bytes)", size);
+		SAMLOG("Invalid data send size (%dz bytes)", size);
 #endif
 		return SAM_TOO_BIG;
 	}
@@ -197,7 +197,7 @@ samerr_t sam_dgram_send(const sam_pubkey_t dest, const void *data, size_t size)
 	snprintf(cmd, sizeof cmd, "DATAGRAM SEND DESTINATION=%s SIZE=%u\n",
 		dest, size);
 #else
-	snprintf(cmd, sizeof cmd, "DATAGRAM SEND DESTINATION=%s SIZE=%z\n",
+	snprintf(cmd, sizeof cmd, "DATAGRAM SEND DESTINATION=%s SIZE=%dz\n",
 		dest, size);
 #endif
 	sam_write(cmd, strlen(cmd));
@@ -957,7 +957,7 @@ samerr_t sam_stream_send(sam_sid_t stream_id, const void *data, size_t size)
 		SAMLOG("Invalid data send size (%u bytes) for stream %d",
 			size, stream_id);
 #else
-		SAMLOG("Invalid data send size (%z bytes) for stream %d",
+		SAMLOG("Invalid data send size (%dz bytes) for stream %d",
 			size, stream_id);
 #endif
 		return SAM_TOO_BIG;
@@ -971,7 +971,7 @@ samerr_t sam_stream_send(sam_sid_t stream_id, const void *data, size_t size)
 			stream_id, size);
 	#endif
 #else
-	snprintf(cmd, sizeof cmd, "STREAM SEND ID=%d SIZE=%z\n",
+	snprintf(cmd, sizeof cmd, "STREAM SEND ID=%d SIZE=%dz\n",
 		stream_id, size);
 #endif
 	sam_write(cmd, strlen(cmd));