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
new file mode 100644
index 0000000000000000000000000000000000000000..333677e7d92065d7e7646accd5a1975ed991550b
--- /dev/null
+++ b/src/rosjava_actionlib/rosjava_actionlib/src/main/java/com/github/ekumen/rosjava_actionlib/TestClient.java
@@ -0,0 +1,39 @@
+package com.github.ekumen.rosjava_actionlib;
+
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import actionlib_tutorials.FibonacciActionGoal;
+import actionlib_tutorials.FibonacciGoal;
+
+public class TestClient extends AbstractNodeMain {
+  ActionClient ac;
+
+  @Override
+  public GraphName getDefaultNodeName() {
+    return GraphName.of("fibonacci_test_client");
+  }
+
+  @Override
+  public void onStart(ConnectedNode node) {
+    ac = new ActionClient<FibonacciActionGoal>(node, "/fibonacci", FibonacciActionGoal._TYPE);
+
+    // publish a goal message
+    FibonacciActionGoal goalMessage = (FibonacciActionGoal)ac.newGoalMessage();
+    FibonacciGoal fibonacciGoal = goalMessage.getGoal();
+
+    // set Fibonacci parameter
+    fibonacciGoal.setOrder(6);
+    goalMessage.setGoal(fibonacciGoal);
+
+    while (true) {
+      ac.sendGoal(goalMessage);
+      try {
+        Thread.sleep(10000);
+      }
+      catch (InterruptedException ex) {
+        ;
+      }
+    }
+  }
+}