diff --git a/controller/main.go b/controller/main.go
index 49fda14..bd37cac 100644
--- a/controller/main.go
+++ b/controller/main.go
@@ -2,58 +2,130 @@
 
 import (
 	"bytes"
-	"encoding/json"
 	"flag"
 	"fmt"
 	"io/ioutil"
 	"log"
 	"net/http"
+	"strings"
+
+	"github.com/giolekva/pcloud/controller/schema"
+
+	"github.com/golang/glog"
+	"github.com/itaysk/regogo"
 )
 
 var port = flag.Int("port", 123, "Port to listen on.")
-var graphql_address = flag.String("graphql_address", "", "GraphQL server address.")
+var graphqlAddress = flag.String("graphql_address", "", "GraphQL server address.")
+var dgraphAdminAddress = flag.String("dgraph_admin_address", "", "Dgraph server admin address.")
 
-func minio_webhook_handler(w http.ResponseWriter, r *http.Request) {
+const imgJson = `{ objectPath: \"%s\"}`
+const insertQuery = `{ "query": "mutation { add%s(input: [%s]) { %s { id } } }" }`
+const getQuery = `{ "query": "{ get%s(id: \"%s\") { id objectPath } } " }`
+
+type GraphQLClient struct {
+	serverAddress string
+}
+
+func (g *GraphQLClient) Insert(typ string, obj string) (string, error) {
+	req := []byte(fmt.Sprintf(insertQuery, typ, obj, strings.ToLower(typ)))
+	glog.Info("Insering new item, mutation query:")
+	glog.Info(string(req))
+	resp, err := http.Post(g.serverAddress, "application/json", bytes.NewReader(req))
+	glog.Infof("Response status: %d", resp.StatusCode)
+	if err != nil {
+		return "", err
+	}
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return "", err
+	}
+	glog.Infof("Response: %s", string(respBody))
+	return string(respBody), nil
+}
+
+func (g *GraphQLClient) Get(typ string, id string) (string, error) {
+	req := []byte(fmt.Sprintf(insertQuery, typ, id, strings.ToLower(typ)))
+	glog.Info("Getting node with query:")
+	glog.Info(string(req))
+	resp, err := http.Post(g.serverAddress, "application/json", bytes.NewReader(req))
+	glog.Infof("Response status: %s", resp.StatusCode)
+	if err != nil {
+		return "", err
+	}
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return "", err
+	}
+	glog.Info(string(respBody))
+	return string(respBody), nil
+}
+
+type MinioWebhook struct {
+	gqlClient         *GraphQLClient
+	dgraphAdminClient schema.SchemaStore
+}
+
+func (m *MinioWebhook) handler(w http.ResponseWriter, r *http.Request) {
 	body, err := ioutil.ReadAll(r.Body)
 	if len(body) == 0 {
 		return
 	}
-	log.Print(string(body))
+	glog.Infof("Received event from Minio: %s", string(body))
 	if err != nil {
-		log.Print("-----")
-		log.Print(err)
 		http.Error(w, "Could not read HTTP request body", http.StatusInternalServerError)
 		return
 	}
-	event := make(map[string]interface{})
-	err = json.Unmarshal(body, &event)
+	key, err := regogo.Get(string(body), "input.Key")
 	if err != nil {
-		log.Print("++++++")
-		log.Print(err)
-		http.Error(w, "Could not parse Event JSON object", http.StatusBadRequest)
+		http.Error(w, "Could not find object key", http.StatusBadRequest)
 		return
 	}
-	buf := []byte("{ \"query\": \"mutation { addImage(input: [{ objectPath: \\\"" + event["Key"].(string) + "\\\"}]) { image { id } }} \" }")
-	log.Print(string(buf))
-	resp, err := http.Post(*graphql_address, "application/json", bytes.NewReader(buf))
+	resp, err := m.gqlClient.Insert("Image", fmt.Sprintf(imgJson, key.String()))
 	if err != nil {
-		log.Print("#######")
-		log.Print(err)
-		http.Error(w, "Could not post to GraphQL", http.StatusInternalServerError)
+		http.Error(w, "Can not add given objects", http.StatusInternalServerError)
 		return
 	}
-	body, err = ioutil.ReadAll(resp.Body)
+	id, err := regogo.Get(resp, "input.data.addImage.image[0]id")
 	if err != nil {
-		log.Print("@@@@@@")
-		log.Print(err)
-		http.Error(w, "Could not parse GraphQL response", http.StatusInternalServerError)
+		http.Error(w, "Could not extract node id", http.StatusInternalServerError)
 		return
 	}
-	log.Print(string(body))
+	resp, err = m.gqlClient.Get("Image", id.String())
+	if err != nil {
+		http.Error(w, "Could not fetch node", http.StatusInternalServerError)
+		return
+	}
 }
 
 func main() {
 	flag.Parse()
-	http.HandleFunc("/minio_webhook", minio_webhook_handler)
+	dgraphAdminClient, err := schema.NewDgraphSchemaStore(*dgraphAdminAddress)
+	if err != nil {
+		panic(err)
+	}
+	err = dgraphAdminClient.SetSchema(`
+	type Image {
+	     id: ID!
+	     objectPath: String! @search(by: [exact])
+	     segments: [ImageSegment] @hasInverse(field: sourceImage)
+	}
+
+	type ImageSegment {
+	     id: ID!
+	     upperLeftX: Int!
+	     upperLeftY: Int!
+	     lowerRightX: Int!
+	     lowerRightY: Int!
+	     sourceImage: Image!
+	     objectPath: String
+	}`)
+	if err != nil {
+		panic(err)
+	}
+	mw := MinioWebhook{
+		&GraphQLClient{*graphqlAddress},
+		nil}
+	http.HandleFunc("/minio_webhook", mw.handler)
 	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
 }
