diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 9719d598632171ce31c6b9bc51df40496a2823f3..ab66da242c77949596804decaeb75cc733cf8c7c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,12 +2,83 @@
 Changelog
 ^^^^^^^^^
 
+0.3.0 (2016-12-14)
+------------------
+* Updates for Kinetic release.
+
+0.2.4 (2015-06-03)
+------------------
+* bugfix environment hooks for workspaces with spaces.
+
+0.2.3 (2015-03-01)
+------------------
+* publically expose the rosjava environment setup (for genjava).
+* Contributors: Daniel Stonier
+
+0.2.2 (2015-02-25)
+------------------
+* support for finding broken message packages.
+* Contributors: Daniel Stonier
+
+0.2.1 (2015-02-25)
+------------------
+* upgrade catkin create scripts for indigo
+* support modules for genjava
+* deprecated create msg package scripts
+* minor bugfixes and improvements.
+* Contributors: Benjamin Chrétien, Daniel Stonier, Martin Pecka
+
 0.2.0 [2013-10-25]
 ==================
 * official maven style open range dependencies in templates
 * gradle 1.7->1.8
 * android build tools 18.1.1
 
+0.1.34 (2014-06-12)
+===================
+* assist rospack to speedup by ignoring the installed maven directories.
+
+0.1.33 [2014-03-19]
+===================
+* gradle 1.9->1.11
+
+0.1.32 [2014-02-20]
+===================
+* bugfix catkin_make on empty catkin_created gradle projects.
+
+0.1.31 [2014-02-03]
+===================
+* separate app and library catkin_create_rosjava_xxx_project scripts.
+* app rosjava project integration with catkin_make (i.e. cmake-gradle targets).
+
+0.1.30 [2013-12-26]
+===================
+* rosdistro scraping more intelligent : now checks for message_generation dependant packages
+* gradle 1.8->1.9 upgrade in templates
+
+0.1.29 [2013-11-08]
+===================
+* fix single artifact message generation when there is dependencies.
+
+0.1.28 [2013-10-30]
+===================
+* seed ROS_MAVEN_REPOSITORY when necessary.
+
+0.1.27 [2013-10-30]
+===================
+* use ROS_MAVEN_REPOSITORY to configure the external repository.
+
+0.1.26 [2013-10-26]
+===================
+* embedded gradle 1.7->1.8
+* templates updated for official maven style open ranged dependencies
+
+0.1.25 [2013-10-26]
+===================
+
+* gradle 1.7->1.8
+* android tools 17->18.1.1
+
 0.1.24 [2013-10-04]
 ===================
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d9803703bafb26f84ad30b886180ad6294b8f2a1..9eb125511c751e3edb702d91568ad6a8f23b1082 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,3 +42,10 @@ install(
     DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
     )
 
+set(ROS_MAVEN_DEPLOYMENT_REPOSITORY $ENV{ROS_MAVEN_DEPLOYMENT_REPOSITORY})
+if(NOT ROS_MAVEN_DEPLOYMENT_REPOSITORY)
+    set(ROS_MAVEN_DEPLOYMENT_REPOSITORY "${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_SHARE_DESTINATION}/maven")
+endif()
+file(WRITE ${ROS_MAVEN_DEPLOYMENT_REPOSITORY}/rospack_nosubdirs "")
+install(FILES ${ROS_MAVEN_DEPLOYMENT_REPOSITORY}/rospack_nosubdirs
+        DESTINATION ${CATKIN_GLOBAL_SHARE_DESTINATION}/maven)
diff --git a/README.md b/README.md
index 89df68889d6f586f17203ee9aaa3daac7b2a1b60..07a3ee86b745a94cb08cd280d80ec3c442b8aa46 100644
--- a/README.md
+++ b/README.md
@@ -1,54 +1,9 @@
-# RosJava Tools
+See [rosjava_core](https://github.com/rosjava/rosjava_core) readme.
 
-Build tools for rosjava and android repositories. Currently includes some cmake macros and python creation
-scripts.
+## Moving ##
 
+This documentation will eventually merge with the rosjava_core and android_core documentation.
 
-## RosJava Build Demo
-
-
-```
-> mkdir -p ~/rosjava/src
-> cd ~/rosjava/src
-> catkin_init_workspace .
-> wstool init .
-> wstool set rosjava_build_tools --git https://github.com/rosjava/rosjava_build_tools -v hydro-devel
-> wstool set rosjava_core --git https://github.com/rosjava/rosjava_core -v hydro-devel
-> wstool update
-> cd ~/rosjava
-> catkin_make
-```
-
-The only changes made to the `rosjava_core` repo was to add a `package.xml` with a depends on `rosjava_build_tools` and a
-changes to the `CMakeLists.txt` as follows:
-
-```
-...
-find_package(catkin REQUIRED rosjava_build_tools)
-
-catkin_rosjava_setup()
-```
-
-This cmake makro sets up dummy targets in the cmake configuration which call out to gradle in the actual make step. 
-It also parses the `package.xml` to add target dependencies from each `build_depends` tag (subsequently letting you
-sequence builds across repositories).
-
-It also adds a global and package `gradle-clean` target.
-
-```
-> catkin_make
-# Clean a single gradle package
-> cd ~/rosjava/build/rosjava_core
-> make gradle-clean-rosjava_core
-# Clean all gradle packages
-> cd ~/rosjava/build
-> make gradle-clean
-```
-
-## Android Build Demo
+## Usage ##
 
 Refer to http://ros.org/wiki/rosjava_build_tools.
-
-## Moving
-
-This documentation will eventually merge with the rosjava_core and android_core documentation.
diff --git a/cmake/rosjava.cmake.em b/cmake/rosjava.cmake.em
index b7a3c8081417d3a24befccc48211e26461e284a6..b867f5b6af87b2fb6f93d341cd9d0ef694d8cbbb 100644
--- a/cmake/rosjava.cmake.em
+++ b/cmake/rosjava.cmake.em
@@ -43,7 +43,8 @@ endmacro()
 # CATKIN_ENV won't have any configuration, so we need some incoming here.
 # Note that we check for the variable existence as well so we don't
 # override a user setting.
-macro(_rosjava_env)
+macro(catkin_rosjava_env_setup)
+    set(ROS_GRADLE_VERBOSE $ENV{ROS_GRADLE_VERBOSE})
     set(ROS_MAVEN_DEPLOYMENT_REPOSITORY $ENV{ROS_MAVEN_DEPLOYMENT_REPOSITORY})
     set(ROS_MAVEN_REPOSITORY $ENV{ROS_MAVEN_REPOSITORY})
     if(NOT ROS_MAVEN_DEPLOYMENT_REPOSITORY)
@@ -68,27 +69,41 @@ endmacro()
 # Calls the gradle wrapper to compile just the package
 # that it is called in with install and installApp targets.
 macro(catkin_rosjava_setup)
-    _rosjava_env()
+    catkin_rosjava_env_setup()
     find_gradle()
     if( ${ARGC} EQUAL 0 )
-      # Note : COMMAND is a list of variables (semi-colon separated)
-      set(gradle_tasks "uploadArchives") # old targets "install;installApp;uploadArchives"
+      return() # Nothing to do (typically no subprojects created yet)
     else()
       set(gradle_tasks ${ARGV})
     endif()
-    add_custom_target(gradle-${PROJECT_NAME}
-        ALL
-        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" 
-        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_tasks} 
+    if(ROS_GRADLE_VERBOSE)
+       set(gradle_options "")
+    else()
+       set(gradle_options "-q")
+    endif()
+    ###################################
+    # Execution
+    ###################################
+    add_custom_target(gradle-${PROJECT_NAME} ALL
+        #COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" 
+        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_options} ${gradle_tasks}
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
         VERBATIM
+        COMMENT "Gradling tasks for ${PROJECT_NAME}"
     )
+    ###################################
+    # Target Management
+    ###################################
     catkin_package_xml()
-    foreach(depends in ${${PROJECT_NAME}_BUILD_DEPENDS})
+    foreach(depends ${${PROJECT_NAME}_BUILD_DEPENDS})
         if(TARGET gradle-${depends})
-            #message(STATUS "Adding dependency gradle-${depends}")
+            #message(STATUS "Adding dependency.....gradle-${PROJECT_NAME} <- gradle-${depends}")
             add_dependencies(gradle-${PROJECT_NAME} gradle-${depends})
         endif()
+        if(TARGET ${depends}_generate_messages)
+            #message(STATUS "Adding dependency.....gradle-${PROJECT_NAME} <- ${depends}_generate_messages")
+            add_dependencies(gradle-${PROJECT_NAME} ${depends}_generate_messages)
+        endif()
     endforeach()
     if(NOT TARGET gradle-clean)
         add_custom_target(gradle-clean)
@@ -96,6 +111,7 @@ macro(catkin_rosjava_setup)
     add_custom_target(gradle-clean-${PROJECT_NAME}
         COMMAND ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} clean
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        COMMENT "Cleaning gradle project for ${PROJECT_NAME}"
     )
     add_dependencies(gradle-clean gradle-clean-${PROJECT_NAME})
 endmacro()
@@ -107,14 +123,10 @@ endmacro()
 # It checks the build type and determines whether it should run
 # assembleDebug or assembleRelease
 macro(catkin_android_setup)
-    _rosjava_env()
+    catkin_rosjava_env_setup()
     find_gradle()
     if( ${ARGC} EQUAL 0 )
-      if(CMAKE_BUILD_TYPE STREQUAL "Release")
-        set(gradle_tasks "assembleRelase")
-      else()
-        set(gradle_tasks "assembleDebug")
-      endif()
+      return() # Nothing to do (typically no subprojects created yet)
     else()
       set(gradle_tasks ${ARGV})
     endif()
diff --git a/env-hooks/15.rosjava.bash.em b/env-hooks/15.rosjava.bash.em
index 0a8cd588e0477d2218ca5f7b4d8eb2968aa98d22..9da9f00b39bcbe904349eb7c182f9eeaabf934c0 100644
--- a/env-hooks/15.rosjava.bash.em
+++ b/env-hooks/15.rosjava.bash.em
@@ -6,7 +6,6 @@ SCRIPT=@(CMAKE_CURRENT_SOURCE_DIR)/generate_environment_variables.py
 SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_variables.py
 @[end if]@
 
-export ROS_MAVEN_PATH=`python ${SCRIPT} --maven-path`
-export ROS_MAVEN_DEPLOYMENT_REPOSITORY=`python ${SCRIPT} --maven-deployment-repository`
-export ROS_MAVEN_REPOSITORY=`python ${SCRIPT} --maven-repository`
-
+export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`"
+export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`"
+export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`"
diff --git a/env-hooks/15.rosjava.sh.em b/env-hooks/15.rosjava.sh.em
index 62cc858023426f66458e44b0fdef7c1f4eda3d2f..36f796e5f06d8ca41c0d43a6b69da0eb2b821825 100644
--- a/env-hooks/15.rosjava.sh.em
+++ b/env-hooks/15.rosjava.sh.em
@@ -6,6 +6,6 @@ SCRIPT=@(CMAKE_CURRENT_SOURCE_DIR)/generate_environment_variables.py
 SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_variables.py
 @[end if]@
 
-export ROS_MAVEN_PATH=`python ${SCRIPT} --maven-path`
-export ROS_MAVEN_DEPLOYMENT_REPOSITORY=`python ${SCRIPT} --maven-deployment-repository`
-export ROS_MAVEN_REPOSITORY=`python ${SCRIPT} --maven-repository`
+export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`"
+export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`"
+export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`"
diff --git a/generate_environment_variables.py b/generate_environment_variables.py
index af7a3f9ffe18767c00682ea573292d648013d29e..5d8f4ce2c1baaeb29766cd7b917df9ce78618a9c 100755
--- a/generate_environment_variables.py
+++ b/generate_environment_variables.py
@@ -24,7 +24,7 @@ def get_workspaces(environ):
     value = environ[env_name] if env_name in environ else ''
     paths = [path for path in value.split(os.pathsep) if path]
     # remove non-workspace paths
-    workspaces = [path for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))]
+    workspaces = [path.replace(' ', '\ ') for path in paths if os.path.isfile(os.path.join(path, CATKIN_MARKER_FILE))]
     return workspaces
 
 def get_environment_variable(environ, key):
diff --git a/package.xml b/package.xml
index a0b990f66e6fbca106ba78f94af228907b28d93e..811a7a229efecc620ee2682849ce95e1fccaf969 100644
--- a/package.xml
+++ b/package.xml
@@ -1,27 +1,21 @@
 <package>
   <name>rosjava_build_tools</name>
-  <version>0.2.0</version>
+  <version>0.3.0</version>
   <description>
-    Simple tools and catkin modules for rosjava development. 
+    Simple tools and catkin modules for rosjava development.
   </description>
   <maintainer email="d.stonier@gmail.com">Daniel Stonier</maintainer>
   <license>BSD</license>
   <url type="website">http://ros.org/wiki/rosjava_build_tools</url>
   <url type="repository">https://github.com/ros-java/rosjava_build_tools</url>
   <url type="bugtracker">https://github.com/ros-java/rosjava_build_tools/issues</url>
-  <author email="d.stonier@gmail.com">Daniel Stonier</author>
+  <author>Daniel Stonier</author>
 
   <buildtool_depend>catkin</buildtool_depend>
 
-  <build_depend>python-rospkg</build_depend>
-  <build_depend>rospy</build_depend>
   <build_depend>java</build_depend>
   <build_depend>ant</build_depend>
-  <build_depend>python-rosinstall-generator</build_depend>
-  <run_depend>python-rospkg</run_depend>
-  <run_depend>rospy</run_depend>
   <run_depend>java</run_depend>
   <run_depend>ant</run_depend>
   <run_depend>catkin</run_depend>
-  <run_depend>python-rosinstall-generator</run_depend>
 </package>
diff --git a/scripts/catkin_create_rosjava_msg_project b/scripts/catkin_create_rosjava_library_project
similarity index 74%
rename from scripts/catkin_create_rosjava_msg_project
rename to scripts/catkin_create_rosjava_library_project
index afedb840c9ff6c0d9a1b6ef2ba31c20b9046ee43..dcc1d8960a83486269c0e722e495853ed99e2dbb 100755
--- a/scripts/catkin_create_rosjava_msg_project
+++ b/scripts/catkin_create_rosjava_library_project
@@ -1,17 +1,15 @@
 #!/usr/bin/env python
 
-"""This script creates the skeleton of an android library package"""
+"""This script creates the skeleton of a rosjava library project"""
 
 ##############################################################################
 # Imports
 ##############################################################################
 
 from __future__ import print_function
-import argparse
-import os
 import sys
 
-from rosjava_build_tools import create_rosjava_msg_project
+from rosjava_build_tools import create_rosjava_library_project
 import rosjava_build_tools.console as console
 
 ##############################################################################
@@ -20,7 +18,7 @@ import rosjava_build_tools.console as console
 
 if __name__ == "__main__":
     try:
-        sys.exit(create_rosjava_msg_project())
+        sys.exit(create_rosjava_library_project())
     except Exception as e:
         console.logerror("%s : %s" % (str(e), type(e)))
         sys.exit(1)
diff --git a/scripts/catkin_create_rosjava_pkg b/scripts/catkin_create_rosjava_pkg
index b21eb85e282c42682d2785177897b461bef858e9..fb533b86e3ff776036143832a30865119b026931 100755
--- a/scripts/catkin_create_rosjava_pkg
+++ b/scripts/catkin_create_rosjava_pkg
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-"""This script creates the skeleton of an rosjava repo"""
+"""This script creates the skeleton of a rosjava catkin package (typically an entire repo)"""
 
 ##############################################################################
 # Imports
diff --git a/scripts/catkin_create_rosjava_project b/scripts/catkin_create_rosjava_project
index 9a2a34660f9000acffd19325dc986adf94307ad6..ac9c3545f59484984ab0b8d2e82c82d4905f5497 100755
--- a/scripts/catkin_create_rosjava_project
+++ b/scripts/catkin_create_rosjava_project
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-"""This script creates the skeleton of an android library package"""
+"""This script creates the skeleton of a rosjava application project"""
 
 ##############################################################################
 # Imports
diff --git a/setup.py b/setup.py
index ab25ba3713b39c09a44eed9c2789ba331ced8457..7c823e8601336d906df0bebdb855983f270e790f 100644
--- a/setup.py
+++ b/setup.py
@@ -11,17 +11,16 @@ d = generate_distutils_setup(
              'scripts/catkin_create_android_library_project',
              'scripts/catkin_create_rosjava_pkg',
              'scripts/catkin_create_rosjava_project',
-             'scripts/catkin_create_rosjava_msg_project',
+             'scripts/catkin_create_rosjava_library_project',
             ],
     package_data = {'rosjava_build_tools': [
            'templates/android_package/*',
            'templates/android_project/*',
-           'templates/rosjava_msg_project/*',
+           'templates/rosjava_library_project/*',
            'templates/rosjava_package/*',
            'templates/rosjava_project/*',
            'templates/init_repo/*',
         ]},
-    requires=['rospy' 'rospkg']
 )
 
 setup(**d)
diff --git a/src/rosjava_build_tools/__init__.py b/src/rosjava_build_tools/__init__.py
index 1b912767d5c0cc4cc684f798e58e327112eac0e4..827706bdbe12f563481e841dfda34c0cfa8c5a5c 100644
--- a/src/rosjava_build_tools/__init__.py
+++ b/src/rosjava_build_tools/__init__.py
@@ -7,6 +7,7 @@
 import console
 from create_package import init_android_package, init_rosjava_package
 from create_android_project import create_android_project
-from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project
+from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project, create_rosjava_library_project
 from utils import which
 from release import scrape_for_release_message_packages
+import catkin
diff --git a/src/rosjava_build_tools/catkin.py b/src/rosjava_build_tools/catkin.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a3f75bceb3de638b61f601318247ea54e9586e7
--- /dev/null
+++ b/src/rosjava_build_tools/catkin.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Imports
+##############################################################################
+
+import os
+import catkin_pkg.packages
+import catkin_pkg.topological_order
+
+##############################################################################
+# Constants
+##############################################################################
+
+# packages that don't properly identify themselves as message packages (fix upstream).
+message_package_whitelist = ['map_store']
+
+##############################################################################
+# Methods
+##############################################################################
+
+
+def has_build_depend_on_message_generation(package):
+    '''
+      Checks for a build dependency on message generation to determine if
+      that package contains msgs/srvs.
+
+      @param package : typical catkin package object
+      @type catkin_pkg.Package
+
+      @return True if it is a package that contains msgs/srvs
+      @rtype Bool
+    '''
+    return 'message_generation' in [d.name for d in package.build_depends]
+
+
+def index_message_package_dependencies_from_local_environment(package_name_list=[], package_paths=None):
+    '''
+      Returns a topologically sorted list of message packages that can
+      be used for sequencing builds of packages.
+
+      @param package_name_list : sort dependencies for these packages only (defaults to all if empty)
+      @param package_paths : a python list of ros workspaces (defaults to ROS_PACKAGE_PATH if None is given)
+      @return dict mapping relative path to a catkin_pkg.Package
+    '''
+    if package_paths is None:
+        package_paths = os.getenv('ROS_PACKAGE_PATH', '')
+        package_paths = [x for x in package_paths.split(':') if x]
+    all_packages = {}  # mapping package name to (path, catkin_pkg.Package) tuple
+    message_packages = {}
+    # use reversed to write over any packages lower down in the overlay heirarchy
+    # i.e. no duplicates!
+    for path in reversed(package_paths):
+        for package_path, package in catkin_pkg.packages.find_packages(path).items():
+            all_packages[package.name] = (package_path, package)
+            if has_build_depend_on_message_generation(package) or package.name in message_package_whitelist:
+                if package_name_list:
+                    if package.name in package_name_list:
+                        message_packages[package.name] = (package_path, package)
+                else:
+                    message_packages[package.name] = (package_path, package)
+    # put into the correct form for sorting
+    # The following returns: A list of tuples containing the relative path and a ``Package`` object,
+    sorted_package_tuples = catkin_pkg.topological_order.topological_order_packages(
+                                packages=dict(message_packages.values()),
+                                whitelisted=None,
+                                blacklisted=None,
+                                underlay_packages=dict(all_packages.values()))
+    # print("%s" % [p.name for (unused_relative_path, p) in sorted_package_tuples])
+    return sorted_package_tuples
diff --git a/src/rosjava_build_tools/create_android_project.py b/src/rosjava_build_tools/create_android_project.py
index 1f273f8c488b9865025ccf8403d540bb2e15b291..d31d2dc28d794094cb3c5a679bc9022320b41711 100644
--- a/src/rosjava_build_tools/create_android_project.py
+++ b/src/rosjava_build_tools/create_android_project.py
@@ -28,10 +28,10 @@ def parse_arguments():
     parser.add_argument('name',
                         nargs=1,
                         help='The name for the package')
-    parser.add_argument('-s', '--sdk-version',
+    parser.add_argument('-t', '--target-version',
                         action='store',
-                        default='18.1.1',
-                        help='Android sdk version [18.1.1]')
+                        default='15',
+                        help='Android sdk version [15]')
     parser.add_argument('-p', '--android-package-name',
                         action='store',
                         default='com.github.rosjava.android.pkg_name',
@@ -46,27 +46,30 @@ def parse_arguments():
     return args
 
 
-def actually_create_android_project(package_name, sdk_version, java_package_name, is_library):
+def actually_create_android_project(package_name, target_version, java_package_name, is_library):
     path = os.path.join(os.getcwd(), package_name.lower())
     console.pretty_println("\nCreating android project ", console.bold)
     console.pretty_print("  Name      : ", console.cyan)
     console.pretty_println("%s" % package_name, console.yellow)
-    console.pretty_print("  Sdk Ver   : ", console.cyan)
-    console.pretty_println("%s" % sdk_version, console.yellow)
+    console.pretty_print("  Target Ver: ", console.cyan)
+    console.pretty_println("%s" % target_version, console.yellow)
     console.pretty_print("  Java Name : ", console.cyan)
     console.pretty_println("%s" % java_package_name, console.yellow)
     if is_library:
         console.pretty_print("  Library   : ", console.cyan)
         console.pretty_println("yes\n", console.yellow)
-        cmd = ['android', 'create', 'lib-project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + sdk_version, ]
+        cmd = ['android', 'create', 'lib-project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + target_version, ]
     else:
         activity_name = utils.camel_case(package_name)
         console.pretty_print("  Activity  : ", console.cyan)
         console.pretty_println("%s\n" % activity_name, console.yellow)
-        cmd = ['android', 'create', 'project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + sdk_version, '-a', activity_name]
+        cmd = ['android', 'create', 'project', '-n', package_name, '-p', path, '-k', java_package_name, '-t', 'android-' + target_version, '-a', activity_name]
+        print("Command: %s" % cmd)
     try:
         subprocess.check_call(cmd)
+        print("Command: %s" % cmd)
     except subprocess.CalledProcessError:
+        print("Error")
         raise subprocess.CalledProcessError("failed to create android project.")
     # This is in the old form, let's shovel the shit around to the new form
     utils.mkdir_p(os.path.join(path, 'src', 'main', 'java'))
@@ -97,7 +100,7 @@ def create_gradle_package_files(args, author, is_library, sdk_version):
     '''
       This is almost a direct copy from catkin_create_pkg.
     '''
-    plugin_name = "android-library" if is_library else "android"
+    plugin_name = "com.android.library" if is_library else "com.android.application"
     try:
         package_name = args.name[0].lower()
         package_path = os.path.abspath(os.path.join(os.getcwd(), package_name))
@@ -157,8 +160,8 @@ def extra_gradle_library_text():
 
 def create_android_project(is_library=False):
     args = parse_arguments()
-    actually_create_android_project(args.name[0], args.sdk_version, args.android_package_name, is_library)
-    create_gradle_package_files(args, args.author, is_library, args.sdk_version)
+    actually_create_android_project(args.name[0], args.target_version, args.android_package_name, is_library)
+    create_gradle_package_files(args, args.author, is_library, args.target_version)
     add_to_root_gradle_settings(args.name[0])
 
 ##############################################################################
diff --git a/src/rosjava_build_tools/create_rosjava_project.py b/src/rosjava_build_tools/create_rosjava_project.py
index 3acd167409713d57806371b2377e154ecedb3a85..ccbb7504486c81c14227edad1a946c19ae8b63c0 100644
--- a/src/rosjava_build_tools/create_rosjava_project.py
+++ b/src/rosjava_build_tools/create_rosjava_project.py
@@ -7,6 +7,7 @@
 from __future__ import print_function
 
 import os
+import re
 import sys
 import argparse
 import xml.etree.ElementTree as ElementTree
@@ -46,6 +47,10 @@ def instantiate_template(template, project_name, author):
     return template % locals()
 
 
+def instantiate_code_template(template, package_name, project_name, author):
+    return template % locals()
+
+
 def create_gradle_package_files(args, template_directory):
     '''
       This is almost a direct copy from catkin_create_pkg.
@@ -68,6 +73,27 @@ def create_gradle_package_files(args, template_directory):
         raise
 
 
+def create_talker_listener_classes(project_name, template_directory, author):
+    path = os.path.join(os.getcwd(), project_name.lower())
+    package_name = os.path.basename(os.getcwd())
+    java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name)
+    utils.mkdir_p(java_package_path)
+    try:
+        for template_name in ['Talker.java', 'Listener.java']:
+            filename = os.path.join(java_package_path, template_name)
+            template = utils.read_template_file(template_directory, template_name)
+            contents = instantiate_code_template(template, package_name, project_name, author)
+            try:
+                f = open(filename, 'w')
+                f.write(contents)
+                console.pretty_print('  File      : ', console.cyan)
+                console.pretty_println(template_name, console.yellow)
+            finally:
+                f.close()
+    except Exception:
+        raise
+
+
 def add_to_root_gradle_settings(name):
     '''
       Adds project name to the root level settings.gradle file.
@@ -126,12 +152,48 @@ def add_to_package_xml(name):
         package_xml.write(new_contents)
 
 
+def add_tasks_to_cmake_setup(tasks):
+    '''
+      Adds project name to build_depends in package.xml (should be same name as the ros msg package name).
+    '''
+    for rel_path in ['.', '..']:
+        cmakelists_txt_path = os.path.join(os.getcwd(), rel_path, 'CMakeLists.txt')
+        if os.path.isfile(cmakelists_txt_path):
+            break
+        else:
+            cmakelists_txt_path = None
+    if cmakelists_txt_path is None:
+        console.pretty_println("\nCouldn't find the root level CMakeLists.txt - not adding to the superproject.")
+        return
+    with open(cmakelists_txt_path, 'r') as cmakelists_txt:
+        old_contents = cmakelists_txt.read()
+        result = re.search('^catkin_rosjava_setup\(.*\)', old_contents, re.MULTILINE)
+        if result is None:
+            console.pretty_println("\nCouldn't find a catkin_rosjava_setup entry in the CMakeLists.txt - not adding tasks.")
+            return
+        rosjava_setup_string = result.group(0)
+        gradle_tasks = set([])
+        if rosjava_setup_string.find("publishMavenJavaPublicationToMavenRepository") == -1:
+            gradle_tasks.add("publishMavenJavaPublicationToMavenRepository")
+        if rosjava_setup_string.find("installApp") == -1:
+            gradle_tasks.add("installApp")
+        gradle_tasks |= set(tasks)
+        console.pretty_print('  File      : ', console.cyan)
+        console.pretty_println('CMakeLists.txt (gradle task update)', console.yellow)
+        old_text = rosjava_setup_string
+        new_text = 'catkin_rosjava_setup(' + ' '.join(gradle_tasks) + ')'
+        new_contents = old_contents.replace(old_text, new_text)
+    with open(cmakelists_txt_path, 'w') as cmakelists_txt:
+        cmakelists_txt.write(new_contents)
+
+
 def create_dummy_java_class(project_name):
     path = os.path.join(os.getcwd(), project_name.lower())
-    java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', 'rosjava', project_name)
+    package_name = os.path.basename(os.getcwd())
+    java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name)
     utils.mkdir_p(java_package_path)
     filename = os.path.join(java_package_path, 'Dude.java')
-    java_class = "package com.github.rosjava.%s.Dude;\n" % project_name
+    java_class = "package com.github.%s.%s;\n" % (package_name, project_name)
     java_class += "\n"
     java_class += "public class Dude {\n"
     java_class += "}\n"
@@ -170,12 +232,25 @@ def create_rosjava_project_common(args, template_directory):
 
 def create_rosjava_project():
     args = parse_arguments()
+    project_name = args.name[0]
+    author = args.author
     create_rosjava_project_common(args, 'rosjava_project')
-    create_dummy_java_class(args.name[0])
+    create_talker_listener_classes(project_name, 'rosjava_project', author)
+    add_tasks_to_cmake_setup(['installApp', 'publishMavenJavaPublicationToMavenRepository'])
+
+
+def create_rosjava_library_project():
+    args = parse_arguments()
+    project_name = args.name[0]
+    create_rosjava_project_common(args, 'rosjava_library_project')
+    create_dummy_java_class(project_name)
+    add_tasks_to_cmake_setup(['publishMavenJavaPublicationToMavenRepository'])
 
 
 def create_rosjava_msg_project():
     args = parse_arguments()
+    project_name = args.name[0]
     create_rosjava_project_common(args, 'rosjava_msg_project')
     add_catkin_generate_tree_command()
-    add_to_package_xml(args.name[0])
+    add_to_package_xml(project_name)
+    add_tasks_to_cmake_setup(['publishMavenJavaPublicationToMavenRepository'])
diff --git a/src/rosjava_build_tools/gradle/Readme.md b/src/rosjava_build_tools/gradle/Readme.md
index 61decdb579464cf7b9e9972864a15e9949ea99c7..8463db03187d3688be2aa58dea5276fa236f7e4e 100644
--- a/src/rosjava_build_tools/gradle/Readme.md
+++ b/src/rosjava_build_tools/gradle/Readme.md
@@ -1,3 +1,3 @@
 This is not installed, but it gets used to generate the gradle wrapper for a project.
 
-It is currently the gradle wrapper supporting gradle 1.7.
\ No newline at end of file
+It is currently the gradle wrapper supporting gradle 2.2.1
diff --git a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar
index b979729db0ad460288cfe16f07072da7b1305e93..3c7abdf12790879c06b07176de29647f77aa4129 100644
Binary files a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar and b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties
index 51678041070c14df3b19d1739e6a7e48759212af..1e1b11a32ede07b97b533af91a89f6f8546bec18 100644
--- a/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties
+++ b/src/rosjava_build_tools/gradle/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Oct 18 13:01:06 CEST 2013
+#Wed Feb 11 20:39:17 KST 2015
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.8-bin.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/src/rosjava_build_tools/release.py b/src/rosjava_build_tools/release.py
index f0778dd1bb30a427c4dd113d04439bf6d13ea053..8b4435cd4b411b0ff6f7f0cb6581ce13bc1d10d6 100644
--- a/src/rosjava_build_tools/release.py
+++ b/src/rosjava_build_tools/release.py
@@ -4,7 +4,9 @@
 # Imports
 ##############################################################################
 
-from rosinstall_generator.generator import ARG_ALL_PACKAGES, generate_rosinstall, sort_rosinstall
+import rosdistro
+import catkin_pkg
+from . import catkin
 
 ##############################################################################
 # Imports
@@ -12,22 +14,14 @@ from rosinstall_generator.generator import ARG_ALL_PACKAGES, generate_rosinstall
 
 
 def scrape_for_release_message_packages(track):
-    try:
-        # Should use ROS_DISTRO here, or some passed in value.
-        rosinstall_data = generate_rosinstall(track, [ARG_ALL_PACKAGES],
-            wet_only=True, dry_only=False
-            )
-    except RuntimeError as unused_e:
-        raise RuntimeError("error occured while scraping rosdistro for msg package naems and versions.")
-    rosinstall_data = sort_rosinstall(rosinstall_data)
-    #print("%s" % rosinstall_data)
+    url = rosdistro.get_index_url()
+    index = rosdistro.get_index(url)
+    cache = rosdistro.get_release_cache(index, 'kinetic')
     packages = []
-    for element in rosinstall_data:
-        for unused_key, value in element.items():
-            if "_msgs" in value['local-name'] or "_srvs" in value['local-name']:
-                name = value['local-name']
-                # bloom version is usually of the form: 'release/hydro/zeroconf_msgs/0.2.1-0'
-                version = value['version'].split('/')[-1].split('-')[0]
-                pkg = {'name': name, 'version': version}
-                packages.append(pkg)
+    for package_name, package_string in cache.package_xmls.iteritems():
+        package = catkin_pkg.package.parse_package_string(package_string)
+        #print("  Name: %s" % package_name)
+        #print("  Buildtool Depends %s" % package.build)
+        if catkin.has_build_depend_on_message_generation(package):
+            packages.append({'name': package_name, 'version': package.version})
     return packages
diff --git a/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in b/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in
index 46f3c06b34be0ff13066820851c4b13267832cd2..00803f3a5fdb45d50e128c2ecc055cdf77229010 100644
--- a/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in
+++ b/src/rosjava_build_tools/templates/android_package/CMakeLists.txt.in
@@ -11,6 +11,7 @@ project(%(repo_name)s)
 
 find_package(catkin REQUIRED rosjava_build_tools)
 # Set the gradle targets you want catkin's make to run by default
+# e.g. usually catkin_android_setup(assembleRelease uploadArchives)
 catkin_android_setup(assembleRelease uploadArchives)
 catkin_package()
 
@@ -19,8 +20,6 @@ catkin_package()
 # Installation
 ##############################################################################
 
-# If you are deploying android libraries (.aar's) uncomment this and
-# change this to match the maven group name you have specified in the 
-# allprojects closure the root build.gradle
-#install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ 
-#       DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME})
+# Deploy android libraries (.aar's) and applications (.apk's)
+install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ 
+       DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/)
diff --git a/src/rosjava_build_tools/templates/android_package/build.gradle.in b/src/rosjava_build_tools/templates/android_package/build.gradle.in
index 3ca8de49540720b5c21c8028f23892a0730b0f25..951a6d4c79d0be14ee9aae8000ec1cdf45d4cd90 100644
--- a/src/rosjava_build_tools/templates/android_package/build.gradle.in
+++ b/src/rosjava_build_tools/templates/android_package/build.gradle.in
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s
+ * Copyright (C) 2014 %(author)s
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -15,26 +15,11 @@
  */
 
 task wrapper(type: Wrapper) {
-    gradleVersion = '1.8'
+    gradleVersion = '2.2.1'
 }
 
 buildscript {
-    def rosMavenPath = "$System.env.ROS_MAVEN_PATH".split(':').collect { 'file://' + it }
-    def rosMavenRepository = "$System.env.ROS_MAVEN_REPOSITORY"
-    repositories {
-        rosMavenPath.each { p ->
-            maven {
-                url p
-            }
-        }
-        mavenLocal()
-        maven {
-            url rosMavenRepository
-        }
-    }
-    dependencies {
-        classpath group: 'org.ros.rosjava_bootstrap', name: 'gradle_plugins', version: '[0.2,0.3)'
-    }
+    apply from: "https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle"
 }
 
 apply plugin: 'catkin'
@@ -47,7 +32,32 @@ allprojects {
 }
 
 subprojects {
-    /* See https://github.com/rosjava/rosjava_bootstrap (look for gradle_plugins)
-       to see what is going on under the hood. */
+    /*
+     * The android plugin configures a few things:
+     *
+     *  - local deployment repository : where it dumps the jars and packaged artifacts)
+     *  - local maven repositories    : where it finds your locally installed/built artifacts)
+     *  - external maven repositories : where it goes looking if it can't find dependencies locally
+     *  - android build tools version : which version we use across the board
+     *
+     * To modify, or add repos to the default external maven repositories list, pull request against this code:
+     *
+     *   https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosPlugin.groovy#L31
+     *
+     * To modify the build tools version, pull request against this code:
+     *
+     *   https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosAndroid.groovy#L14
+     */
     apply plugin: 'ros-android'
+
+    afterEvaluate { project ->
+        android {
+            // Exclude a few files that are duplicated across our dependencies and
+            // prevent packaging Android applications.
+            packagingOptions {
+                exclude "META-INF/LICENSE.txt"
+                exclude "META-INF/NOTICE.txt"
+            }
+        }
+    }
 }
diff --git a/src/rosjava_build_tools/templates/android_package/settings.gradle b/src/rosjava_build_tools/templates/android_package/settings.gradle
index 00841924d83ea9d3bf07fc35858bdce88e7c4733..f8618db1853eb6742ea75293e5b575c396dc40ed 100644
--- a/src/rosjava_build_tools/templates/android_package/settings.gradle
+++ b/src/rosjava_build_tools/templates/android_package/settings.gradle
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s
+ * Copyright (C) 2014 %(author)s
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/rosjava_build_tools/templates/android_project/build.gradle.in b/src/rosjava_build_tools/templates/android_project/build.gradle.in
index b465ae2510816cdc960afc25fca1f4fbaa60c4c3..ab7998e6789ab3bda3dbcf59aacea4966f616f1e 100644
--- a/src/rosjava_build_tools/templates/android_project/build.gradle.in
+++ b/src/rosjava_build_tools/templates/android_project/build.gradle.in
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s.
+ * Copyright (C) 2014 %(author)s.
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -14,29 +14,37 @@
  * the License.
  */
 
-/* 
- Examples of 
+/*
+ Examples of
    1) dependencies from another project in this gradle stack.
    2,3) open ranged dependencies from a maven repository.
-   
+
    It's a good idea to use open ranges on to
    save continually updating these references, but it is recommended
-   to restrict this to the patch version number (e.g. [0.2,0.3) will
-   get the latest 0.2.x version) to avoid unknowingly
+   to restrict this to the patch version number (e.g. [0.3,0.4) will
+   get the latest 0.3.x version) to avoid unknowingly
    having api breaking changes usually associated with minor and major
    version number changes.
 */
-/* 
+/*
 dependencies {
   compile project(':local_android_library_dependency')
-  compile 'org.ros.android_core:android_10:[0.2,0.3)'
-  compile 'com.github.ros_java.android_extras:gingerbread:[0.2,0.3)'
+  compile 'org.ros.android_core:android_10:[0.3,0.4)'
+  compile 'org.ros.android_core:android_15:[0.3,0.4)'
+  compile 'com.github.rosjava.android_extras:gingerbread:[0.3,0.4)'
+  compile 'org.ros.rosjava_messages:tf2_msgs:[0.5,0.6)'
 }
 */
 
 apply plugin: '%(plugin_name)s'
 
 android {
-    compileSdkVersion %(sdk_version)s
+  compileSdkVersion %(sdk_version)s
+  defaultConfig {
+    minSdkVersion %(sdk_version)s
+    targetSdkVersion %(sdk_version)s
+    versionCode 1
+    versionName "1.0"
+  }
 }
- 
+
diff --git a/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in
new file mode 100644
index 0000000000000000000000000000000000000000..16f77ab77c16f6a3994a1d945abe4a6be5fe7bdb
--- /dev/null
+++ b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 %(author)s.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/* 
+ Dependencies can be on external maven artifacts (such as rosjava_core
+ here) or on sibling subprojects. Fpr external maven artifact dependencies
+ it's convenient to use an open ranged dependency, but restrict it to
+ cover the patch version only to avoid breakages due to api changes
+ which usually occur on minor and major version numbers.
+*/
+
+dependencies {
+  /* Example of an external maven artifact dependency */
+  /* compile 'org.ros.rosjava_core:rosjava:[0.2,)' */
+  /* Example of a local subproject dependency */ 
+  /* compile project(':sibling_gradle_project') */
+}
+
diff --git a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in
index d2efc9c870c6dbb92279b411b10a629c81b1911c..5d4f66a0433ac2f74ec89af5bfd9a2bd39ae60ff 100644
--- a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in
+++ b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s.
+ * Copyright (C) 2014 %(author)s.
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -15,8 +15,7 @@
  */
 
 try {
-    project.catkin.tree.pkgs['%(project_name)s'].generateUnofficialMessageArtifact(project)
+    project.catkin.tree.generateMessageArtifact(project, '%(project_name)s')
 } catch (NullPointerException e) {
     println("Couldn't find %(project_name)s on the ROS_PACKAGE_PATH")
 }
-
diff --git a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in
index 651b6a0b5baa158951c72a37eb0238d98f0b5f3d..78952fc9aadeb488a0543b6bfc3cdd87811d8682 100644
--- a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in
+++ b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in
@@ -10,15 +10,20 @@ project(%(repo_name)s)
 ##############################################################################
 
 find_package(catkin REQUIRED rosjava_build_tools)
-# Set the gradle targets you want catkin's make to run by default
-catkin_android_setup(uploadArchives)
+
+# Set the gradle targets you want catkin's make to run by default, e.g.
+#   catkin_rosjava_setup(installApp)
+# Note that the catkin_create_rosjava_xxx scripts will usually automatically
+# add tasks to this for you when you create subprojects.
+catkin_rosjava_setup()
+
 catkin_package()
 
 ##############################################################################
 # Installation
 ##############################################################################
 
-# Change this to match the maven group name you have specified in the 
+# Change this to match the maven group name you have specified in the
 # allprojects closure the root build.gradle
-install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/ 
+install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME}/
         DESTINATION ${CATKIN_GLOBAL_MAVEN_DESTINATION}/com/github/rosjava/${PROJECT_NAME})
diff --git a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in
index d1237536fa73bbcaba1b725e4637f9ede8ba9b45..f709c4a96d1284e2489100dbc1be6dcaeacb88f0 100644
--- a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in
+++ b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s
+ * Copyright (C) 2014 %(author)s
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -15,26 +15,11 @@
  */
 
 task wrapper(type: Wrapper) {
-    gradleVersion = '1.8'
+    gradleVersion = '2.2.1'
 }
 
 buildscript {
-    def rosMavenPath = "$System.env.ROS_MAVEN_PATH".split(':').collect { 'file://' + it }
-    def rosMavenRepository = "$System.env.ROS_MAVEN_REPOSITORY"
-    repositories {
-        rosMavenPath.each { p ->
-            maven {
-                url p
-            }
-        }
-        mavenLocal()
-        maven {
-            url rosMavenRepository
-        }
-    }
-    dependencies {
-        classpath group: 'org.ros.rosjava_bootstrap', name: 'gradle_plugins', version: '[0.2,0.3)'
-    }
+  apply from: "https://github.com/rosjava/rosjava_bootstrap/raw/kinetic/buildscript.gradle"
 }
 
 apply plugin: 'catkin'
@@ -51,16 +36,34 @@ allprojects {
 
 subprojects {
     /*
-      See https://github.com/rosjava/rosjava_bootstrap (look for gradle_plugins)
-      to see what is going on under the hood.
-    */
-    apply plugin: 'ros'
+     * The ros-java plugin configures a few things:
+     *
+     *  - local deployment repository : where it dumps the jars and packaged artifacts)
+     *  - local maven repositories    : where it finds your locally installed/built artifacts)
+     *  - external maven repositories : where it goes looking if it can't find dependencies locally
+     *
+     * To modify, or add repos to the default external maven repositories list, pull request against this code:
+     *
+     *   https://github.com/rosjava/rosjava_bootstrap/blob/kinetic/gradle_plugins/src/main/groovy/org/ros/gradle_plugins/RosPlugin.groovy#L31
+     */
+    apply plugin: "ros-java"
+    /*
+     * Some IDE support if you use it.
+     */
+    /* apply plugin: "eclipse" */
+    /* apply plugin: "idea"    */
 }
 
 /*
   Some useful tasks:
+
     install: deploys jar's to MavenLocal() (i.e. ~/.m2/repository)
     uploadArchives : deploys jar's to devel/share/maven
     installApp : assembles java apps in the _subproject_/build directories.
+
+  Note that these are dependent on the type of project (e.g. installApp is only valid for
+  java binary subprojects, while publishMavenJav... is only added once a subproject is included.
+  If you're using catkin_make, this is not important, since it will use the task list specified
+  in CMakeLists.txt
 */
-defaultTasks 'install'
+defaultTasks 'tasks'
diff --git a/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in
new file mode 100644
index 0000000000000000000000000000000000000000..29bf303e2c02b6274304f7cec94074ef59e4117f
--- /dev/null
+++ b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2014 %(author)s.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.github.rosjava.%(package_name)s.%(project_name)s;
+
+import org.apache.commons.logging.Log;
+import org.ros.message.MessageListener;
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import org.ros.node.NodeMain;
+import org.ros.node.topic.Subscriber;
+
+/**
+ * A simple {@link Subscriber} {@link NodeMain}.
+ */
+public class Listener extends AbstractNodeMain {
+
+  @Override
+  public GraphName getDefaultNodeName() {
+    return GraphName.of("rosjava/listener");
+  }
+
+  @Override
+  public void onStart(ConnectedNode connectedNode) {
+    final Log log = connectedNode.getLog();
+    Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE);
+    subscriber.addMessageListener(new MessageListener<std_msgs.String>() {
+      @Override
+      public void onNewMessage(std_msgs.String message) {
+        log.info("I heard: \"" + message.getData() + "\"");
+      }
+    });
+  }
+}
diff --git a/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in
new file mode 100644
index 0000000000000000000000000000000000000000..1ff54bbf758e1bba247083b724b9d07db99b6cd4
--- /dev/null
+++ b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2014 %(author)s.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.github.rosjava.%(package_name)s.%(project_name)s;
+
+import org.ros.concurrent.CancellableLoop;
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import org.ros.node.NodeMain;
+import org.ros.node.topic.Publisher;
+
+/**
+ * A simple {@link Publisher} {@link NodeMain}.
+ */
+public class Talker extends AbstractNodeMain {
+
+  @Override
+  public GraphName getDefaultNodeName() {
+    return GraphName.of("rosjava/talker");
+  }
+
+  @Override
+  public void onStart(final ConnectedNode connectedNode) {
+    final Publisher<std_msgs.String> publisher =
+        connectedNode.newPublisher("chatter", std_msgs.String._TYPE);
+    // This CancellableLoop will be canceled automatically when the node shuts
+    // down.
+    connectedNode.executeCancellableLoop(new CancellableLoop() {
+      private int sequenceNumber;
+
+      @Override
+      protected void setup() {
+        sequenceNumber = 0;
+      }
+
+      @Override
+      protected void loop() throws InterruptedException {
+        std_msgs.String str = publisher.newMessage();
+        str.setData("Hello world! " + sequenceNumber);
+        publisher.publish(str);
+        sequenceNumber++;
+        Thread.sleep(1000);
+      }
+    });
+  }
+}
diff --git a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in
index b1a1bea4a041d25d46d0e2c904203d369cfaf651..6fbec4f1d7e0f5cf4f6efaa3ae0c7466c10a5d8e 100644
--- a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in
+++ b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 %(author)s.
+ * Copyright (C) 2014 %(author)s.
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -14,23 +14,29 @@
  * the License.
  */
 
-/* 
- Examples of 
+/* This plugin is necessary for creating installApp tasks (i.e. executables) */
+apply plugin: 'application'
+mainClassName = 'org.ros.RosRun'
+
+/*
+ Examples of
    1) dependencies from another project in this gradle stack.
    2,3) open ranged dependencies from a maven repository.
-   
-   It's a good idea to use open ranges on to
+
+   Dependencies can be on external maven artifacts (such as rosjava_core
+   here) or on sibling subprojects. For rosjava maven artifact dependencies
+   it is a good idea to use open ranges on to
    save continually updating these references, but it is recommended
-   to restrict this to the patch version number (e.g. [0.2,0.3) will
-   get the latest 0.2.x version) to avoid unknowingly
+   to restrict this to the patch version number (e.g. [0.3,0.4) will
+   get the latest 0.3.x version) to avoid unknowingly
    having api breaking changes usually associated with minor and major
    version number changes.
 */
-/* 
+
 dependencies {
-  compile project(':local_android_library_dependency')
-  compile 'org.ros.rosjava_core:rosjava:[0.2,0.3)'
-  compile 'com.github.rosjava.rosjava_extras:hokuyo:[0.2,0.3)'
+  /* An external maven artifact dependency */
+  compile 'org.ros.rosjava_core:rosjava:[0.3,0.4)'
+  /* Example of a local subproject dependency */
+  /* compile project(':sibling_gradle_project') */
 }
-*/