diff --git a/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java b/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java
index 428d92569f663b17eecd4533a875c41b840d58f6..83985f6f56c300f3d577660edd4163c6c527eded 100644
--- a/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java
+++ b/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java
@@ -42,4 +42,9 @@ public class EventDispatcher<T> extends CancellableLoop {
     SignalRunnable<T> signalRunnable = events.takeFirst();
     signalRunnable.run(listener);
   }
+
+  public T getListener()
+  {
+    return listener;
+  }
 }
\ No newline at end of file
diff --git a/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java b/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java
index ae7deb385398680b35b8226edc22f48d40683d1d..29a8ccb2ca79807dd03913549ae2adc34dae7d81 100644
--- a/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java
+++ b/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java
@@ -101,6 +101,25 @@ public class ListenerGroup<T> {
     return addAll(listeners, DEFAULT_QUEUE_CAPACITY);
   }
 
+  /**
+   * Removes and cancels the {@EventDispatcher} specified by the listener
+   * from the {@link ListenerGroup}.
+   * @param listener the listener to remove
+   * @return flag indicating successful removal
+     */
+  public boolean remove(T listener)
+  {
+    for (EventDispatcher<T> eventDispatcher : eventDispatchers) {
+      if(listener.equals(eventDispatcher.getListener()))
+      {
+        eventDispatcher.cancel();
+        eventDispatchers.remove(eventDispatcher);
+        return true;
+      }
+    }
+    return false;
+  }
+
   /**
    * @return the number of listeners in the group
    */
@@ -151,5 +170,6 @@ public class ListenerGroup<T> {
     for (EventDispatcher<T> eventDispatcher : eventDispatchers) {
       eventDispatcher.cancel();
     }
+    eventDispatchers.clear();
   }
 }
diff --git a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java
index ec36395577c02387a108e9857e367d30f0b822b4..81386cebdce2df3b5b4010a2295c7b1894906e83 100644
--- a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java
+++ b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java
@@ -493,6 +493,11 @@ public class DefaultNode implements ConnectedNode {
     });
   }
 
+  @Override
+  public void removeListeners() {
+    nodeListeners.shutdown();
+  }
+
   /**
    * SignalRunnable all {@link NodeListener}s that the {@link Node} has started.
    * <p>
diff --git a/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java b/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java
index 96d75754fca8c853c50b83a82f10a0671cdf9982..7ae607469d43dcbcd46cf5f3045746a87dec707d 100644
--- a/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java
+++ b/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java
@@ -213,6 +213,7 @@ public class DefaultNodeMainExecutor implements NodeMainExecutor {
    *          the {@link Node} to unregister
    */
   private void unregisterNode(Node node) {
+    node.removeListeners();
     connectedNodes.get(node.getName()).remove(node);
     nodeMains.remove(node);
   }
diff --git a/rosjava/src/main/java/org/ros/node/Node.java b/rosjava/src/main/java/org/ros/node/Node.java
index ea88d76816737c8723466d77be342eebe2024e1f..9e47943c40a0dba91ea2896c4268b4f9cb81dd3d 100644
--- a/rosjava/src/main/java/org/ros/node/Node.java
+++ b/rosjava/src/main/java/org/ros/node/Node.java
@@ -126,4 +126,10 @@ public interface Node {
    * Shut the node down.
    */
   void shutdown();
+
+  /**
+   * Stops and Clears node listeners.
+   */
+
+  void removeListeners();
 }