diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2590ccb41a9f7512e9a1c4cf287910d615043e70
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,35 @@
+##############################################################################
+# CMake
+##############################################################################
+
+cmake_minimum_required(VERSION 2.8.3)
+project(genjava)
+
+##############################################################################
+# Dependencies
+##############################################################################
+
+find_package(catkin REQUIRED COMPONENTS genmsg)
+
+##############################################################################
+# Package
+##############################################################################
+
+catkin_package(
+  CATKIN_DEPENDS genmsg
+  CFG_EXTRAS genjava-extras.cmake
+)
+
+add_subdirectory(scripts)
+
+message(STATUS "GENMSG_LANGS_DESTINATION...........${GENMSG_LANGS_DESTINATION}")
+file(WRITE ${CATKIN_DEVEL_PREFIX}/${GENMSG_LANGS_DESTINATION}/genjava "Java")
+install(FILES ${CATKIN_DEVEL_PREFIX}/${GENMSG_LANGS_DESTINATION}/genjava
+  DESTINATION ${GENMSG_LANGS_DESTINATION})
+
+catkin_python_setup()
+
+if(CATKIN_ENABLE_TESTING)
+  catkin_add_nosetests(test)
+endif()
+
diff --git a/cmake/genjava-extras.cmake.em b/cmake/genjava-extras.cmake.em
new file mode 100644
index 0000000000000000000000000000000000000000..74e1020f79b5fad94f720196531f85c7079b73b6
--- /dev/null
+++ b/cmake/genjava-extras.cmake.em
@@ -0,0 +1,101 @@
+@[if DEVELSPACE]@
+# location of scripts in develspace
+set(GENJAVA_BIN_DIR "@(CMAKE_CURRENT_SOURCE_DIR)/scripts")
+@[else]@
+# location of scripts in installspace
+set(GENJAVA_BIN_DIR "${GENJAVA_DIR}/../../../@(CATKIN_PACKAGE_BIN_DESTINATION)")
+@[end if]@
+
+set(GENMSG_JAVA_BIN ${GENJAVA_BIN_DIR}/genmsg_java.py)
+set(GENSRV_JAVA_BIN ${GENJAVA_BIN_DIR}/gensrv_java.py)
+
+# Generate .msg->.h for py
+# The generated .h files should be added ALL_GEN_OUTPUT_FILES_py
+macro(_generate_msg_java ARG_PKG ARG_MSG ARG_IFLAGS ARG_MSG_DEPS ARG_GEN_OUTPUT_DIR)
+
+  message(STATUS "GEN_MSG_JAVA..........._generate_msg_java")
+  message(STATUS "  ARG_PKG..............${ARG_PKG}")
+  message(STATUS "  ARG_MSG..............${ARG_MSG}")
+  message(STATUS "  ARG_IFLAGS...........${ARG_IFLAGS}")
+  message(STATUS "  ARG_MSG_DEPS.........${ARG_MSG_DEPS}")
+  message(STATUS "  ARG_GEN_OUTPUT_DIR...${ARG_GEN_OUTPUT_DIR}")
+
+  #Append msg to output dir
+#  set(GEN_OUTPUT_DIR "${ARG_GEN_OUTPUT_DIR}/msg")
+#  file(MAKE_DIRECTORY ${GEN_OUTPUT_DIR})
+  #Create input and output filenames
+#  get_filename_component(MSG_SHORT_NAME ${ARG_MSG} NAME_WE)
+#
+#  set(MSG_GENERATED_NAME _${MSG_SHORT_NAME}.py)
+#  set(GEN_OUTPUT_FILE ${GEN_OUTPUT_DIR}/${MSG_GENERATED_NAME})
+#
+#  add_custom_command(OUTPUT ${GEN_OUTPUT_FILE}
+#    DEPENDS ${GENMSG_PY_BIN} ${ARG_MSG} ${ARG_MSG_DEPS}
+#    COMMAND ${CATKIN_ENV} ${PYTHON_EXECUTABLE} ${GENMSG_PY_BIN} ${ARG_MSG}
+#    ${ARG_IFLAGS}
+#    -p ${ARG_PKG}
+#    -o ${GEN_OUTPUT_DIR}
+#    COMMENT "Generating Python from MSG ${ARG_PKG}/${MSG_SHORT_NAME}"
+#    )
+#
+#  list(APPEND ALL_GEN_OUTPUT_FILES_py ${GEN_OUTPUT_FILE})
+
+endmacro()
+
+#todo, these macros are practically equal. Check for input file extension instead
+macro(_generate_srv_java ARG_PKG ARG_SRV ARG_IFLAGS ARG_MSG_DEPS ARG_GEN_OUTPUT_DIR)
+
+  message(STATUS "GEN_SRV_JAVA..........._generate_srv_java")
+  #Append msg to output dir
+#  set(GEN_OUTPUT_DIR "${ARG_GEN_OUTPUT_DIR}/srv")
+#  file(MAKE_DIRECTORY ${GEN_OUTPUT_DIR})
+#
+  #Create input and output filenames
+#  get_filename_component(SRV_SHORT_NAME ${ARG_SRV} NAME_WE)
+#
+#  set(SRV_GENERATED_NAME _${SRV_SHORT_NAME}.py)
+#  set(GEN_OUTPUT_FILE ${GEN_OUTPUT_DIR}/${SRV_GENERATED_NAME})
+#
+#  add_custom_command(OUTPUT ${GEN_OUTPUT_FILE}
+#    DEPENDS ${GENSRV_PY_BIN} ${ARG_SRV} ${ARG_MSG_DEPS}
+#    COMMAND ${CATKIN_ENV} ${PYTHON_EXECUTABLE} ${GENSRV_PY_BIN} ${ARG_SRV}
+#    ${ARG_IFLAGS}
+#    -p ${ARG_PKG}
+#    -o ${GEN_OUTPUT_DIR}
+#    COMMENT "Generating Python code from SRV ${ARG_PKG}/${SRV_SHORT_NAME}"
+#    )
+#
+#  list(APPEND ALL_GEN_OUTPUT_FILES_py ${GEN_OUTPUT_FILE})
+
+endmacro()
+
+macro(_generate_module_java ARG_PKG ARG_GEN_OUTPUT_DIR ARG_GENERATED_FILES)
+
+  message(STATUS "GEN_MODULE_PY..........._generate_module_py")
+  # generate empty __init__ to make parent folder of msg/srv a python module
+  if(NOT EXISTS ${ARG_GEN_OUTPUT_DIR}/__init__.py)
+    file(WRITE ${ARG_GEN_OUTPUT_DIR}/__init__.py "")
+  endif()
+
+  #Append msg to output dir
+  foreach(type "msg" "srv")
+    set(GEN_OUTPUT_DIR "${ARG_GEN_OUTPUT_DIR}/${type}")
+    set(GEN_OUTPUT_FILE ${GEN_OUTPUT_DIR}/__init__.py)
+
+    if(IS_DIRECTORY ${GEN_OUTPUT_DIR})
+      add_custom_command(OUTPUT ${GEN_OUTPUT_FILE}
+        DEPENDS ${GENMSG_PY_BIN} ${ARG_GENERATED_FILES}
+        COMMAND ${CATKIN_ENV} ${PYTHON_EXECUTABLE} ${GENMSG_PY_BIN}
+        -o ${GEN_OUTPUT_DIR}
+        --initpy
+        COMMENT "Generating Python ${type} __init__.py for ${ARG_PKG}")
+      list(APPEND ALL_GEN_OUTPUT_FILES_py ${GEN_OUTPUT_FILE})
+    endif()
+
+  endforeach()
+
+endmacro()
+
+if(NOT EXISTS @(PROJECT_NAME)_SOURCE_DIR)
+  set(GENJAVA_INSTALL_DIR ${PYTHON_INSTALL_DIR})
+endif()
\ No newline at end of file
diff --git a/package.xml b/package.xml
new file mode 100644
index 0000000000000000000000000000000000000000..84622fd1fd74c59d1500b4f9684cb9c854793fbb
--- /dev/null
+++ b/package.xml
@@ -0,0 +1,29 @@
+<package>
+  <name>genjava</name>
+  <version>0.1.0</version>
+  <description>
+    Java ROS message and service generators.
+  </description>
+
+  <license>BSD</license>  
+
+  <url type="website">http://www.ros.org/wiki/genjava</url>
+  <url type="repository">https://github.com/rosjava/genjava</url>
+  <url type="bugtracker">https://github.com/rosjava/genjava/issues</url>
+
+  <maintainer email="d.stonier@gmail.com">Daniel Stonier</maintainer>
+
+  <author>Daniel Stonier</author>
+
+  <buildtool_depend version_gte="0.5.78">catkin</buildtool_depend>
+
+  <build_depend>genmsg</build_depend>
+
+  <run_depend>genmsg</run_depend>
+
+  <export>
+    <message_generator>java</message_generator>
+    <rosdoc config="rosdoc.yaml"/>
+    <architecture_independent/>
+  </export>
+</package>
diff --git a/rosdoc.yaml b/rosdoc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d75b5d709ce8e9cc044b88e6e4f55b8d148c40c4
--- /dev/null
+++ b/rosdoc.yaml
@@ -0,0 +1,2 @@
+ - builder: sphinx
+   sphinx_root_dir: doc
\ No newline at end of file
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..762da4282551c138f4bcd180882611ae4dffc87e
--- /dev/null
+++ b/scripts/CMakeLists.txt
@@ -0,0 +1,3 @@
+catkin_install_python(
+  PROGRAMS genmsg_java.py gensrv_java.py
+  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
diff --git a/scripts/genmsg_java.py b/scripts/genmsg_java.py
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/gensrv_java.py b/scripts/gensrv_java.py
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b8ce616e50ad349368638423b671f8ebdfc60b4
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+
+from distutils.core import setup
+from catkin_pkg.python_setup import generate_distutils_setup
+
+d = generate_distutils_setup(
+    packages=['genjava'],
+    package_dir={'': 'src'},
+    requires=['genmsg']
+)
+
+setup(**d)
\ No newline at end of file
diff --git a/src/genjava/__init__.py b/src/genjava/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce7b434e8f3d0f975c262118ce6769823ff0d6c7
--- /dev/null
+++ b/src/genjava/__init__.py
@@ -0,0 +1,37 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2014, Daniel Stonier
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Willow Garage, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+#from . rostime import Time, Duration, TVal
+#from . message import Message, SerializationError, DeserializationError, MessageException, struct_I
+
+#__all__ = ['Time', 'Duration', 'TVal',
+#        'Message', 'SerializationError', 'DeserializationError', 'MessageException', 'struct_I']
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391