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, "\"", "\\\"")
+}
diff --git a/controller/schema/schema.go b/controller/schema/schema.go
index a077ce3..fed08e1 100644
--- a/controller/schema/schema.go
+++ b/controller/schema/schema.go
@@ -2,37 +2,11 @@
 
 import (
 	"github.com/vektah/gqlparser/ast"
-	"github.com/vektah/gqlparser/parser"
 )
 
-type SchemaStore interface {
-	Schema() *ast.SchemaDocument
-	SetSchema(gqlSchema string) error
-	AddSchema(gqlSchema string) error
-}
-
-type InMemorySchemaStore struct {
-	gqlSchema string
-	schema    *ast.SchemaDocument
-}
-
-func NewInMemorySchemaStore() SchemaStore {
-	return &InMemorySchemaStore{gqlSchema: ""}
-}
-
-func (s *InMemorySchemaStore) Schema() *ast.SchemaDocument {
-	return s.schema
-}
-
-func (s *InMemorySchemaStore) AddSchema(gqlSchema string) error {
-	return s.SetSchema(s.gqlSchema + gqlSchema)
-}
-
-func (s *InMemorySchemaStore) SetSchema(gqlSchema string) error {
-	schema, err := parser.ParseSchema(&ast.Source{Input: gqlSchema})
-	if err != nil {
-		return err
-	}
-	s.schema = schema
-	return nil
+type GraphQLClient interface {
+	Schema() *ast.Schema
+	SetSchema(schema string) error
+	AddSchema(schema string) error
+	RunQuery(query string) (string, error)
 }
diff --git a/controller/schema/schema_test.go b/controller/schema/schema_test.go
deleted file mode 100644
index 0c73694..0000000
--- a/controller/schema/schema_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package schema
-
-import (
-	"fmt"
-	"log"
-	"testing"
-)
-
-func TestInMemorySimple(t *testing.T) {
-	s := NewInMemorySchemaStore()
-	err := s.AddSchema(`
-type M {
-  X: Int
-}`)
-	if err != nil {
-		t.Fatal(err)
-	}
-	for _, def := range s.Schema().Definitions {
-		fmt.Printf("%s - %s\n", def.Name, def.Kind)
-	}
-}
-
-func TestInMemory(t *testing.T) {
-	s := NewInMemorySchemaStore()
-	err := s.AddSchema(`
-type Image {
-  id: ID!
-  objectPath: String!
-}
-
-type ImageSegment {
-  id: ID! @search
-  upperLeftX: Float!
-  upperLeftY: Float!
-  lowerRightX: Float!
-  lowerRightY: Float!
-  sourceImage: Image!
-}
-
-extend type Image {
-  segments: [ImageSegment]
-}
-`)
-	if err != nil {
-		t.Fatal(err)
-	}
-	for _, def := range s.Schema().Definitions {
-		fmt.Printf("%s - %s\n", def.Name, def.Kind)
-	}
-}
-
-func TestDgraph(t *testing.T) {
-	s, err := NewDgraphSchemaStore("http://localhost:8080/admin")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if s.Schema() != nil {
-		for _, def := range s.Schema().Definitions {
-			fmt.Printf("%s - %s\n", def.Name, def.Kind)
-		}
-	}
-	err = s.AddSchema("type N { Y: ID! Z: Float }")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if s.Schema() != nil {
-		for _, def := range s.Schema().Definitions {
-			fmt.Printf("%s - %s\n", def.Name, def.Kind)
-		}
-	}
-	log.Print("123123")
-	err = s.AddSchema("type M { X: Int }")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if s.Schema() != nil {
-		for _, def := range s.Schema().Definitions {
-			fmt.Printf("%s - %s\n", def.Name, def.Kind)
-		}
-	}
-}
