diff --git a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClient.java b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClient.java
index 22642d2c418c927a4d407b89f52d6c88a26e31f1..db586149532251cd403cd4b8d1975d56c725e622 100644
--- a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClient.java
+++ b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClient.java
@@ -8,6 +8,7 @@ import org.ros.node.topic.Subscriber;
 import org.ros.node.topic.Publisher;
 import org.ros.message.MessageListener;
 import org.ros.internal.message.Message;
+import java.util.concurrent.TimeUnit;
 
 public class ActionClient<T_ACTION_GOAL extends Message,
   T_ACTION_FEEDBACK extends Message,
@@ -17,12 +18,12 @@ public class ActionClient<T_ACTION_GOAL extends Message,
   String actionGoalType;
   String actionResultType;
   String actionFeedbackType;
-  Publisher<T_ACTION_GOAL> goalPublisher;
+  Publisher<T_ACTION_GOAL> goalPublisher = null;
   //Publisher<actionlib_msgs.cancel> clientCancel;
   //Suscriber<actionlib_msgs.status> serverStatus;
-  Subscriber<T_ACTION_RESULT> serverResult;
-  Subscriber<T_ACTION_FEEDBACK> serverFeedback;
-  ConnectedNode node;
+  Subscriber<T_ACTION_RESULT> serverResult = null;
+  Subscriber<T_ACTION_FEEDBACK> serverFeedback = null;
+  ConnectedNode node = null;
   String actionName;
   ActionClientListener callbackTarget = null;
 
@@ -51,6 +52,12 @@ public class ActionClient<T_ACTION_GOAL extends Message,
     //  actionlib_msgs.cancel._TYPE);
   }
 
+  private void unpublishClient() {
+    if (goalPublisher != null) {
+      goalPublisher.shutdown(5, TimeUnit.SECONDS);
+    }
+  }
+
   public T_ACTION_GOAL newGoalMessage() {
     return goalPublisher.newMessage();
   }
@@ -86,6 +93,15 @@ public class ActionClient<T_ACTION_GOAL extends Message,
       actionlib_tutorials.FibonacciActionFeedback._TYPE);*/
   }
 
+  private void unsubscribeToServer() {
+    if (serverFeedback != null) {
+      serverFeedback.shutdown(5, TimeUnit.SECONDS);
+    }
+    if (serverResult != null) {
+      serverResult.shutdown(5, TimeUnit.SECONDS);
+    }
+  }
+
   public void gotResult(T_ACTION_RESULT message) {
     // Propagate the callback
     if (callbackTarget != null) {
@@ -108,4 +124,12 @@ public class ActionClient<T_ACTION_GOAL extends Message,
     subscribeToServer(node);
   }
 
+  /**
+   * Finish the action client. Unregister publishers and listeners.
+   */
+  public void finish() {
+    callbackTarget = null;
+    unpublishClient();
+    unsubscribeToServer();
+  }
 }