diff --git a/CMakeLists.txt b/CMakeLists.txt
index eae70f34b6f957a8065672eba8e6f4011207ec52..79be8222ed78e4986b2885ed6e39101448f8af7f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,7 +17,9 @@ find_package(catkin REQUIRED COMPONENTS genmsg)
 
 catkin_package(
   CATKIN_DEPENDS genmsg
-  CFG_EXTRAS genjava-extras.cmake
+  CFG_EXTRAS
+    genjava-extras.cmake
+    genjava-catkin-api.cmake
 )
 
 catkin_python_setup()
diff --git a/cmake/genjava-catkin-api.cmake.em b/cmake/genjava-catkin-api.cmake.em
new file mode 100644
index 0000000000000000000000000000000000000000..f9d33b7d56b49873889647c723b86171feeba011
--- /dev/null
+++ b/cmake/genjava-catkin-api.cmake.em
@@ -0,0 +1,53 @@
+@[if DEVELSPACE]@
+# location of scripts in develspace
+  set(GENJAVA_BIN_DIR "@(CMAKE_CURRENT_SOURCE_DIR)/scripts")
+@[else]@
+  set(GENJAVA_BIN_DIR "${GENJAVA_DIR}/../../../@(CATKIN_PACKAGE_BIN_DESTINATION)")
+@[end if]@
+
+set(GENJAVA_BIN ${GENJAVA_BIN_DIR}/genjava_message_artifacts)
+set(genjava_INSTALL_DIR "maven/org/ros/rosjava_messages")
+
+include(CMakeParseArguments)
+
+# Api for a a catkin metapackage rolls rosjava messages for
+# its dependencies. Accepts a list of package names attached
+# to the PACKAGES arg (similar to the genmsg
+# 'generate_messages' api.
+#
+#   generate_rosjava_messages(
+#     PACKAGES
+#         std_msgs
+#         geometry_msgs
+#   )
+macro(generate_rosjava_messages)
+  if( ${ARGC} EQUAL 0 )
+    return() # Nothing to do (no packages specified)
+  else()
+    cmake_parse_arguments(ARG "" "" "PACKAGES" ${ARGN})
+  endif()
+  if(ARG_UNPARSED_ARGUMENTS)
+    message(FATAL_ERROR "generate_rosjava_messages() called with unused arguments: ${ARG_UNPARSED_ARGUMENTS}")
+  endif()
+  set(ROS_GRADLE_VERBOSE $ENV{ROS_GRADLE_VERBOSE})
+  if(ROS_GRADLE_VERBOSE)
+      set(verbosity "--verbosity")
+  else()
+      set(verbosity "")
+  endif()
+  string(REPLACE ";" " " package_list "${ARG_PACKAGES}")
+  add_custom_target(${PROJECT_NAME}_rosjava_messages
+    ALL
+    COMMAND ${CATKIN_ENV} ${PYTHON_EXECUTABLE} ${GENJAVA_BIN}
+        ${verbosity}
+        -o ${CMAKE_CURRENT_BINARY_DIR}
+        -p ${ARG_PACKAGES} # this has to be a list argument so it separates each arg (not a single string!)
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMENT "Compiling rosjava message artifacts for [${package_list}]"
+  )
+  foreach(pkg ${ARG_PACKAGES})
+    message(STATUS "Additional clean file.......${CMAKE_CURRENT_BINARY_DIR}/${pkg}/build.gradle")
+    set_directory_properties(PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/${pkg}/build.gradle)
+    add_dependencies(${PROJECT_NAME}_rosjava_messages ${pkg}_generate_messages)
+  endforeach()
+endmacro()
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
index 5f1a2b4f4339d6d62bf1b6795e3fa0f6fa7f867b..31aeff58372a35bf439c3f31bbebbe68d7ee2591 100644
--- a/scripts/CMakeLists.txt
+++ b/scripts/CMakeLists.txt
@@ -2,7 +2,10 @@
 # Installs
 ##############################################################################
 
+# Rosrunnable installation of scripts
 catkin_install_python(
-    PROGRAMS genjava_gradle_project.py
-    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
-)
+  PROGRAMS 
+    genjava_gradle_project.py
+    genjava_message_artifacts
+  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
\ No newline at end of file