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 d18d14fdbe5737783e0c0e5ab2cc135d728813f7..22642d2c418c927a4d407b89f52d6c88a26e31f1 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
@@ -9,31 +9,44 @@ import org.ros.node.topic.Publisher;
 import org.ros.message.MessageListener;
 import org.ros.internal.message.Message;
 
-public class ActionClient<T_ACTION_GOAL extends Message> {
+public class ActionClient<T_ACTION_GOAL extends Message,
+  T_ACTION_FEEDBACK extends Message,
+  T_ACTION_RESULT extends Message> {
+
   T_ACTION_GOAL actionGoal;
   String actionGoalType;
+  String actionResultType;
+  String actionFeedbackType;
   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;
+  Subscriber<T_ACTION_RESULT> serverResult;
+  Subscriber<T_ACTION_FEEDBACK> serverFeedback;
   ConnectedNode node;
   String actionName;
+  ActionClientListener callbackTarget = null;
 
-  ActionClient (ConnectedNode node, String actionName, String actionGoalType) {
+  ActionClient (ConnectedNode node, String actionName, String actionGoalType,
+    String actionFeedbackType, String actionResultType) {
     this.node = node;
     this.actionName = actionName;
     this.actionGoalType = actionGoalType;
-    publishClient(node);
+    this.actionFeedbackType = actionFeedbackType;
+    this.actionResultType = actionResultType;
+
+    connect(node);
+  }
+
+  public void attachListener(ActionClientListener target) {
+    callbackTarget = target;
   }
 
-  void sendGoal(T_ACTION_GOAL goal) {
+  public void sendGoal(T_ACTION_GOAL goal) {
     goalPublisher.publish(goal);
   }
 
   private void publishClient(ConnectedNode node) {
-    goalPublisher = node.newPublisher(actionName + "/goal",
-      actionGoalType);
+    goalPublisher = node.newPublisher(actionName + "/goal", actionGoalType);
     //clientCancel = connectedNode.newPublisher("fibonacci/cancel",
     //  actionlib_msgs.cancel._TYPE);
   }
@@ -42,13 +55,27 @@ public class ActionClient<T_ACTION_GOAL extends Message> {
     return goalPublisher.newMessage();
   }
 
-  private void suscribeServer(ConnectedNode node) {
-    serverResult = node.newSubscriber("fibonacci/result",
-      actionlib_tutorials.FibonacciActionResult._TYPE);
+  private void subscribeToServer(ConnectedNode node) {
+    serverResult = node.newSubscriber(actionName + "/result", actionResultType);
+    serverFeedback = node.newSubscriber(actionName + "/feedback", actionFeedbackType);
 
-    serverResult.addMessageListener(new MessageListener<actionlib_tutorials.FibonacciActionResult>() {
+    serverFeedback.addMessageListener(new MessageListener<T_ACTION_FEEDBACK>() {
       @Override
-      public void onNewMessage(actionlib_tutorials.FibonacciActionResult message) {
+      public void onNewMessage(T_ACTION_FEEDBACK message) {
+        gotFeedback(message);
+      }
+    });
+
+    serverResult.addMessageListener(new MessageListener<T_ACTION_RESULT>() {
+      @Override
+      public void onNewMessage(T_ACTION_RESULT message) {
+        gotResult(message);
+      }
+    });
+
+    serverResult.addMessageListener(new MessageListener<T_ACTION_RESULT>() {
+      @Override
+      public void onNewMessage(T_ACTION_RESULT message) {
         gotResult(message);
       }
     });
@@ -59,23 +86,26 @@ public class ActionClient<T_ACTION_GOAL extends Message> {
       actionlib_tutorials.FibonacciActionFeedback._TYPE);*/
   }
 
-  public void gotResult(actionlib_tutorials.FibonacciActionResult message) {
-    actionlib_tutorials.FibonacciResult result = message.getResult();
-    int[] sequence = result.getSequence();
-    int i;
+  public void gotResult(T_ACTION_RESULT message) {
+    // Propagate the callback
+    if (callbackTarget != null) {
+      callbackTarget.resultReceived(message);
+    }
+  }
 
-    System.out.print("Got Fibonacci result sequence! ");
-    for (i=0; i<sequence.length; i++)
-      System.out.print(Integer.toString(sequence[i]) + " ");
-    System.out.print("\n");
+  public void gotFeedback(T_ACTION_FEEDBACK message) {
+    // Propagate the callback
+    if (callbackTarget != null) {
+      callbackTarget.feedbackReceived(message);
+    }
   }
 
-/**
- * Publishes the client's topics and suscribes to the server's topics.
- */
-  public void connect(ConnectedNode node) {
+  /**
+  * Publishes the client's topics and suscribes to the server's topics.
+  */
+  private void connect(ConnectedNode node) {
     publishClient(node);
-    //suscribeServer(node);
+    subscribeToServer(node);
   }
 
 }
diff --git a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClientListener.java b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClientListener.java
index c3453a811896c4c90785b2f9326cd6aa1f34edb1..680c731ddcecaa5fbeff3963e632f7976a8d19ee 100644
--- a/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClientListener.java
+++ b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/ActionClientListener.java
@@ -4,9 +4,11 @@ import org.ros.internal.message.Message;
 
 /**
  * Listener interface to receive the incoming messages from the ActionLib server.
+ * A client should implement this interface if it wants to receive the callbacks
+ * with information from the server.
  */
-public interface ActionClientListener {
-  void resultReceived(Message result);
-  void feedbackReceived(Message feedback);
+public interface ActionClientListener<T_ACTION_FEEDBACK extends Message, T_ACTION_RESULT extends Message> {
+  void resultReceived(T_ACTION_RESULT result);
+  void feedbackReceived(T_ACTION_FEEDBACK feedback);
   void statusReceived(Message status);
 }
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 333677e7d92065d7e7646accd5a1975ed991550b..9851afa2708722c22c28ae618c184c5f7d86138c 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
@@ -3,10 +3,15 @@ package com.github.ekumen.rosjava_actionlib;
 import org.ros.namespace.GraphName;
 import org.ros.node.AbstractNodeMain;
 import org.ros.node.ConnectedNode;
+import org.ros.internal.message.Message;
 import actionlib_tutorials.FibonacciActionGoal;
+import actionlib_tutorials.FibonacciActionFeedback;
+import actionlib_tutorials.FibonacciActionResult;
 import actionlib_tutorials.FibonacciGoal;
+import actionlib_tutorials.FibonacciFeedback;
+import actionlib_tutorials.FibonacciResult;
 
-public class TestClient extends AbstractNodeMain {
+public class TestClient extends AbstractNodeMain implements ActionClientListener<FibonacciActionFeedback, FibonacciActionResult> {
   ActionClient ac;
 
   @Override
@@ -16,7 +21,10 @@ public class TestClient extends AbstractNodeMain {
 
   @Override
   public void onStart(ConnectedNode node) {
-    ac = new ActionClient<FibonacciActionGoal>(node, "/fibonacci", FibonacciActionGoal._TYPE);
+    ac = new ActionClient<FibonacciActionGoal, FibonacciActionFeedback, FibonacciActionResult>(node, "/fibonacci", FibonacciActionGoal._TYPE, FibonacciActionFeedback._TYPE, FibonacciActionResult._TYPE);
+
+    // Attach listener for the callbacks
+    ac.attachListener(this);
 
     // publish a goal message
     FibonacciActionGoal goalMessage = (FibonacciActionGoal)ac.newGoalMessage();
@@ -36,4 +44,33 @@ public class TestClient extends AbstractNodeMain {
       }
     }
   }
+
+  @Override
+  public void resultReceived(FibonacciActionResult message) {
+    FibonacciResult result = message.getResult();
+    int[] sequence = result.getSequence();
+    int i;
+
+    System.out.print("Got Fibonacci result sequence!");
+    for (i=0; i<sequence.length; i++)
+      System.out.print(Integer.toString(sequence[i]) + " ");
+    System.out.print("\n");
+  }
+
+  @Override
+  public void feedbackReceived(FibonacciActionFeedback message) {
+    FibonacciFeedback result = message.getFeedback();
+    int[] sequence = result.getSequence();
+    int i;
+
+    System.out.print("Feedback from Fibonacci server: ");
+    for (i=0; i<sequence.length; i++)
+      System.out.print(Integer.toString(sequence[i]) + " ");
+    System.out.print("\n");
+  }
+
+  @Override
+  public void statusReceived(Message status) {
+
+  }
 }