diff --git a/.gitignore b/.gitignore
index 567609b1234a9b8806c5a05da6c866e480aa148d..87d63aa385f0fdc2f568373c8d24edf1b34c037d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
 build/
+*.so
+*.dylib
diff --git a/cython-example/CMakeLists.txt b/cython-example/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7d02d41ab380e80749bfdc734c730ef6fe5db246
--- /dev/null
+++ b/cython-example/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.1)
+
+project(Fibonacci VERSION 0.1
+                  DESCRIPTION "Calculate Fibonacci Numbers using C++"
+                  LANGUAGES CXX)
+
+add_library(fibonacci SHARED src/fibonacci.cpp include/fibonacci.h)
+target_include_directories(fibonacci PUBLIC include)
+
+add_executable(fib_cli apps/fib_cli.cpp)
+target_link_libraries(fib_cli PUBLIC fibonacci)
diff --git a/cython-example/apps/fib_cli.cpp b/cython-example/apps/fib_cli.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..92d46f0a3ecafc09c76e8847d3abe98519287851
--- /dev/null
+++ b/cython-example/apps/fib_cli.cpp
@@ -0,0 +1,12 @@
+#include <iostream>
+#include "fibonacci.h"
+
+
+int main() {
+
+    for (unsigned int i = 0; i < 10; i++) {
+        std::cout << i << ": " << fibonacci(i) << std::endl;
+    }
+     
+    return 0;
+}
diff --git a/cython-example/fib_wrapper.pyx b/cython-example/fib_wrapper.pyx
new file mode 100644
index 0000000000000000000000000000000000000000..08529641994d660f5539417395d2ac0144b14f9b
--- /dev/null
+++ b/cython-example/fib_wrapper.pyx
@@ -0,0 +1,5 @@
+# cython: language_level = 3
+# distutils: language = c++
+
+cdef extern from "fibonacci.h":
+    cpdef unsigned long fibonacci(unsigned int n)
diff --git a/cython-example/include/fibonacci.h b/cython-example/include/fibonacci.h
new file mode 100644
index 0000000000000000000000000000000000000000..57fd44944277a33d08f597f6b2a90b7cee4d2c11
--- /dev/null
+++ b/cython-example/include/fibonacci.h
@@ -0,0 +1,4 @@
+#ifndef FIBONACCI_H
+#define FIBONACCI_H
+unsigned long fibonacci(unsigned int n);
+#endif
diff --git a/cython-example/setup.py b/cython-example/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..f4069e171bb69e55501ca9690424123b6b634e38
--- /dev/null
+++ b/cython-example/setup.py
@@ -0,0 +1,22 @@
+from setuptools import setup, Extension
+from Cython.Build import cythonize
+import os
+
+ext_modules = [
+    Extension(
+        'fib_wrapper',
+        sources=['fib_wrapper.pyx'],
+        libraries=['fibonacci'],
+        runtime_library_dirs=[os.path.abspath('build')],
+        extra_link_args=['-Wl,-rpath', os.path.abspath('build')],
+        include_dirs=['include'],
+        library_dirs=['build'],
+    )
+]
+
+
+setup(
+    name='fib_wrapper',
+    version='0.0.1',
+    ext_modules=cythonize(ext_modules)
+)
diff --git a/cython-example/src/fibonacci.cpp b/cython-example/src/fibonacci.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..799eddd82ddef4ce55518ea649a28381be71e6b7
--- /dev/null
+++ b/cython-example/src/fibonacci.cpp
@@ -0,0 +1,14 @@
+#include "fibonacci.h"
+
+unsigned long fibonacci(unsigned int n) {
+	unsigned long n0 = 1;
+	unsigned long n1 = 1;
+	unsigned long tmp = 1;
+
+	for (unsigned int i = 0; i < n; i++) {
+		tmp = n1;
+		n1 = n0 + n1;
+		n0 = tmp;
+	}
+	return n0;
+}
diff --git a/pybind11-example/Makefile b/pybind11-example/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..35bf03e21c899900d44281ac1a7886093f34b6a4
--- /dev/null
+++ b/pybind11-example/Makefile
@@ -0,0 +1,35 @@
+all: libfibonacci.so fibmod fib_cli
+
+fib_cli: apps/fib_cli.cpp libfibonacci.so
+	# compile fib_cli.cpp using the c++ compiler
+	# save to `fib_cli`
+	# link against the library `fibonacci`
+	# include the current directory in the directories searched for libraries
+	# include the current directory in the directories searched for headers
+	# compile the path where the library is to find into the binary
+	$(CXX) apps/fib_cli.cpp \
+		-o fib_cli \
+		-lfibonacci \
+		-L. \
+		-Iinclude \
+		-Wl,-rpath .
+
+libfibonacci.so: include/fibonacci.h src/fibonacci.cpp
+	# compile fibonacci.cpp into a shared library 
+	# into libfibonacci.so
+	$(CXX) src/fibonacci.cpp \
+		-I include \
+		-o libfibonacci.so \
+		-Wl,-rpath . \
+		--shared
+
+fibmod: libfibonacci.so src/fibonacci_wrapper.cpp
+	# compile a python wrapper using pybind 11
+	$(CXX) -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup \
+		-Iinclude -L. -lfibonacci \
+		`python3 -m pybind11 --includes` \
+		src/fibonacci_wrapper.cpp \
+		-o fibmod`python3-config --extension-suffix`
+
+clean:
+	rm -f fib_cli libfibonacci.so fibmod.cpython* fib_cli
diff --git a/pybind11-example/apps/fib_cli.cpp b/pybind11-example/apps/fib_cli.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0cf58fae75235c8044efc50c1306012d99b20825
--- /dev/null
+++ b/pybind11-example/apps/fib_cli.cpp
@@ -0,0 +1,12 @@
+#include <iostream>
+#include "fibonacci.h"
+
+
+int main() {
+
+	for (unsigned int i = 0; i < 10; i++) {
+		std::cout << i << ": " << fibonacci(i) << std::endl;
+	}
+     
+    return 0;
+}
diff --git a/pybind11-example/fib_cli b/pybind11-example/fib_cli
new file mode 100755
index 0000000000000000000000000000000000000000..3db9e49b452e304224eacc2e1d356fb616b04d8d
Binary files /dev/null and b/pybind11-example/fib_cli differ
diff --git a/pybind11-example/include/fibonacci.h b/pybind11-example/include/fibonacci.h
new file mode 100644
index 0000000000000000000000000000000000000000..57fd44944277a33d08f597f6b2a90b7cee4d2c11
--- /dev/null
+++ b/pybind11-example/include/fibonacci.h
@@ -0,0 +1,4 @@
+#ifndef FIBONACCI_H
+#define FIBONACCI_H
+unsigned long fibonacci(unsigned int n);
+#endif
diff --git a/pybind11-example/src/fibonacci.cpp b/pybind11-example/src/fibonacci.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5ef56cea2511af865d91ad9274d81088b616ef97
--- /dev/null
+++ b/pybind11-example/src/fibonacci.cpp
@@ -0,0 +1,14 @@
+#include "fibonacci.h"
+
+unsigned long fibonacci(unsigned int n) {
+  unsigned long n0 = 1;
+  unsigned long n1 = 1;
+  unsigned long tmp = 1;
+
+  for (unsigned int i = 0; i < n; i++) {
+    tmp = n1;
+    n1 = n0 + n1;
+    n0 = tmp;
+  }
+  return n0;
+}
diff --git a/pybind11-example/src/fibonacci_wrapper.cpp b/pybind11-example/src/fibonacci_wrapper.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..104883b7d6e7755e889e59213322a542f17e9330
--- /dev/null
+++ b/pybind11-example/src/fibonacci_wrapper.cpp
@@ -0,0 +1,8 @@
+#include <pybind11/pybind11.h>
+#include "fibonacci.h"
+
+PYBIND11_MODULE(fibmod, m) {
+    m.doc() = "pybind11 example plugin for fibonacci";
+
+    m.def("fibonacci", &fibonacci, "Fibonacci function using C++");
+}