diff --git a/CMakeLists.txt b/CMakeLists.txt
index 64b9f3e62..07ccc7197 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -139,12 +139,16 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
   set(FREEBSD TRUE)
 endif()
 
-# TODO: check bsdi, NetBSD, OpenBSD, to see if they need the same FreeBSD changes
+# Check if we're on OpenBSD. Compile with gcc 4.9 from packages.
+# Use "env CC=egcc CXX=eg++ CPP=ecpp make release-static-64" or similar.
+if(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
+  set(OPENBSD TRUE)
+endif()
+
+# TODO: check bsdi, NetBSD, to see if they need the same FreeBSD changes
 #
 # elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
 #   set(NETBSD TRUE)
-# elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
-#   set(OPENBSD TRUE)
 # elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
 #   set(BSDI TRUE)
 
@@ -385,11 +389,18 @@ else()
     endif()
   endif()
 
+  if(OPENBSD)
+    # This works around some bugs in the gcc 4.9 package as well as forces Boost to use the multithreaded libs
+    set(CMAKE_AR "ar")
+    set(CMAKE_RANLIB "ranlib")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
+  endif()
+
   set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
   set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
-  if(STATIC AND NOT APPLE AND NOT FREEBSD)
+  if(STATIC AND NOT APPLE AND NOT FREEBSD AND NOT OPENBSD)
     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
   endif()
 endif()
@@ -421,7 +432,7 @@ endif()
 include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
 if(MINGW)
   set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi)
-elseif(APPLE OR FREEBSD)
+elseif(APPLE OR FREEBSD OR OPENBSD)
   set(EXTRA_LIBRARIES "")
 elseif(NOT MSVC)
   find_library(RT rt)
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h
index 685f0cc7b..5c63556ae 100644
--- a/contrib/epee/include/console_handler.h
+++ b/contrib/epee/include/console_handler.h
@@ -33,6 +33,9 @@
 #include <mutex>
 #include <thread>
 #include <iostream>
+#ifdef __OpenBSD__
+#include <stdio.h>
+#endif
 
 namespace epee
 {
@@ -129,7 +132,11 @@ namespace epee
     bool wait_stdin_data()
     {
 #if !defined(WIN32)
+      #ifdef __OpenBSD__
+      int stdin_fileno = fileno(stdin);
+      #else
       int stdin_fileno = ::fileno(stdin);
+      #endif
 
       while (m_run.load(std::memory_order_relaxed))
       {
diff --git a/src/blockchain_db/berkeleydb/db_bdb.cpp b/src/blockchain_db/berkeleydb/db_bdb.cpp
index 1ccb6be12..02fdaba2f 100644
--- a/src/blockchain_db/berkeleydb/db_bdb.cpp
+++ b/src/blockchain_db/berkeleydb/db_bdb.cpp
@@ -783,9 +783,11 @@ void BlockchainBDB::open(const std::string& filename, const int db_flags)
         m_env->set_lk_max_locks(DB_MAX_LOCKS);
         m_env->set_lk_max_lockers(DB_MAX_LOCKS);
         m_env->set_lk_max_objects(DB_MAX_LOCKS);
-        
+
+        #ifndef __OpenBSD__ //OpenBSD's DB package is too old to support this feature
         if(m_auto_remove_logs)
           m_env->log_set_config(DB_LOG_AUTO_REMOVE, 1);
+        #endif
 
         // last parameter left 0, files will be created with default rw access
         m_env->open(filename.c_str(), db_env_open_flags, 0);
diff --git a/src/common/int-util.h b/src/common/int-util.h
index 45ee5ef70..e9eddee9c 100644
--- a/src/common/int-util.h
+++ b/src/common/int-util.h
@@ -137,6 +137,7 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin
 static inline uint32_t ident32(uint32_t x) { return x; }
 static inline uint64_t ident64(uint64_t x) { return x; }
 
+#ifndef __OpenBSD__
 static inline uint32_t swap32(uint32_t x) {
   x = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8);
   return (x << 16) | (x >> 16);
@@ -146,6 +147,7 @@ static inline uint64_t swap64(uint64_t x) {
   x = ((x & 0x0000ffff0000ffff) << 16) | ((x & 0xffff0000ffff0000) >> 16);
   return (x << 32) | (x >> 32);
 }
+#endif
 
 #if defined(__GNUC__)
 #define UNUSED __attribute__((unused))
diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp
index 1e39a8b04..fa7b1b580 100644
--- a/src/crypto/crypto.cpp
+++ b/src/crypto/crypto.cpp
@@ -41,7 +41,7 @@
 #include "crypto.h"
 #include "hash.h"
 
-#ifndef __FreeBSD__
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__)
  #include <alloca.h>
 #else
  #include <stdlib.h>
diff --git a/src/crypto/oaes_lib.c b/src/crypto/oaes_lib.c
index c86b8caa0..7fbe96e4c 100644
--- a/src/crypto/oaes_lib.c
+++ b/src/crypto/oaes_lib.c
@@ -37,13 +37,13 @@ static const char _NR[] = {
 #include <stdlib.h>
 #include <stdio.h>
 
-// Both OS X and FreeBSD don't need malloc.h
-#if !defined(__APPLE__) && !defined(__FreeBSD__)
+// OS X, FreeBSD, and OpenBSD don't need malloc.h
+#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
  #include <malloc.h>
 #endif
 
-// FreeBSD also doesn't need timeb.h
-#ifndef __FreeBSD__
+// FreeBSD, and OpenBSD also don't need timeb.h
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__)
  #include <sys/timeb.h>
 #else
  #include <sys/time.h>
@@ -470,7 +470,7 @@ OAES_RET oaes_sprintf(
 #ifdef OAES_HAVE_ISAAC
 static void oaes_get_seed( char buf[RANDSIZ + 1] )
 {
-	#ifndef __FreeBSD__
+        #if !defined(__FreeBSD__) && !defined(__OpenBSD__)
 	struct timeb timer;
 	struct tm *gmTimer;
 	char * _test = NULL;
@@ -502,7 +502,7 @@ static void oaes_get_seed( char buf[RANDSIZ + 1] )
 #else
 static uint32_t oaes_get_seed(void)
 {
-	#ifndef __FreeBSD__
+        #if !defined(__FreeBSD__) && !defined(__OpenBSD__)
 	struct timeb timer;
 	struct tm *gmTimer;
 	char * _test = NULL;
diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c
index 544083fb0..903a3792f 100644
--- a/src/crypto/slow-hash.c
+++ b/src/crypto/slow-hash.c
@@ -421,7 +421,7 @@ void slow_hash_allocate_state(void)
     hp_state = (uint8_t *) VirtualAlloc(hp_state, MEMORY, MEM_LARGE_PAGES |
                                         MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 #else
-#if defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     hp_state = mmap(0, MEMORY, PROT_READ | PROT_WRITE,
                     MAP_PRIVATE | MAP_ANON, 0, 0);
 #else
diff --git a/src/crypto/tree-hash.c b/src/crypto/tree-hash.c
index e90b23841..7a128e4b0 100644
--- a/src/crypto/tree-hash.c
+++ b/src/crypto/tree-hash.c
@@ -34,7 +34,7 @@
 
 #include "hash-ops.h"
 
-#ifndef __FreeBSD__
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__)
  #include <alloca.h>
 #else
  #include <stdlib.h>
diff --git a/tests/performance_tests/performance_utils.h b/tests/performance_tests/performance_utils.h
index fc9f8612d..ba2b71740 100644
--- a/tests/performance_tests/performance_utils.h
+++ b/tests/performance_tests/performance_utils.h
@@ -40,7 +40,7 @@
 
 void set_process_affinity(int core)
 {
-#if defined (__APPLE__) || defined(__FreeBSD__)
+#if defined (__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     return;
 #elif defined(BOOST_WINDOWS)
   DWORD_PTR mask = 1;
@@ -62,7 +62,7 @@ void set_process_affinity(int core)
 
 void set_thread_high_priority()
 {
-#if defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
     return;
 #elif defined(BOOST_WINDOWS)
   ::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS);
diff --git a/tests/unit_tests/slow_memmem.cpp b/tests/unit_tests/slow_memmem.cpp
index 8da58eaf4..a14e01885 100644
--- a/tests/unit_tests/slow_memmem.cpp
+++ b/tests/unit_tests/slow_memmem.cpp
@@ -35,8 +35,8 @@
 #include <stdint.h>
 #include "gtest/gtest.h"
 
-// Both OS X and FreeBSD don't need malloc.h
-#if !defined(__APPLE__) && !defined(__FreeBSD__)
+// OS X, FreeBSD, and OpenBSD don't need malloc.h
+#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
  #include <malloc.h>
 #endif