diff --git a/scripts/catkin_create_rosjava_library_project b/scripts/catkin_create_rosjava_library_project
new file mode 100755
index 0000000000000000000000000000000000000000..dcc1d8960a83486269c0e722e495853ed99e2dbb
--- /dev/null
+++ b/scripts/catkin_create_rosjava_library_project
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+"""This script creates the skeleton of a rosjava library project"""
+
+##############################################################################
+# Imports
+##############################################################################
+
+from __future__ import print_function
+import sys
+
+from rosjava_build_tools import create_rosjava_library_project
+import rosjava_build_tools.console as console
+
+##############################################################################
+# Main
+##############################################################################
+
+if __name__ == "__main__":
+    try:
+        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_msg_project b/scripts/catkin_create_rosjava_msg_project
index afedb840c9ff6c0d9a1b6ef2ba31c20b9046ee43..30cb5962efcd9438b7f1b703186fde297472c247 100755
--- a/scripts/catkin_create_rosjava_msg_project
+++ b/scripts/catkin_create_rosjava_msg_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 message project"""
 
 ##############################################################################
 # Imports
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..56f6f354b5230fc1b593bbdb1985ea72588ffdef 100644
--- a/setup.py
+++ b/setup.py
@@ -11,11 +11,13 @@ d = generate_distutils_setup(
              'scripts/catkin_create_android_library_project',
              'scripts/catkin_create_rosjava_pkg',
              'scripts/catkin_create_rosjava_project',
+             'scripts/catkin_create_rosjava_library_project',
              'scripts/catkin_create_rosjava_msg_project',
             ],
     package_data = {'rosjava_build_tools': [
            'templates/android_package/*',
            'templates/android_project/*',
+           'templates/rosjava_library_project/*',
            'templates/rosjava_msg_project/*',
            'templates/rosjava_package/*',
            'templates/rosjava_project/*',
diff --git a/src/rosjava_build_tools/__init__.py b/src/rosjava_build_tools/__init__.py
index 1b912767d5c0cc4cc684f798e58e327112eac0e4..736d86c99737f8789ad8253529b4ba174cbee618 100644
--- a/src/rosjava_build_tools/__init__.py
+++ b/src/rosjava_build_tools/__init__.py
@@ -7,6 +7,6 @@
 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
diff --git a/src/rosjava_build_tools/create_rosjava_project.py b/src/rosjava_build_tools/create_rosjava_project.py
index 3acd167409713d57806371b2377e154ecedb3a85..bf0acf294c685cc8b8d173c322e33f103f1d6520 100644
--- a/src/rosjava_build_tools/create_rosjava_project.py
+++ b/src/rosjava_build_tools/create_rosjava_project.py
@@ -46,6 +46,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 +72,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,9 +151,33 @@ def add_to_package_xml(name):
         package_xml.write(new_contents)
 
 
+def add_install_app_to_cmake_targets():
+    '''
+      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:
+        console.pretty_print('  File      : ', console.cyan)
+        console.pretty_println('CMakeLists.txt (gradle task update)', console.yellow)
+        old_text = 'catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository)'
+        new_text = 'catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository installApp)'
+        new_contents = cmakelists_txt.read().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
@@ -170,12 +219,23 @@ 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_install_app_to_cmake_targets()
+
+
+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)
 
 
 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)
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 09cc556c18eac1a48c5976457779ab118ed8a819..32a05320fb1285b4c17bc437236cc882d8e24cfc 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
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 d2da1a7ec0d17f42751985dddccf219233c3fd07..e7e6326bb4e582c6e0a3e5e40648d64af8a5bdf4 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
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..f76d5d9ce63f28d7fab08bd85a2f9a47a133c22c
--- /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.1,)' */
+  /* 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 d13df141ba2b8d7caa56eebb703290db7b3b4bfb..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
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 ab5fa4b8ce45e2c604255e3068cb037ef42f639b..996231d7dacea630cdb4ae56f87b2230fe953500 100644
--- a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in
+++ b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in
@@ -11,7 +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
-catkin_android_setup(publishMavenJavaPublicationToMavenRepository)
+catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository)
 catkin_package()
 
 ##############################################################################
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 090aace20d346f3aa07cf9b5d09a10f06b80b8e4..a93ab9775f4a54063e4394140db52fe5b5991688 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
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..6875a6d045e503949de55bd20aed53e91e9ce3fe
--- /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.%(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..3522a9f0cd73f57a50709be7d69777455f3fa322
--- /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.%(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 3c7f00497e301707edce518225930a2c8244ad0e..1349e7ee46d030f13f5ea62e098614a3beac1be6 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,20 +14,22 @@
  * the License.
  */
 
+/* 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 restrict the open ranged dependency to
-   the patch version to avoid breakages due to api changes
-   which usually occur on minor and major version numbers.
+ 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 {
-  compile project(':local_android_library_dependency')
+  /* An external maven artifact dependency */
   compile 'org.ros.rosjava_core:rosjava:[0.1,)'
-  compile 'com.github.rosjava.rosjava_extras:hokuyo:[0.1,0.2)'
+  /* Example of a local subproject dependency */ 
+  /* compile project(':sibling_gradle_project') */
 }
-*/