diff --git a/zanata-cli/pom.xml b/zanata-cli/pom.xml
index 4e438fdb..0f88eabb 100644
--- a/zanata-cli/pom.xml
+++ b/zanata-cli/pom.xml
@@ -81,6 +81,37 @@
+
+
+ bash
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.2.1
+
+
+ test
+
+ java
+
+
+
+
+ org.zanata.client.BashCompletionGenerator
+
+ ${project.build.directory}/zanata-cli-completion
+
+ test
+
+
+
+
+
+
+
diff --git a/zanata-cli/src/test/java/org/zanata/client/BashCompletionGenerator.java b/zanata-cli/src/test/java/org/zanata/client/BashCompletionGenerator.java
new file mode 100644
index 00000000..49752170
--- /dev/null
+++ b/zanata-cli/src/test/java/org/zanata/client/BashCompletionGenerator.java
@@ -0,0 +1,211 @@
+package org.zanata.client;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.AccessibleObject;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.kohsuke.args4j.Option;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zanata.client.commands.BasicOptions;
+import com.google.common.base.Charsets;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.io.Files;
+
+/**
+ * @author Patrick Huang pahuang@redhat.com
+ */
+public class BashCompletionGenerator
+{
+ private static final Logger log = LoggerFactory.getLogger(BashCompletionGenerator.class);
+
+ private static final Joiner joiner = Joiner.on(" ");
+
+ private List baseCommands;
+ private List