diff --git a/README b/README
index 9301fe456e72f9d2affc9516f3ff1c8f8b5521ff..32e698d34e63780045a6889c3e4055ec98d02d03 100644
--- a/README
+++ b/README
@@ -3,8 +3,8 @@ This is the buildsystem for the OpenWrt Linux distribution.
 Please use "make menuconfig" to configure your appreciated
 configuration for the toolchain and firmware.
 
-You need to have installed gcc, binutils, patch, bzip2, flex,
-make, gettext, pkg-config, unzip, libz-dev and libc headers.
+You need to have installed gcc, binutils, bzip2, flex, python, perl
+make, find, grep, diff, unzip, gawk, getopt, libz-dev and libc headers.
 
 Run "./scripts/feeds update -a" to get all the latest package definitions
 defined in feeds.conf / feeds.conf.default respectively
diff --git a/include/host-build.mk b/include/host-build.mk
index 320e74ee47d0b1fbd140867794df2c07301e9fd4..126671a0b3d3ce8718c19b022efaf64602ce647a 100644
--- a/include/host-build.mk
+++ b/include/host-build.mk
@@ -71,7 +71,7 @@ HOST_CONFIGURE_ARGS = \
 
 HOST_MAKE_FLAGS =
 
-HOST_CONFIGURE_CMD = ./configure
+HOST_CONFIGURE_CMD = $(BASH) ./configure
 
 ifneq ($(HOST_OS),Darwin)
   ifeq ($(CONFIG_BUILD_STATIC_TOOLS),y)
diff --git a/include/host.mk b/include/host.mk
index 9b8a32b672d3579c5cbe1deed2f7625dec912e0a..b44c1bf1ac6f3a9a1af9f865e48613a0d87d5ec4 100644
--- a/include/host.mk
+++ b/include/host.mk
@@ -62,6 +62,9 @@ $(TMP_DIR)/.host.mk: $(TOPDIR)/include/host.mk
 		PATCH=`which gpatch 2>/dev/null`; \
 		[ -n "$$PATCH" -a -x "$$PATCH" ] || PATCH=`which patch 2>/dev/null`; \
 		echo "PATCH:=$$PATCH" >> $@; \
+		PYTHON=`which python2.7 2>/dev/null`; \
+		[ -n "$$PYTHON" -a -x "$$PYTHON" ] || PYTHON=`which python 2>/dev/null`; \
+		echo "PYTHON:=$$PYTHON" >> $@; \
 	)
 
 endif
diff --git a/include/prereq-build.mk b/include/prereq-build.mk
index c7d59f12029152fa2887e2374949c378ef918de7..59ea7ef9a78f976eba2b9169aab98fbc6b1571cd 100644
--- a/include/prereq-build.mk
+++ b/include/prereq-build.mk
@@ -39,6 +39,8 @@ $(eval $(call Require,case-sensitive-fs, \
 ))
 
 define Require/getopt
+	gnugetopt --help 2>&1 | grep long >/dev/null || \
+	/usr/local/bin/getopt --help 2>&1 | grep long >/dev/null || \
 	getopt --help 2>&1 | grep long >/dev/null
 endef
 $(eval $(call Require,getopt, \
@@ -134,15 +136,11 @@ $(eval $(call RequireCommand,bzip2, \
 	Please install bzip2. \
 ))
 
-$(eval $(call RequireCommand,patch, \
-	Please install patch. \
-))
-
 $(eval $(call RequireCommand,perl, \
 	Please install perl. \
 ))
 
-$(eval $(call RequireCommand,python, \
+$(eval $(call RequireCommand,$(PYTHON), \
 	Please install python. \
 ))
 
diff --git a/package/mac80211/patches/004-use_env_for_bash.patch b/package/mac80211/patches/004-use_env_for_bash.patch
new file mode 100644
index 0000000000000000000000000000000000000000..889191d37ede3ca1c399261edf808578d361369f
--- /dev/null
+++ b/package/mac80211/patches/004-use_env_for_bash.patch
@@ -0,0 +1,9 @@
+diff -Nur compat-wireless-2013-02-22.orig/compat/scripts/gen-compat-config.sh compat-wireless-2013-02-22/compat/scripts/gen-compat-config.sh
+--- compat-wireless-2013-02-22.orig/compat/scripts/gen-compat-config.sh	2012-12-20 15:14:36.000000000 +0100
++++ compat-wireless-2013-02-22/compat/scripts/gen-compat-config.sh	2013-03-07 17:27:04.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/usr/bin/env bash
+ # Copyright 2012        Luis R. Rodriguez <mcgrof@frijolero.org>
+ # Copyright 2012        Hauke Mehrtens <hauke@hauke-m.de>
+ #
diff --git a/scripts/freebsd.sh b/scripts/freebsd.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3107861ff890da688600019b8916334dca4ab547
--- /dev/null
+++ b/scripts/freebsd.sh
@@ -0,0 +1 @@
+env PACKAGESITE=ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9.0-release/All/ pkg_add -r gmake-3.82.tbz bash-4.1.11.tbz python27-2.7.2_3.tbz gtar-1.26.tbz findutils-4.5.10_2.tbz coreutils-8.12.tbz getopt-1.1.4_2.tbz wget-1.13.4_1.tbz gnugrep-2.9.tbz gawk-4.0.0.tbz
diff --git a/scripts/openbsd.sh b/scripts/openbsd.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dc9f4f778063560b1b9b8a7ffedae0123c63b836
--- /dev/null
+++ b/scripts/openbsd.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+ver=$(uname -r)
+arch=$(uname -m)
+echo "Preparing OpenBSD $arch $ver for OpenWrt"
+PKG_PATH="http://ftp.openbsd.org/pub/OpenBSD/${ver}/packages/${arch}/"
+export PKG_PATH
+pkg_add -v gmake
+pkg_add -v findutils
+pkg_add -v coreutils
+pkg_add -v gdiff
+pkg_add -v rsync--
+pkg_add -v git
+pkg_add -v bash
+pkg_add -v unzip
+pkg_add -v wget
+pkg_add -v gtar--
+pkg_add -v ggrep
+pkg_add -v gawk
+pkg_add -v gsed
+pkg_add -v xz
+pkg_add -v apr-util--
+pkg_add -v cyrus-sasl--
+pkg_add -v subversion
+pkg_add -v gnugetopt
diff --git a/tools/Makefile b/tools/Makefile
index d922c5364cece37adb396c928f6453b3dd794846..1d65e50ba9fcf6986a4ed289f466191ac4551b8a 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -15,7 +15,7 @@ tools-y += gmp mpfr mpc libelf
 endif
 tools-y += m4 libtool autoconf automake flex bison pkg-config sed mklibs
 tools-y += sstrip ipkg-utils genext2fs e2fsprogs mtd-utils mkimage
-tools-y += firmware-utils patch-image quilt yaffs2 flock padjffs2
+tools-y += firmware-utils patch-image patch quilt yaffs2 flock padjffs2
 tools-y += mm-macros xorg-macros xfce-macros missing-macros xz cmake scons
 tools-$(CONFIG_TARGET_orion_generic) += wrt350nv2-builder upslug2
 tools-$(CONFIG_powerpc) += upx
@@ -119,6 +119,8 @@ $(STAGING_DIR_HOST)/bin/stat: $(STAGING_DIR)/.prepared
 		ln -s `which stat` $@; \
 	elif gstat --version > /dev/null 2>&1; then \
 		ln -s `which gstat` $@; \
+	elif gnustat --version > /dev/null 2>&1; then \
+		ln -s `which gnustat` $@; \
 	else \
 		echo "GNU stat not found"; \
 		false; \
@@ -128,10 +130,14 @@ $(eval $(call PrepareCommand,find,gfind find))
 $(eval $(call PrepareCommand,md5sum,gmd5sum md5sum $(SCRIPT_DIR)/md5sum))
 $(eval $(call PrepareCommand,cp,gcp cp))
 $(eval $(call PrepareCommand,seq,gseq seq))
-$(eval $(call PrepareCommand,python,python2 python))
+$(eval $(call PrepareCommand,python,python2 python2.7 python))
 $(eval $(call PrepareCommand,awk,gawk awk))
+$(eval $(call PrepareCommand,getopt,gnugetopt /usr/local/bin/getopt getopt))
+$(eval $(call PrepareCommand,grep,ggrep grep))
+$(eval $(call PrepareCommand,tar,gtar tar))
+$(eval $(call PrepareCommand,diff,gdiff diff))
 
-$(curdir)/cmddeps = $(patsubst %,$(STAGING_DIR_HOST)/bin/%,find md5sum cp stat seq python awk)
+$(curdir)/cmddeps = $(patsubst %,$(STAGING_DIR_HOST)/bin/%,find md5sum cp stat seq python awk getopt grep tar diff)
 $(curdir)//prepare = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared $($(curdir)/cmddeps)
 $(curdir)//compile = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared $($(curdir)/cmddeps)
 
diff --git a/tools/e2fsprogs/patches/003-openbsd-compat.patch b/tools/e2fsprogs/patches/003-openbsd-compat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1f7cdca0e56992d908f2bf863cf4b6bb687c4315
--- /dev/null
+++ b/tools/e2fsprogs/patches/003-openbsd-compat.patch
@@ -0,0 +1,24 @@
+diff -Nur e2fsprogs-1.42.7.orig/lib/blkid/getsize.c e2fsprogs-1.42.7/lib/blkid/getsize.c
+--- e2fsprogs-1.42.7.orig/lib/blkid/getsize.c	Fri Nov 30 03:40:18 2012
++++ e2fsprogs-1.42.7/lib/blkid/getsize.c	Thu Mar  7 14:21:59 2013
+@@ -26,6 +26,9 @@
+ #include <fcntl.h>
+ #ifdef HAVE_SYS_IOCTL_H
+ #include <sys/ioctl.h>
++#ifdef __OpenBSD__
++#include <sys/dkio.h>
++#endif
+ #endif
+ #ifdef HAVE_LINUX_FD_H
+ #include <linux/fd.h>
+diff -Nur e2fsprogs-1.42.7.orig/lib/quota/mkquota.c e2fsprogs-1.42.7/lib/quota/mkquota.c
+--- e2fsprogs-1.42.7.orig/lib/quota/mkquota.c	Wed Jan  2 01:47:20 2013
++++ e2fsprogs-1.42.7/lib/quota/mkquota.c	Thu Mar  7 14:21:59 2013
+@@ -8,6 +8,7 @@
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <errno.h>
++#include <stdint.h>
+ #include <string.h>
+ #include <fcntl.h>
+ 
diff --git a/tools/e2fsprogs/patches/004-freebsd-compat.patch b/tools/e2fsprogs/patches/004-freebsd-compat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5eff49999e2e68f50e5fa05583a2a7158f0d0de9
--- /dev/null
+++ b/tools/e2fsprogs/patches/004-freebsd-compat.patch
@@ -0,0 +1,13 @@
+diff -Nur e2fsprogs-1.42.7.orig/lib/ext2fs/tdb.c e2fsprogs-1.42.7/lib/ext2fs/tdb.c
+--- e2fsprogs-1.42.7.orig/lib/ext2fs/tdb.c	2012-07-06 15:37:27.000000000 +0200
++++ e2fsprogs-1.42.7/lib/ext2fs/tdb.c	2013-03-07 14:54:59.000000000 +0100
+@@ -56,7 +56,9 @@
+ #include <utime.h>
+ #endif
+ #include <sys/stat.h>
++#ifndef __FreeBSD__
+ #include <sys/file.h>
++#endif
+ #include <fcntl.h>
+ 
+ #ifdef HAVE_SYS_MMAN_H
diff --git a/tools/include/endian.h b/tools/include/endian.h
index 0f17b41da73f50aa21c2a51ac5695862c982db2f..bba70abd833fb07bd46238defd47cf7e7788a0aa 100644
--- a/tools/include/endian.h
+++ b/tools/include/endian.h
@@ -15,6 +15,11 @@
 #define bswap_16(x) bswap16(x)
 #define bswap_32(x) bswap32(x)
 #define bswap_64(x) bswap64(x)
+#elif defined(__OpenBSD__)
+#include <sys/types.h>
+#define bswap_16(x) __swap16(x)
+#define bswap_32(x) __swap32(x)
+#define bswap_64(x) __swap64(x)
 #else
 #include <machine/endian.h>
 #define bswap_16(x) swap16(x)
diff --git a/tools/include/getline.h b/tools/include/getline.h
index 02df6c2f7900734aa9798c3eeef0cc6e9607ae88..3ac21715b885426f66df83a85d60b04632db9d5f 100644
--- a/tools/include/getline.h
+++ b/tools/include/getline.h
@@ -32,7 +32,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#if !defined(__linux__) && !(defined(__APPLE__) && __DARWIN_C_LEVEL >= 200809L)
+#if !defined(__linux__) && !defined(__OpenBSD__) && !(defined(__APPLE__) && __DARWIN_C_LEVEL >= 200809L)
 /*
  * Emulate glibc getline() via BSD fgetln().
  * Note that outsize is not changed unless memory is allocated.
diff --git a/tools/mkimage/patches/020-openbsd_fixes.patch b/tools/mkimage/patches/020-openbsd_fixes.patch
new file mode 100644
index 0000000000000000000000000000000000000000..31ee38f66e02364c1fb292a033135bcf1b1ce0a7
--- /dev/null
+++ b/tools/mkimage/patches/020-openbsd_fixes.patch
@@ -0,0 +1,19 @@
+diff -Nur u-boot-2012.04.01.orig/tools/mkimage.c u-boot-2012.04.01/tools/mkimage.c
+--- u-boot-2012.04.01.orig/tools/mkimage.c	Wed Apr 25 15:22:50 2012
++++ u-boot-2012.04.01/tools/mkimage.c	Wed Mar  6 17:09:29 2013
+@@ -449,6 +449,7 @@
+ #if defined(_POSIX_SYNCHRONIZED_IO) && \
+    !defined(__sun__) && \
+    !defined(__FreeBSD__) && \
++   !defined(__OpenBSD__) && \
+    !defined(__APPLE__)
+ 	(void) fdatasync (ifd);
+ #else
+@@ -492,6 +493,7 @@
+ #if defined(_POSIX_SYNCHRONIZED_IO) && \
+    !defined(__sun__) && \
+    !defined(__FreeBSD__) && \
++   !defined(__OpenBSD__) && \
+    !defined(__APPLE__)
+ 	(void) fdatasync (ifd);
+ #else
diff --git a/tools/patch/Makefile b/tools/patch/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..def829909575eb1467dbdb5ff5da8a48b03c2aac
--- /dev/null
+++ b/tools/patch/Makefile
@@ -0,0 +1,18 @@
+# 
+# Copyright (C) 2013 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=patch
+PKG_VERSION:=2.7.1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_SOURCE_URL:=ftp://ftp.gnu.org/gnu/patch
+PKG_MD5SUM:=e9ae5393426d3ad783a300a338c09b72
+
+include $(INCLUDE_DIR)/host-build.mk
+
+$(eval $(call HostBuild))
diff --git a/tools/quilt/Makefile b/tools/quilt/Makefile
index 510d8f6fd5a12b3ff2f58603fe2477f51d600970..541e656affe1795e32f24b9a45a4d33ab0892821 100644
--- a/tools/quilt/Makefile
+++ b/tools/quilt/Makefile
@@ -15,12 +15,8 @@ PKG_MD5SUM:=f77adda60039ffa753f3c584a286f12b
 
 include $(INCLUDE_DIR)/host-build.mk
 
-GETOPT:=$(shell which getopt)
-
 HOST_CONFIGURE_ARGS += \
-	--with-patch=$(PATCH) \
-	--with-find=$(FIND) \
-	--with-getopt=$(GETOPT)
+	--with-find=$(FIND)
 
 define Host/Configure
 	cd $(HOST_BUILD_DIR) && autoconf
diff --git a/tools/squashfs4/patches/180-openbsd_compat.patch b/tools/squashfs4/patches/180-openbsd_compat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6d7a857a05ab140753c6dc6fd52cadfb9a3f9ef8
--- /dev/null
+++ b/tools/squashfs4/patches/180-openbsd_compat.patch
@@ -0,0 +1,26 @@
+diff -Nur squashfs4.2.orig/squashfs-tools/mksquashfs.c squashfs4.2/squashfs-tools/mksquashfs.c
+--- squashfs4.2.orig/squashfs-tools/mksquashfs.c	Tue Mar  5 16:20:49 2013
++++ squashfs4.2/squashfs-tools/mksquashfs.c	Tue Mar  5 16:25:10 2013
+@@ -32,6 +32,9 @@
+ #include <stdio.h>
+ #include <stddef.h>
+ #include <sys/time.h>
++#if defined(__OpenBSD__)
++#include <sys/param.h>
++#endif
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+diff -Nur squashfs4.2.orig/squashfs-tools/unsquashfs.h squashfs4.2/squashfs-tools/unsquashfs.h
+--- squashfs4.2.orig/squashfs-tools/unsquashfs.h	Tue Mar  5 16:20:49 2013
++++ squashfs4.2/squashfs-tools/unsquashfs.h	Tue Mar  5 16:25:57 2013
+@@ -25,6 +25,9 @@
+ #define TRUE 1
+ #define FALSE 0
+ #include <stdio.h>
++#if defined(__OpenBSD__)
++#include <sys/param.h>
++#endif
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <stdlib.h>
diff --git a/tools/yaffs2/patches/110-openbsd-compat.patch b/tools/yaffs2/patches/110-openbsd-compat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cfafc1ca7e02f67de03fa976c51b4dce665cf347
--- /dev/null
+++ b/tools/yaffs2/patches/110-openbsd-compat.patch
@@ -0,0 +1,14 @@
+diff -Nur yaffs2_android.orig/yaffs2/yaffs_guts.h yaffs2_android/yaffs2/yaffs_guts.h
+--- yaffs2_android.orig/yaffs2/yaffs_guts.h	Sun Feb 15 16:23:50 2009
++++ yaffs2_android/yaffs2/yaffs_guts.h	Tue Mar  5 15:45:21 2013
+@@ -823,6 +823,10 @@
+ int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr);
+ int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr);
+ 
++#if defined(__OpenBSD__)
++#define loff_t off_t
++#endif
++
+ /* File operations */
+ int yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset,
+ 			   int nBytes);