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 81386cebdce2df3b5b4010a2295c7b1894906e83..9dbe40899abe8c448ab6ba3fb0eea6f00f655899 100644
--- a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java
+++ b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java
@@ -39,6 +39,8 @@ import org.ros.internal.node.service.ServiceDeclaration;
 import org.ros.internal.node.service.ServiceFactory;
 import org.ros.internal.node.service.ServiceIdentifier;
 import org.ros.internal.node.service.ServiceManager;
+import org.ros.internal.node.topic.DefaultPublisher;
+import org.ros.internal.node.topic.DefaultSubscriber;
 import org.ros.internal.node.topic.PublisherFactory;
 import org.ros.internal.node.topic.SubscriberFactory;
 import org.ros.internal.node.topic.TopicDeclaration;
@@ -403,11 +405,13 @@ public class DefaultNode implements ConnectedNode {
     // NOTE(damonkohler): We don't want to raise potentially spurious
     // exceptions during shutdown that would interrupt the process. This is
     // simply best effort cleanup.
-    for (Publisher<?> publisher : topicParticipantManager.getPublishers()) {
+    for (DefaultPublisher<?> publisher : topicParticipantManager.getPublishers()) {
       publisher.shutdown();
+      topicParticipantManager.removePublisher(publisher);
     }
-    for (Subscriber<?> subscriber : topicParticipantManager.getSubscribers()) {
+    for (DefaultSubscriber<?> subscriber : topicParticipantManager.getSubscribers()) {
       subscriber.shutdown();
+      topicParticipantManager.removeSubscriber(subscriber);
     }
     for (ServiceServer<?, ?> serviceServer : serviceManager.getServers()) {
       try {
diff --git a/rosjava/src/main/java/org/ros/internal/node/topic/DefaultPublisher.java b/rosjava/src/main/java/org/ros/internal/node/topic/DefaultPublisher.java
index b27a260e550979f19decc36ebe327cb3bafc2750..c69ef3dd3e367e55f52571e019aa10cd9488157b 100644
--- a/rosjava/src/main/java/org/ros/internal/node/topic/DefaultPublisher.java
+++ b/rosjava/src/main/java/org/ros/internal/node/topic/DefaultPublisher.java
@@ -109,6 +109,7 @@ public class DefaultPublisher<T> extends DefaultTopicParticipant implements Publ
   public void shutdown(long timeout, TimeUnit unit) {
     signalOnShutdown(timeout, unit);
     outgoingMessageQueue.shutdown();
+    listeners.shutdown();
   }
 
   @Override