diff --git a/appmanager/cmd/main.go b/appmanager/cmd/main.go
index 9d55071..9bf0b4e 100644
--- a/appmanager/cmd/main.go
+++ b/appmanager/cmd/main.go
@@ -7,6 +7,7 @@
 	"flag"
 	"fmt"
 	"io"
+	"io/ioutil"
 	"log"
 	"net/http"
 	"os"
@@ -45,8 +46,9 @@
 `
 
 type handler struct {
+	client   *kubernetes.Clientset
 	manager  *app.Manager
-	nsClient corev1.NamespaceInterface
+	launcher app.Launcher
 }
 
 func (hn *handler) handleInstall(w http.ResponseWriter, r *http.Request) {
@@ -113,9 +115,6 @@
 	triggerOnEvent := r.Form["trigger_on_event"][0]
 	var triggers []trigger
 	for _, a := range hn.manager.Apps {
-		if a.Triggers == nil {
-			continue
-		}
 		for _, t := range a.Triggers.Triggers {
 			if t.TriggerOn.Type == triggerOnType && t.TriggerOn.Event == triggerOnEvent {
 				triggers = append(triggers, trigger{a.Namespace, t.Template})
@@ -133,6 +132,44 @@
 	}
 }
 
+type actionReq struct {
+	App    string                 `json:"app"`
+	Action string                 `json:"action"`
+	Args   map[string]interface{} `json:"args"`
+}
+
+func (hn *handler) handleLaunchAction(w http.ResponseWriter, r *http.Request) {
+	actionStr, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	var req actionReq
+	if err := json.Unmarshal(actionStr, &req); err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	for _, a := range hn.manager.Apps {
+		if a.Name != req.App {
+			continue
+		}
+		for _, action := range a.Actions.Actions {
+			if action.Name != req.Action {
+				continue
+			}
+			err := hn.launcher.Launch(a.Namespace, action.Template, req.Args)
+			if err != nil {
+				http.Error(w, err.Error(), http.StatusInternalServerError)
+			}
+			return
+		}
+	}
+	http.Error(
+		w,
+		fmt.Sprintf("Application action not found: %s %s", req.App, req.Action),
+		http.StatusBadRequest)
+}
+
 func (hn *handler) installHelmChart(path string) error {
 	h, err := app.HelmChartFromTar(path)
 	if err != nil {
@@ -143,7 +180,8 @@
 	}
 	glog.Infof("Installed schema: %s", h.Schema)
 	namespace := fmt.Sprintf("app-%s", h.Name)
-	if err = createNamespace(hn.nsClient, namespace); err != nil {
+	err = createNamespace(hn.client.CoreV1().Namespaces(), namespace)
+	if err != nil {
 		return err
 	}
 	glog.Infof("Created namespaces: %s", namespace)
@@ -157,7 +195,7 @@
 	} else {
 		glog.Info("Skipping deployment as we got library chart.")
 	}
-	hn.manager.Apps[h.Name] = app.App{namespace, h.Triggers}
+	hn.manager.Apps[h.Name] = app.App{h.Name, namespace, h.Triggers, h.Actions}
 	app.StoreManagerStateToFile(hn.manager, *managerStoreFile)
 	glog.Info("Installed")
 	return nil
@@ -191,13 +229,13 @@
 	if err != nil {
 		glog.Fatalf("Could not create Kubernetes API client: %v", err)
 	}
-	namespaces := clientset.CoreV1().Namespaces()
 	manager, err := app.LoadManagerStateFromFile(*managerStoreFile)
 	if err != nil {
 		glog.Fatalf("Could ot initialize manager: %v", err)
 	}
-	h := handler{manager, namespaces}
+	h := handler{clientset, manager, app.NewK8sLauncher(clientset)}
 	http.HandleFunc("/triggers", h.handleTriggers)
+	http.HandleFunc("/launch_action", h.handleLaunchAction)
 	http.HandleFunc("/", h.handleInstall)
 	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
 
