diff --git a/controller/schema/dgraph_schema_store.go b/controller/schema/dgraph_schema_store.go
index 0d345bb..4f434d7 100644
--- a/controller/schema/dgraph_schema_store.go
+++ b/controller/schema/dgraph_schema_store.go
@@ -2,6 +2,7 @@
 
 import (
 	"bytes"
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"net/http"
@@ -9,44 +10,49 @@
 
 	"github.com/golang/glog"
 	"github.com/itaysk/regogo"
+	"github.com/vektah/gqlparser"
 	"github.com/vektah/gqlparser/ast"
-	"github.com/vektah/gqlparser/parser"
 )
 
 const jsonContentType = "application/json"
+const textContentType = "text/plain"
 
-const getSchemaQuery = `{ "query": "{ getGQLSchema() { schema } }" }`
+const getSchemaQuery = `{ "query": "{ getGQLSchema() { generatedSchema } }" }`
+const runQuery = `{ "query": "%s" }`
 
-const addSchemaQuery = `{
-  "query": "mutation { updateGQLSchema(input: {set: {schema: \"%s\"}}) { gqlSchema { id schema } } }" }`
-
-type DgraphSchemaStore struct {
-	dgraphAddress string
+type DgraphClient struct {
+	gqlAdddress   string
+	schemaAddress string
 	gqlSchema     string
-	schema        *ast.SchemaDocument
+	schema        *ast.Schema
 }
 
-func NewDgraphSchemaStore(dgraphAddress string) (SchemaStore, error) {
-	ret := &DgraphSchemaStore{dgraphAddress: dgraphAddress, gqlSchema: ""}
+func NewDgraphClient(gqlAddress, schemaAddress string) (GraphQLClient, error) {
+	ret := &DgraphClient{
+		gqlAdddress:   gqlAddress,
+		schemaAddress: schemaAddress,
+		gqlSchema:     ""}
 	if err := ret.fetchSchema(); err != nil {
 		return nil, err
 	}
 	return ret, nil
 }
 
-func (s *DgraphSchemaStore) Schema() *ast.SchemaDocument {
+func (s *DgraphClient) Schema() *ast.Schema {
 	return s.schema
 }
 
-func (s *DgraphSchemaStore) AddSchema(gqlSchema string) error {
+func (s *DgraphClient) AddSchema(gqlSchema string) error {
 	return s.SetSchema(s.gqlSchema + gqlSchema)
 }
 
-func (s *DgraphSchemaStore) SetSchema(gqlSchema string) error {
+func (s *DgraphClient) SetSchema(gqlSchema string) error {
 	glog.Info("Setting GraphQL schema:")
 	glog.Info(gqlSchema)
-	req := fmt.Sprintf(addSchemaQuery, strings.ReplaceAll(strings.ReplaceAll(gqlSchema, "\n", " "), "\t", " "))
-	resp, err := http.Post(s.dgraphAddress, jsonContentType, bytes.NewReader([]byte(req)))
+	resp, err := http.Post(
+		s.schemaAddress+"/schema",
+		textContentType,
+		bytes.NewReader([]byte(gqlSchema)))
 	if err != nil {
 		return err
 	}
@@ -60,9 +66,12 @@
 	return s.fetchSchema()
 }
 
-func (s *DgraphSchemaStore) fetchSchema() error {
+func (s *DgraphClient) fetchSchema() error {
 	glog.Infof("Getting GraphQL schema with query: %s", getSchemaQuery)
-	resp, err := http.Post(s.dgraphAddress, jsonContentType, bytes.NewReader([]byte(getSchemaQuery)))
+	resp, err := http.Post(
+		s.schemaAddress,
+		jsonContentType,
+		bytes.NewReader([]byte(getSchemaQuery)))
 	if err != nil {
 		return err
 	}
@@ -72,14 +81,56 @@
 		return err
 	}
 	glog.Infof("Result: %s", string(respBody))
-	gqlSchema, err := regogo.Get(string(respBody), "input.data.getGQLSchema.schema")
+	gqlSchema, err := regogo.Get(
+		string(respBody),
+		"input.data.getGQLSchema.generatedSchema")
 	if err != nil {
 		return err
 	}
-	schema, gqlErr := parser.ParseSchema(&ast.Source{Input: gqlSchema.String()})
+	schema, gqlErr := gqlparser.LoadSchema(&ast.Source{Input: gqlSchema.String()})
 	if gqlErr != nil {
 		return gqlErr
 	}
 	s.schema = schema
 	return nil
 }
+
+func (s *DgraphClient) RunQuery(query string) (string, error) {
+	_, gqlErr := gqlparser.LoadQuery(s.Schema(), query)
+	if gqlErr != nil {
+		return "", errors.New(gqlErr.Error())
+	}
+	glog.Infof("Running GraphQL query: %s", query)
+	queryJson := fmt.Sprintf(runQuery, sanitizeQuery(query))
+	resp, err := http.Post(
+		s.gqlAdddress,
+		jsonContentType,
+		bytes.NewReader([]byte(queryJson)))
+	if err != nil {
+		return "", err
+	}
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return "", err
+	}
+	respStr := string(respBody)
+	glog.Infof("Result: %s", string(respStr))
+	// errStr, err := regogo.Get(respStr, "input.errors")
+	// if err == nil {
+	// 	return "", errors.New(errStr.JSON())
+	// }
+	data, err := regogo.Get(respStr, "input.data")
+	if err != nil {
+		return "", err
+	}
+	return data.JSON(), nil
+}
+
+func sanitizeSchema(schema string) string {
+	return strings.ReplaceAll(
+		strings.ReplaceAll(schema, "\n", " "), "\t", " ")
+}
+
+func sanitizeQuery(query string) string {
+	return strings.ReplaceAll(query, "\"", "\\\"")
+}
