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 f197cf31b62ac72598e7d38eecabd80cbc9c6ded..d18d14fdbe5737783e0c0e5ab2cc135d728813f7 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
@@ -7,22 +7,41 @@ import org.ros.node.ConnectedNode;
 import org.ros.node.topic.Subscriber;
 import org.ros.node.topic.Publisher;
 import org.ros.message.MessageListener;
+import org.ros.internal.message.Message;
 
-public class ActionClient extends AbstractNodeMain {
-  //actionlib_tutorials.FibonacciActionGoal actionGoal;
-  Publisher<actionlib_tutorials.FibonacciActionGoal> clientGoal;
+public class ActionClient<T_ACTION_GOAL extends Message> {
+  T_ACTION_GOAL actionGoal;
+  String actionGoalType;
+  Publisher<T_ACTION_GOAL> goalPublisher;
   //Publisher<actionlib_msgs.cancel> clientCancel;
   //Suscriber<actionlib_msgs.status> serverStatus;
   Subscriber<actionlib_tutorials.FibonacciActionResult> serverResult;
   //Suscriber<actionlib_tutorials.FibonacciActionFeedback> serverFeedback;
+  ConnectedNode node;
+  String actionName;
+
+  ActionClient (ConnectedNode node, String actionName, String actionGoalType) {
+    this.node = node;
+    this.actionName = actionName;
+    this.actionGoalType = actionGoalType;
+    publishClient(node);
+  }
+
+  void sendGoal(T_ACTION_GOAL goal) {
+    goalPublisher.publish(goal);
+  }
 
   private void publishClient(ConnectedNode node) {
-    clientGoal = node.newPublisher("fibonacci/goal",
-      actionlib_tutorials.FibonacciActionGoal._TYPE);
+    goalPublisher = node.newPublisher(actionName + "/goal",
+      actionGoalType);
     //clientCancel = connectedNode.newPublisher("fibonacci/cancel",
     //  actionlib_msgs.cancel._TYPE);
   }
 
+  public T_ACTION_GOAL newGoalMessage() {
+    return goalPublisher.newMessage();
+  }
+
   private void suscribeServer(ConnectedNode node) {
     serverResult = node.newSubscriber("fibonacci/result",
       actionlib_tutorials.FibonacciActionResult._TYPE);
@@ -59,32 +78,4 @@ public class ActionClient extends AbstractNodeMain {
     //suscribeServer(node);
   }
 
-  @Override
-  public GraphName getDefaultNodeName() {
-      return GraphName.of("fibonacci_client");
-    }
-
-    @Override
-    public void onStart(ConnectedNode node) {
-      connect(node);
-
-      suscribeServer(node);
-
-      // publish a goal message
-      actionlib_tutorials.FibonacciActionGoal goalMessage = clientGoal.newMessage();
-      actionlib_tutorials.FibonacciGoal fibonacciGoal = goalMessage.getGoal();
-      // set Fibonacci parameter
-      fibonacciGoal.setOrder(6);
-      goalMessage.setGoal(fibonacciGoal);
-
-      while (true) {
-        clientGoal.publish(goalMessage);
-        try {
-          Thread.sleep(10000);
-        }
-        catch (InterruptedException ex) {
-          ;
-        }
-      }
-    }
 }