diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f26d67314a75e7c42bab76ffad7337c07a18d31c
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 2.8.3)
+project(cfclient)
+find_package(catkin REQUIRED)
+catkin_package()
+catkin_python_setup()
+install(PROGRAMS bin/cfclient bin/cfheadless
+        DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
diff --git a/package.xml b/package.xml
new file mode 100644
index 0000000000000000000000000000000000000000..db1f17469ebf696d6e2182b737b9a4ba5461100f
--- /dev/null
+++ b/package.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<package>
+  <!-- Changed the name to cfclient to avoid '_', as, when installed,
+       python converts them to '-' which are not allowed in catkin pkgs.
+       This prevents get_distribution from working, and retriving version
+       as specified in setup.py -->
+  <name>cfclient</name>
+  <version>2014.04.9001</version>
+  <description>Bitcraze Cazyflie nano quadcopter client</description>
+
+  <url type="website">https://github.com/mchenryc/crazyflie_clients_python</url>
+  <license>GPL</license>
+
+  <author email="contact@bitcraze.se">Bitcraze team</author>
+  <maintainer email="mchenryc@gmail.com">Chadwick McHenry</maintainer>
+
+  <!-- Dependencies can be catkin packages or system dependencies -->
+  <!-- Use build_depend for packages you need at compile time: -->
+  <!-- Use buildtool_depend for build tool packages: -->
+  <!-- Use run_depend for packages you need at runtime: -->
+  <!-- Use test_depend for packages you need only for testing: -->
+  <buildtool_depend>catkin</buildtool_depend>
+  <build_depend>rospy</build_depend>
+
+</package>
diff --git a/setup.py b/setup.py
index 3267fdc345e627cc436f23bc8fae8dd0721c2e7a..e9eed5050766098ef845ffdabb84230d113d8cc7 100644
--- a/setup.py
+++ b/setup.py
@@ -42,13 +42,8 @@ else:
     setup_args=dict(
         scripts=['bin/cfclient', 'bin/cfheadless'])
 
-with open(os.path.join(os.path.dirname(__file__),
-                       "lib",
-                       "cfclient",
-                       "version.py"), "w") as versionpy:
-    versionpy.write("VERSION='{}'".format(VERSION))
-
-setup(name='cfclient',
+#Initial parameters
+setup_args=dict(name='cfclient',
       description='Bitcraze Cazyflie nano quadcopter client',
       version=VERSION,
       author='Bitcraze team',
@@ -83,6 +78,24 @@ setup(name='cfclient',
                    glob.glob('lib/cfclient/*.png'))],
       **setup_args)
 
+#Fetch values from package.xml when using catkin
+import os
+if os.getenv('CATKIN_TEST_RESULTS_DIR'):
+    from catkin_pkg.python_setup import generate_distutils_setup
+    #Delete keys which should not match catkin packaged variant
+    for k in ('version', 'url'):
+        setup_args.pop(k, None)
+    setup_args=generate_distutils_setup(**setup_args)
+
+#Write a temp file to pass version into script
+with open(os.path.join(os.path.dirname(__file__),
+                       "lib",
+                       "cfclient",
+                       "version.py"), "w") as versionpy:
+    versionpy.write("VERSION='{}'".format(VERSION))
+
+setup(**setup_args)
+
 os.remove(os.path.join(os.path.dirname(__file__),
                        "lib",
                        "cfclient",