diff --git a/Makefile b/Makefile
index 5a818ec6d6fc741b2724d1e20469a68cb3d40af4..4c2da1774d42b4d22e0e2a96728dcef6f87f51cb 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ TARGET_LIB_DIR 		:= lib
 CC      			:= gcc
 LD      			:= gcc
 MAKE    			:= /usr/bin/make
+MKDIR_P 			:= mkdir -p
 
 # Libraries
 LIBS 				:= -lbinary_c $(shell $(BINARY_C)/binary_c-config --libs)
@@ -38,27 +39,30 @@ OBJECTS 			:= $(C_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
 OBJ_FLAGS 			:= -c
 
 # Shared lib files and flags
-SO_NAME 			:= $(TARGET_LIB_DIR)/libbinary_c_api.so
+SO_NAME 			:= $(TARGET_LIB_DIR)/libbinary_c_python_api.so
 SO_FLAGS 			:= -shared
 
-# To create python shared library
-PY_EXEC 			:= python3
-PY_SETUP 			:= setup.py
-#PY_OPTIONS 			:= build_ext --build-lib $(TARGET_LIB_DIR)
-PY_OPTIONS 			:= build_ext --inplace
+all: create_directories create_objects create_library
 
-all:
+debug: create_directories create_objects_debug create_library_debug
+
+create_directories:
+	${MKDIR_P} ${TARGET_LIB_DIR}
+	${MKDIR_P} ${OBJ_DIR}
+
+create_objects:
 	$(CC) -DBINARY_C=$(BINARY_C) $(CFLAGS) $(INCDIRS) $(C_SRC) -o $(OBJECTS) $(OBJ_FLAGS) $(LIBS) 
-	$(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS)
-	$(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS)
 
-debug:
+create_objects_debug: 
 	$(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(CFLAGS) $(INCDIRS) $(C_SRC) -o $(OBJECTS) $(OBJ_FLAGS) $(LIBS) 
-	$(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS)
-	$(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS)
 
+create_library:
+	$(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS)
+
+create_library_debug:
+	$(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS)
 
-test:	
+echo_vars:	
 	@echo OBJECTS: $(OBJECTS)
 	@echo LIBS: $(LIBS)
 	@echo C_SRC: $(C_SRC)
diff --git a/setup.py b/setup.py
index ab47b88dc120048d3b4ad35b473992cd744e83ac..9397399c46eca471978ff76104c4572c51c95275 100644
--- a/setup.py
+++ b/setup.py
@@ -1,12 +1,17 @@
 """
 Setup script for binarycpython
 """
-import setuptools
-from distutils.core import setup, Extension
-
 import os
 import subprocess
 import re
+import sys
+
+import setuptools
+
+from distutils.core import setup, Extension
+import distutils.command.build
+
+# TODO: replace the tasks that call binary_c-config with a single function that handles the return status a bit better. 
 
 # Functions
 def readme():
@@ -24,13 +29,39 @@ def license():
 def check_version(installed_binary_c_version, required_binary_c_versions):
     """Function to check the installed version and compare it to the required version"""
     message = """
-    The binary_c version that is installed ({}) does not match the binary_c versions ({})
+    Something went wrong. Make sure that binary_c config exists. 
+    Possibly the binary_c version that is installed ({}) does not match the binary_c versions ({})
     that this release of the binary_c python module requires.
     """.format(
         installed_binary_c_version, required_binary_c_versions
     )
     assert installed_binary_c_version in required_binary_c_versions, message
 
+def execute_make():
+    """
+    Function to execute the makefile. 
+
+    This makefile builds the binary_c_python_api library that python will use to interface wth
+    """
+
+    # Custom extra command:
+    make_command = ["make"]
+
+    p = subprocess.run(make_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout = p.stdout # stdout = normal output
+    stderr = p.stderr # stderr = error output
+
+    if p.returncode != 0:
+        print("Something went wrong when executing the makefile:")
+        print(stderr.decode('utf-8'))
+        print("Aborting")
+        sys.exit(-1)
+
+    else:
+        print(stdout.decode("utf-8"))
+        print("Successfully built the libbinary_c_api.so")
+
+
 
 ###
 REQUIRED_BINARY_C_VERSIONS = ["2.1.7"]
@@ -129,7 +160,7 @@ INCLUDE_DIRS = (
     else []
 )
 
-LIBRARIES = ["binary_c"] + BINARY_C_LIBS + ["binary_c_api"]
+LIBRARIES = ["binary_c"] + BINARY_C_LIBS + ["binary_c_python_api"]
 
 LIBRARY_DIRS = [
     os.path.join(BINARY_C_DIR, "src"),
@@ -163,7 +194,6 @@ RUNTIME_LIBRARY_DIRS = list(dict.fromkeys(RUNTIME_LIBRARY_DIRS))
 # print("macros: ", str(BINARY_C_DEFINE_MACROS) + "\n")
 # print('\n')
 
-#quit()
 ############################################################
 # Making the extension function
 ############################################################
@@ -171,7 +201,7 @@ RUNTIME_LIBRARY_DIRS = list(dict.fromkeys(RUNTIME_LIBRARY_DIRS))
 
 BINARY_C_PYTHON_API_MODULE = Extension(
     # name="binarycpython.core.binary_c",
-    name="binary_c_python_api",
+    name="binarycpython._binary_c_bindings",
     sources=["src/binary_c_python.c"],
     include_dirs=INCLUDE_DIRS,
     libraries=LIBRARIES,
@@ -187,6 +217,16 @@ BINARY_C_PYTHON_API_MODULE = Extension(
 # Making the extension function
 ############################################################
 
+# Override build command
+class CustomBuildCommand(distutils.command.build.build):
+
+    def run(self):
+        execute_make()
+
+        # Run the original build command
+        # print(super().run())
+        distutils.command.build.build.run(self)
+
 setup(
     name="binarycpython",
     version="0.2",
@@ -201,22 +241,20 @@ setup(
     ),
     author="David Hendriks",
     author_email="davidhendriks93@gmail.com",
+    long_description_content_type='text/markdown',
     long_description=readme(),
     url="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python",
     license="gpl",
-    package_dir={
-        "binarycpython": "binarycpython",
-        "binarycpython.utils": "binarycpython/utils",
-        # 'binarycpython.core': 'lib',
-    },
+    keywords = ['binary_c', 'astrophysics', 'stellar evolution', 'population synthesis'],   # Keywords that define your package best
     packages=[
         "binarycpython",
         "binarycpython.utils",
-        # 'binarycpython.core',
+        "binarycpython.core",
+        "binarycpython.tests",
+        "binarycpython.tests.core",
     ],
-    # package_data={
-    #     'binarycpython.core': ['libbinary_c_api.so'],
-    # },
+    install_requires=["numpy", "pytest", "h5py"],
+    include_package_data=True,
     ext_modules=[BINARY_C_PYTHON_API_MODULE],  # binary_c must be loaded
 
     classifiers=[
@@ -231,4 +269,7 @@ setup(
         "Topic :: Scientific/Engineering :: Physics",
         "Topic :: Software Development :: Libraries :: Python Modules",
     ],
+
+    cmdclass={'build': CustomBuildCommand},
+
 )