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 cd69b55091aafd5e75c440c0223b6131b5387511..1516857ceef94978aebaa1bd9be99a913c5ed83f 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
@@ -10,6 +10,7 @@ import org.ros.message.MessageListener;
 import org.ros.internal.message.Message;
 import java.util.concurrent.TimeUnit;
 import actionlib_msgs.GoalStatusArray;
+import actionlib_msgs.GoalID;
 
 public class ActionClient<T_ACTION_GOAL extends Message,
   T_ACTION_FEEDBACK extends Message,
@@ -20,8 +21,7 @@ public class ActionClient<T_ACTION_GOAL extends Message,
   String actionResultType;
   String actionFeedbackType;
   Publisher<T_ACTION_GOAL> goalPublisher = null;
-  //Publisher<actionlib_msgs.cancel> clientCancel;
-  //Suscriber<actionlib_msgs.status> serverStatus;
+  Publisher<GoalID> cancelPublisher = null;
   Subscriber<T_ACTION_RESULT> serverResult = null;
   Subscriber<T_ACTION_FEEDBACK> serverFeedback = null;
   Subscriber<GoalStatusArray> serverStatus = null;
@@ -48,15 +48,23 @@ public class ActionClient<T_ACTION_GOAL extends Message,
     goalPublisher.publish(goal);
   }
 
+  public void sendCancel(GoalID id) {
+    cancelPublisher.publish(id);
+  }
+
   private void publishClient(ConnectedNode node) {
     goalPublisher = node.newPublisher(actionName + "/goal", actionGoalType);
-    //clientCancel = connectedNode.newPublisher("fibonacci/cancel",
-    //  actionlib_msgs.cancel._TYPE);
+    cancelPublisher = node.newPublisher(actionName + "/cancel", GoalID._TYPE);
   }
 
   private void unpublishClient() {
     if (goalPublisher != null) {
       goalPublisher.shutdown(5, TimeUnit.SECONDS);
+      goalPublisher = null;
+    }
+    if (cancelPublisher != null) {
+      cancelPublisher.shutdown(5, TimeUnit.SECONDS);
+      cancelPublisher = null;
     }
   }
 
@@ -89,22 +97,20 @@ public class ActionClient<T_ACTION_GOAL extends Message,
         gotStatus(message);
       }
     });
-
-    /*serverStatus = node.newSubscriber("fibonacci/status",
-      actionlib_msgs.status._TYPE);
-    serverFeedback = node.newSubscriber("fibonacci/feedback",
-      actionlib_tutorials.FibonacciActionFeedback._TYPE);*/
   }
 
   private void unsubscribeToServer() {
     if (serverFeedback != null) {
       serverFeedback.shutdown(5, TimeUnit.SECONDS);
+      serverFeedback = null;
     }
     if (serverResult != null) {
       serverResult.shutdown(5, TimeUnit.SECONDS);
+      serverResult = null;
     }
     if (serverStatus != null) {
       serverStatus.shutdown(5, TimeUnit.SECONDS);
+      serverStatus = null;
     }
   }
 
diff --git a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/TestClient.java b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/TestClient.java
index 08db54b0344e218615e16cdd174d9e91e5041048..d27aa704af5904ba5b696e84305318167ad591cd 100644
--- a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/TestClient.java
+++ b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/TestClient.java
@@ -38,10 +38,10 @@ public class TestClient extends AbstractNodeMain implements ActionClientListener
     goalMessage.setGoal(fibonacciGoal);
 
     while (repeat > 0) {
+      sleep(10000);
       System.out.println("Sending goal #" + repeat + "...");
       ac.sendGoal(goalMessage);
       System.out.println("Goal sent.");
-      sleep(10000);
       //while(!resultReceived) sleep(100);
       resultReceived = false;
       repeat--;