diff -ur teeworlds-0.6.3-src-orig/bam.lua teeworlds-0.6.3-src/bam.lua
--- teeworlds-0.6.3-src-orig/bam.lua	2014-11-20 00:08:23.059768832 +0200
+++ teeworlds-0.6.3-src/bam.lua	2014-12-17 00:47:27.678428672 +0200
@@ -184,6 +184,12 @@
 		settings.link.libs:Add("ws2_32")
 		settings.link.libs:Add("ole32")
 		settings.link.libs:Add("shell32")
+	elseif family == "beos" and platform == "haiku" then
+		settings.link.libs:Add("be")
+		settings.link.libs:Add("root")
+		settings.link.libs:Add("network")
+		settings.link.libs:Add("GL");
+		settings.link.libs:Add("GLU");
 	end
 
 	-- compile zlib if needed
diff -ur teeworlds-0.6.3-src-orig/src/base/detect.h teeworlds-0.6.3-src/src/base/detect.h
--- teeworlds-0.6.3-src-orig/src/base/detect.h	2014-11-20 00:08:22.046137344 +0200
+++ teeworlds-0.6.3-src/src/base/detect.h	2014-12-16 21:31:00.576192512 +0200
@@ -68,7 +68,7 @@
 #endif
 
 /* beos family */
-#if defined(__BeOS) || defined(__BEOS__)
+#if defined(__BeOS) || defined(__BEOS__) || defined(__HAIKU__)
 	#define CONF_FAMILY_BEOS 1
 	#define CONF_FAMILY_STRING "beos"
 	#define CONF_PLATFORM_BEOS 1
diff -ur teeworlds-0.6.3-src-orig/src/base/system.c teeworlds-0.6.3-src/src/base/system.c
--- teeworlds-0.6.3-src-orig/src/base/system.c	2014-11-20 00:08:22.047448064 +0200
+++ teeworlds-0.6.3-src/src/base/system.c	2014-12-17 18:20:36.652738560 +0200
@@ -9,7 +9,7 @@
 
 #include "system.h"
 
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	#include <sys/time.h>
 	#include <unistd.h>
 
@@ -372,7 +372,7 @@
 
 void *thread_create(void (*threadfunc)(void *), void *u)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_t id;
 	pthread_create(&id, NULL, (void *(*)(void*))threadfunc, u);
 	return (void*)id;
@@ -385,7 +385,7 @@
 
 void thread_wait(void *thread)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_join((pthread_t)thread, NULL);
 #elif defined(CONF_FAMILY_WINDOWS)
 	WaitForSingleObject((HANDLE)thread, INFINITE);
@@ -396,7 +396,7 @@
 
 void thread_destroy(void *thread)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	void *r = 0;
 	pthread_join((pthread_t)thread, &r);
 #else
@@ -406,7 +406,7 @@
 
 void thread_yield()
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	sched_yield();
 #elif defined(CONF_FAMILY_WINDOWS)
 	Sleep(0);
@@ -417,7 +417,7 @@
 
 void thread_sleep(int milliseconds)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	usleep(milliseconds*1000);
 #elif defined(CONF_FAMILY_WINDOWS)
 	Sleep(milliseconds);
@@ -428,7 +428,7 @@
 
 void thread_detach(void *thread)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_detach((pthread_t)(thread));
 #elif defined(CONF_FAMILY_WINDOWS)
 	CloseHandle(thread);
@@ -440,7 +440,7 @@
 
 
 
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 typedef pthread_mutex_t LOCKINTERNAL;
 #elif defined(CONF_FAMILY_WINDOWS)
 typedef CRITICAL_SECTION LOCKINTERNAL;
@@ -452,7 +452,7 @@
 {
 	LOCKINTERNAL *lock = (LOCKINTERNAL*)mem_alloc(sizeof(LOCKINTERNAL), 4);
 
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_mutex_init(lock, 0x0);
 #elif defined(CONF_FAMILY_WINDOWS)
 	InitializeCriticalSection((LPCRITICAL_SECTION)lock);
@@ -464,7 +464,7 @@
 
 void lock_destroy(LOCK lock)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_mutex_destroy((LOCKINTERNAL *)lock);
 #elif defined(CONF_FAMILY_WINDOWS)
 	DeleteCriticalSection((LPCRITICAL_SECTION)lock);
@@ -476,7 +476,7 @@
 
 int lock_try(LOCK lock)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	return pthread_mutex_trylock((LOCKINTERNAL *)lock);
 #elif defined(CONF_FAMILY_WINDOWS)
 	return !TryEnterCriticalSection((LPCRITICAL_SECTION)lock);
@@ -487,7 +487,7 @@
 
 void lock_wait(LOCK lock)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_mutex_lock((LOCKINTERNAL *)lock);
 #elif defined(CONF_FAMILY_WINDOWS)
 	EnterCriticalSection((LPCRITICAL_SECTION)lock);
@@ -498,7 +498,7 @@
 
 void lock_release(LOCK lock)
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	pthread_mutex_unlock((LOCKINTERNAL *)lock);
 #elif defined(CONF_FAMILY_WINDOWS)
 	LeaveCriticalSection((LPCRITICAL_SECTION)lock);
@@ -508,7 +508,7 @@
 }
 
 #if !defined(CONF_PLATFORM_MACOSX)
-	#if defined(CONF_FAMILY_UNIX)
+	#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	void semaphore_init(SEMAPHORE *sem) { sem_init(sem, 0, 0); }
 	void semaphore_wait(SEMAPHORE *sem) { sem_wait(sem); }
 	void semaphore_signal(SEMAPHORE *sem) { sem_post(sem); }
@@ -527,7 +527,7 @@
 /* -----  time ----- */
 int64 time_get()
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	struct timeval val;
 	gettimeofday(&val, NULL);
 	return (int64)val.tv_sec*(int64)1000000+(int64)val.tv_usec;
@@ -546,7 +546,7 @@
 
 int64 time_freq()
 {
-#if defined(CONF_FAMILY_UNIX)
+#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	return 1000000;
 #elif defined(CONF_FAMILY_WINDOWS)
 	int64 t;
@@ -1354,6 +1354,16 @@
 		return -1;
 	_snprintf(path, max, "%s/%s", home, appname);
 	return 0;
+#elif defined(CONF_FAMILY_BEOS)
+	#include <FindDirectory.h>
+
+	dev_t device = (dev_t)-1;
+	char *datadir;
+
+	status_t status = find_directory(B_USER_DATA_DIRECTORY, device, false, datadir, max);
+	if (status < B_OK) return -1;
+	snprintf(path, max, "%s/%s", datadir, appname);
+	return 0;
 #else
 	char *home = getenv("HOME");
 #if !defined(CONF_PLATFORM_MACOSX)
@@ -1795,7 +1805,7 @@
 			&theItem);
 
 	RunStandardAlert(theItem, NULL, &itemIndex);
-#elif defined(CONF_FAMILY_UNIX)
+#elif defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 	static char cmd[1024];
 	int err;
 	/* use xmessage which is available on nearly every X11 system */
diff -ur teeworlds-0.6.3-src-orig/src/base/system.h teeworlds-0.6.3-src/src/base/system.h
--- teeworlds-0.6.3-src-orig/src/base/system.h	2014-11-20 00:08:22.046137344 +0200
+++ teeworlds-0.6.3-src/src/base/system.h	2014-12-16 21:31:00.580124672 +0200
@@ -411,7 +411,7 @@
 /* Group: Semaphores */
 
 #if !defined(CONF_PLATFORM_MACOSX)
-	#if defined(CONF_FAMILY_UNIX)
+	#if defined(CONF_FAMILY_UNIX) || defined(CONF_FAMILY_BEOS)
 		#include <semaphore.h>
 		typedef sem_t SEMAPHORE;
 	#elif defined(CONF_FAMILY_WINDOWS)
diff -ur teeworlds-0.6.3-src-orig/src/engine/client/backend_sdl.cpp teeworlds-0.6.3-src/src/engine/client/backend_sdl.cpp
--- teeworlds-0.6.3-src-orig/src/engine/client/backend_sdl.cpp	2014-11-20 00:08:22.004980736 +0200
+++ teeworlds-0.6.3-src/src/engine/client/backend_sdl.cpp	2014-12-16 23:45:27.095944704 +0200
@@ -1,6 +1,6 @@
 
-#include "SDL.h"
-#include "SDL_opengl.h"
+#include <SDL/SDL.h>
+#include <SDL/SDL_opengl.h>
 
 #include <base/tl/threading.h>
 
diff -ur teeworlds-0.6.3-src-orig/src/engine/client/backend_sdl.h teeworlds-0.6.3-src/src/engine/client/backend_sdl.h
--- teeworlds-0.6.3-src-orig/src/engine/client/backend_sdl.h	2014-11-20 00:08:22.005767168 +0200
+++ teeworlds-0.6.3-src/src/engine/client/backend_sdl.h	2014-12-17 18:21:15.679215104 +0200
@@ -1,12 +1,12 @@
 
-#include "SDL.h"
-#include "SDL_opengl.h"
+#include <SDL/SDL.h>
+#include <SDL/SDL_opengl.h>
 
 #include "graphics_threaded.h"
 
 
 
-// platform dependent implementations for transfering render context from the main thread to the graphics thread
+// platform dependent implementations for transfering render Context from the main thread to the graphics thread
 // TODO: when SDL 1.3 comes, this can be removed
 #if defined(CONF_FAMILY_WINDOWS)
 	struct SGLContext
@@ -49,7 +49,7 @@
 	{
 		SGLContext Context;
 		Class NSOpenGLContextClass = (Class) objc_getClass("NSOpenGLContext");
-		SEL selector = sel_registerName("currentContext");
+		SEL selector = sel_reg0isterName("currentContext");
 		Context.m_Context = objc_msgSend((objc_object*) NSOpenGLContextClass, selector);
 		return Context;
 	}
@@ -117,6 +117,29 @@
 	static void GL_MakeCurrent(const SGLContext &Context) { glXMakeCurrent(Context.m_pDisplay, Context.m_Drawable, Context.m_Context); }
 	static void GL_ReleaseContext(const SGLContext &Context) { glXMakeCurrent(Context.m_pDisplay, None, 0x0); }
 	static void GL_SwapBuffers(const SGLContext &Context) { glXSwapBuffers(Context.m_pDisplay, Context.m_Drawable); }
+#elif defined(CONF_FAMILY_BEOS)
+
+	#include <Application.h>
+	#include <opengl/GLView.h>
+
+	struct SGLContext
+	{
+		BGLView* view;
+	};
+
+	static SGLContext GL_GetCurrentContext()
+	{
+		SGLContext Context;
+
+		BApplication *be_app = new BApplication("application/x-vnd.tw-teeworlds");
+
+		Context.view = ((BGLView*) be_app->WindowAt(0)->ChildAt(0));
+		return Context;
+	}
+
+	static void GL_MakeCurrent(const SGLContext &Context) { Context.view->LockGL(); }
+	static void GL_ReleaseContext(const SGLContext &Context) { Context.view->UnlockGL(); }
+	static void GL_SwapBuffers(const SGLContext &Context) { Context.view->SwapBuffers(); }
 #else
 	#error missing implementation
 #endif
