diff --git a/go/Makefile b/go/Makefile
deleted file mode 100644
index 57e6b5fa95..0000000000
--- a/go/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-SELDON_CORE_DIR=..
-
-.PHONY: compile_proto
-compile_proto:
-	rm -rf pkg/api && mkdir -p pkg/api
-
-	cp ${SELDON_CORE_DIR}/proto/prediction.proto pkg/api
-
-	$(MAKE) -C ${SELDON_CORE_DIR}/proto/tensorflow/ create_protos
-	cp -r $(SELDON_CORE_DIR)/proto/tensorflow/tensorflow pkg/api
-
-	cd pkg/api && protoc -I. -I./tensorflow --go_out=paths=source_relative,plugins=grpc:. *.proto
-	cd pkg/api && protoc -I. -I./tensorflow --go_out=paths=source_relative,plugins=grpc:. ./tensorflow/core/framework/*.proto
-
-	find ./pkg -name "*.pb.go" -type f -exec perl -e "s/github\.com\/tensorflow\/tensorflow\/tensorflow\/go/github\.com\/seldonio\/seldon-core\/go\/pkg\/api\/tensorflow/g" -pi {} +
-	find ./pkg -name "*.proto" -type f -delete
\ No newline at end of file
diff --git a/go/pkg/api/prediction.pb.go b/go/pkg/api/prediction.pb.go
deleted file mode 100644
index 62e8834c0f..0000000000
--- a/go/pkg/api/prediction.pb.go
+++ /dev/null
@@ -1,1555 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: prediction.proto
-
-package api
-
-import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	_struct "github.com/golang/protobuf/ptypes/struct"
-	framework "github.com/seldonio/seldon-core/go/pkg/api/tensorflow/core/framework"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-type Metric_MetricType int32
-
-const (
-	Metric_COUNTER Metric_MetricType = 0
-	Metric_GAUGE   Metric_MetricType = 1
-	Metric_TIMER   Metric_MetricType = 2
-)
-
-var Metric_MetricType_name = map[int32]string{
-	0: "COUNTER",
-	1: "GAUGE",
-	2: "TIMER",
-}
-
-var Metric_MetricType_value = map[string]int32{
-	"COUNTER": 0,
-	"GAUGE":   1,
-	"TIMER":   2,
-}
-
-func (x Metric_MetricType) String() string {
-	return proto.EnumName(Metric_MetricType_name, int32(x))
-}
-
-func (Metric_MetricType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{4, 0}
-}
-
-type Status_StatusFlag int32
-
-const (
-	Status_SUCCESS Status_StatusFlag = 0
-	Status_FAILURE Status_StatusFlag = 1
-)
-
-var Status_StatusFlag_name = map[int32]string{
-	0: "SUCCESS",
-	1: "FAILURE",
-}
-
-var Status_StatusFlag_value = map[string]int32{
-	"SUCCESS": 0,
-	"FAILURE": 1,
-}
-
-func (x Status_StatusFlag) String() string {
-	return proto.EnumName(Status_StatusFlag_name, int32(x))
-}
-
-func (Status_StatusFlag) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{6, 0}
-}
-
-type SeldonMessage struct {
-	Status *Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
-	Meta   *Meta   `protobuf:"bytes,2,opt,name=meta,proto3" json:"meta,omitempty"`
-	// Types that are valid to be assigned to DataOneof:
-	//	*SeldonMessage_Data
-	//	*SeldonMessage_BinData
-	//	*SeldonMessage_StrData
-	//	*SeldonMessage_JsonData
-	DataOneof            isSeldonMessage_DataOneof `protobuf_oneof:"data_oneof"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
-}
-
-func (m *SeldonMessage) Reset()         { *m = SeldonMessage{} }
-func (m *SeldonMessage) String() string { return proto.CompactTextString(m) }
-func (*SeldonMessage) ProtoMessage()    {}
-func (*SeldonMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{0}
-}
-
-func (m *SeldonMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SeldonMessage.Unmarshal(m, b)
-}
-func (m *SeldonMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SeldonMessage.Marshal(b, m, deterministic)
-}
-func (m *SeldonMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SeldonMessage.Merge(m, src)
-}
-func (m *SeldonMessage) XXX_Size() int {
-	return xxx_messageInfo_SeldonMessage.Size(m)
-}
-func (m *SeldonMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_SeldonMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SeldonMessage proto.InternalMessageInfo
-
-func (m *SeldonMessage) GetStatus() *Status {
-	if m != nil {
-		return m.Status
-	}
-	return nil
-}
-
-func (m *SeldonMessage) GetMeta() *Meta {
-	if m != nil {
-		return m.Meta
-	}
-	return nil
-}
-
-type isSeldonMessage_DataOneof interface {
-	isSeldonMessage_DataOneof()
-}
-
-type SeldonMessage_Data struct {
-	Data *DefaultData `protobuf:"bytes,3,opt,name=data,proto3,oneof"`
-}
-
-type SeldonMessage_BinData struct {
-	BinData []byte `protobuf:"bytes,4,opt,name=binData,proto3,oneof"`
-}
-
-type SeldonMessage_StrData struct {
-	StrData string `protobuf:"bytes,5,opt,name=strData,proto3,oneof"`
-}
-
-type SeldonMessage_JsonData struct {
-	JsonData *_struct.Value `protobuf:"bytes,6,opt,name=jsonData,proto3,oneof"`
-}
-
-func (*SeldonMessage_Data) isSeldonMessage_DataOneof() {}
-
-func (*SeldonMessage_BinData) isSeldonMessage_DataOneof() {}
-
-func (*SeldonMessage_StrData) isSeldonMessage_DataOneof() {}
-
-func (*SeldonMessage_JsonData) isSeldonMessage_DataOneof() {}
-
-func (m *SeldonMessage) GetDataOneof() isSeldonMessage_DataOneof {
-	if m != nil {
-		return m.DataOneof
-	}
-	return nil
-}
-
-func (m *SeldonMessage) GetData() *DefaultData {
-	if x, ok := m.GetDataOneof().(*SeldonMessage_Data); ok {
-		return x.Data
-	}
-	return nil
-}
-
-func (m *SeldonMessage) GetBinData() []byte {
-	if x, ok := m.GetDataOneof().(*SeldonMessage_BinData); ok {
-		return x.BinData
-	}
-	return nil
-}
-
-func (m *SeldonMessage) GetStrData() string {
-	if x, ok := m.GetDataOneof().(*SeldonMessage_StrData); ok {
-		return x.StrData
-	}
-	return ""
-}
-
-func (m *SeldonMessage) GetJsonData() *_struct.Value {
-	if x, ok := m.GetDataOneof().(*SeldonMessage_JsonData); ok {
-		return x.JsonData
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*SeldonMessage) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*SeldonMessage_Data)(nil),
-		(*SeldonMessage_BinData)(nil),
-		(*SeldonMessage_StrData)(nil),
-		(*SeldonMessage_JsonData)(nil),
-	}
-}
-
-type DefaultData struct {
-	Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"`
-	// Types that are valid to be assigned to DataOneof:
-	//	*DefaultData_Tensor
-	//	*DefaultData_Ndarray
-	//	*DefaultData_Tftensor
-	DataOneof            isDefaultData_DataOneof `protobuf_oneof:"data_oneof"`
-	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
-	XXX_unrecognized     []byte                  `json:"-"`
-	XXX_sizecache        int32                   `json:"-"`
-}
-
-func (m *DefaultData) Reset()         { *m = DefaultData{} }
-func (m *DefaultData) String() string { return proto.CompactTextString(m) }
-func (*DefaultData) ProtoMessage()    {}
-func (*DefaultData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{1}
-}
-
-func (m *DefaultData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DefaultData.Unmarshal(m, b)
-}
-func (m *DefaultData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DefaultData.Marshal(b, m, deterministic)
-}
-func (m *DefaultData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DefaultData.Merge(m, src)
-}
-func (m *DefaultData) XXX_Size() int {
-	return xxx_messageInfo_DefaultData.Size(m)
-}
-func (m *DefaultData) XXX_DiscardUnknown() {
-	xxx_messageInfo_DefaultData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DefaultData proto.InternalMessageInfo
-
-func (m *DefaultData) GetNames() []string {
-	if m != nil {
-		return m.Names
-	}
-	return nil
-}
-
-type isDefaultData_DataOneof interface {
-	isDefaultData_DataOneof()
-}
-
-type DefaultData_Tensor struct {
-	Tensor *Tensor `protobuf:"bytes,2,opt,name=tensor,proto3,oneof"`
-}
-
-type DefaultData_Ndarray struct {
-	Ndarray *_struct.ListValue `protobuf:"bytes,3,opt,name=ndarray,proto3,oneof"`
-}
-
-type DefaultData_Tftensor struct {
-	Tftensor *framework.TensorProto `protobuf:"bytes,4,opt,name=tftensor,proto3,oneof"`
-}
-
-func (*DefaultData_Tensor) isDefaultData_DataOneof() {}
-
-func (*DefaultData_Ndarray) isDefaultData_DataOneof() {}
-
-func (*DefaultData_Tftensor) isDefaultData_DataOneof() {}
-
-func (m *DefaultData) GetDataOneof() isDefaultData_DataOneof {
-	if m != nil {
-		return m.DataOneof
-	}
-	return nil
-}
-
-func (m *DefaultData) GetTensor() *Tensor {
-	if x, ok := m.GetDataOneof().(*DefaultData_Tensor); ok {
-		return x.Tensor
-	}
-	return nil
-}
-
-func (m *DefaultData) GetNdarray() *_struct.ListValue {
-	if x, ok := m.GetDataOneof().(*DefaultData_Ndarray); ok {
-		return x.Ndarray
-	}
-	return nil
-}
-
-func (m *DefaultData) GetTftensor() *framework.TensorProto {
-	if x, ok := m.GetDataOneof().(*DefaultData_Tftensor); ok {
-		return x.Tftensor
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*DefaultData) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*DefaultData_Tensor)(nil),
-		(*DefaultData_Ndarray)(nil),
-		(*DefaultData_Tftensor)(nil),
-	}
-}
-
-type Tensor struct {
-	Shape                []int32   `protobuf:"varint,1,rep,packed,name=shape,proto3" json:"shape,omitempty"`
-	Values               []float64 `protobuf:"fixed64,2,rep,packed,name=values,proto3" json:"values,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *Tensor) Reset()         { *m = Tensor{} }
-func (m *Tensor) String() string { return proto.CompactTextString(m) }
-func (*Tensor) ProtoMessage()    {}
-func (*Tensor) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{2}
-}
-
-func (m *Tensor) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Tensor.Unmarshal(m, b)
-}
-func (m *Tensor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Tensor.Marshal(b, m, deterministic)
-}
-func (m *Tensor) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Tensor.Merge(m, src)
-}
-func (m *Tensor) XXX_Size() int {
-	return xxx_messageInfo_Tensor.Size(m)
-}
-func (m *Tensor) XXX_DiscardUnknown() {
-	xxx_messageInfo_Tensor.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Tensor proto.InternalMessageInfo
-
-func (m *Tensor) GetShape() []int32 {
-	if m != nil {
-		return m.Shape
-	}
-	return nil
-}
-
-func (m *Tensor) GetValues() []float64 {
-	if m != nil {
-		return m.Values
-	}
-	return nil
-}
-
-type Meta struct {
-	Puid                 string                    `protobuf:"bytes,1,opt,name=puid,proto3" json:"puid,omitempty"`
-	Tags                 map[string]*_struct.Value `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	Routing              map[string]int32          `protobuf:"bytes,3,rep,name=routing,proto3" json:"routing,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
-	RequestPath          map[string]string         `protobuf:"bytes,4,rep,name=requestPath,proto3" json:"requestPath,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	Metrics              []*Metric                 `protobuf:"bytes,5,rep,name=metrics,proto3" json:"metrics,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
-}
-
-func (m *Meta) Reset()         { *m = Meta{} }
-func (m *Meta) String() string { return proto.CompactTextString(m) }
-func (*Meta) ProtoMessage()    {}
-func (*Meta) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{3}
-}
-
-func (m *Meta) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Meta.Unmarshal(m, b)
-}
-func (m *Meta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Meta.Marshal(b, m, deterministic)
-}
-func (m *Meta) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Meta.Merge(m, src)
-}
-func (m *Meta) XXX_Size() int {
-	return xxx_messageInfo_Meta.Size(m)
-}
-func (m *Meta) XXX_DiscardUnknown() {
-	xxx_messageInfo_Meta.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Meta proto.InternalMessageInfo
-
-func (m *Meta) GetPuid() string {
-	if m != nil {
-		return m.Puid
-	}
-	return ""
-}
-
-func (m *Meta) GetTags() map[string]*_struct.Value {
-	if m != nil {
-		return m.Tags
-	}
-	return nil
-}
-
-func (m *Meta) GetRouting() map[string]int32 {
-	if m != nil {
-		return m.Routing
-	}
-	return nil
-}
-
-func (m *Meta) GetRequestPath() map[string]string {
-	if m != nil {
-		return m.RequestPath
-	}
-	return nil
-}
-
-func (m *Meta) GetMetrics() []*Metric {
-	if m != nil {
-		return m.Metrics
-	}
-	return nil
-}
-
-type Metric struct {
-	Key                  string            `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Type                 Metric_MetricType `protobuf:"varint,2,opt,name=type,proto3,enum=seldon.protos.Metric_MetricType" json:"type,omitempty"`
-	Value                float32           `protobuf:"fixed32,3,opt,name=value,proto3" json:"value,omitempty"`
-	Tags                 map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *Metric) Reset()         { *m = Metric{} }
-func (m *Metric) String() string { return proto.CompactTextString(m) }
-func (*Metric) ProtoMessage()    {}
-func (*Metric) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{4}
-}
-
-func (m *Metric) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Metric.Unmarshal(m, b)
-}
-func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Metric.Marshal(b, m, deterministic)
-}
-func (m *Metric) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Metric.Merge(m, src)
-}
-func (m *Metric) XXX_Size() int {
-	return xxx_messageInfo_Metric.Size(m)
-}
-func (m *Metric) XXX_DiscardUnknown() {
-	xxx_messageInfo_Metric.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Metric proto.InternalMessageInfo
-
-func (m *Metric) GetKey() string {
-	if m != nil {
-		return m.Key
-	}
-	return ""
-}
-
-func (m *Metric) GetType() Metric_MetricType {
-	if m != nil {
-		return m.Type
-	}
-	return Metric_COUNTER
-}
-
-func (m *Metric) GetValue() float32 {
-	if m != nil {
-		return m.Value
-	}
-	return 0
-}
-
-func (m *Metric) GetTags() map[string]string {
-	if m != nil {
-		return m.Tags
-	}
-	return nil
-}
-
-type SeldonMessageList struct {
-	SeldonMessages       []*SeldonMessage `protobuf:"bytes,1,rep,name=seldonMessages,proto3" json:"seldonMessages,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
-}
-
-func (m *SeldonMessageList) Reset()         { *m = SeldonMessageList{} }
-func (m *SeldonMessageList) String() string { return proto.CompactTextString(m) }
-func (*SeldonMessageList) ProtoMessage()    {}
-func (*SeldonMessageList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{5}
-}
-
-func (m *SeldonMessageList) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SeldonMessageList.Unmarshal(m, b)
-}
-func (m *SeldonMessageList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SeldonMessageList.Marshal(b, m, deterministic)
-}
-func (m *SeldonMessageList) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SeldonMessageList.Merge(m, src)
-}
-func (m *SeldonMessageList) XXX_Size() int {
-	return xxx_messageInfo_SeldonMessageList.Size(m)
-}
-func (m *SeldonMessageList) XXX_DiscardUnknown() {
-	xxx_messageInfo_SeldonMessageList.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SeldonMessageList proto.InternalMessageInfo
-
-func (m *SeldonMessageList) GetSeldonMessages() []*SeldonMessage {
-	if m != nil {
-		return m.SeldonMessages
-	}
-	return nil
-}
-
-type Status struct {
-	Code                 int32             `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
-	Info                 string            `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"`
-	Reason               string            `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"`
-	Status               Status_StatusFlag `protobuf:"varint,4,opt,name=status,proto3,enum=seldon.protos.Status_StatusFlag" json:"status,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *Status) Reset()         { *m = Status{} }
-func (m *Status) String() string { return proto.CompactTextString(m) }
-func (*Status) ProtoMessage()    {}
-func (*Status) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{6}
-}
-
-func (m *Status) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Status.Unmarshal(m, b)
-}
-func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Status.Marshal(b, m, deterministic)
-}
-func (m *Status) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Status.Merge(m, src)
-}
-func (m *Status) XXX_Size() int {
-	return xxx_messageInfo_Status.Size(m)
-}
-func (m *Status) XXX_DiscardUnknown() {
-	xxx_messageInfo_Status.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Status proto.InternalMessageInfo
-
-func (m *Status) GetCode() int32 {
-	if m != nil {
-		return m.Code
-	}
-	return 0
-}
-
-func (m *Status) GetInfo() string {
-	if m != nil {
-		return m.Info
-	}
-	return ""
-}
-
-func (m *Status) GetReason() string {
-	if m != nil {
-		return m.Reason
-	}
-	return ""
-}
-
-func (m *Status) GetStatus() Status_StatusFlag {
-	if m != nil {
-		return m.Status
-	}
-	return Status_SUCCESS
-}
-
-type Feedback struct {
-	Request              *SeldonMessage `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
-	Response             *SeldonMessage `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"`
-	Reward               float32        `protobuf:"fixed32,3,opt,name=reward,proto3" json:"reward,omitempty"`
-	Truth                *SeldonMessage `protobuf:"bytes,4,opt,name=truth,proto3" json:"truth,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Feedback) Reset()         { *m = Feedback{} }
-func (m *Feedback) String() string { return proto.CompactTextString(m) }
-func (*Feedback) ProtoMessage()    {}
-func (*Feedback) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{7}
-}
-
-func (m *Feedback) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Feedback.Unmarshal(m, b)
-}
-func (m *Feedback) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Feedback.Marshal(b, m, deterministic)
-}
-func (m *Feedback) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Feedback.Merge(m, src)
-}
-func (m *Feedback) XXX_Size() int {
-	return xxx_messageInfo_Feedback.Size(m)
-}
-func (m *Feedback) XXX_DiscardUnknown() {
-	xxx_messageInfo_Feedback.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Feedback proto.InternalMessageInfo
-
-func (m *Feedback) GetRequest() *SeldonMessage {
-	if m != nil {
-		return m.Request
-	}
-	return nil
-}
-
-func (m *Feedback) GetResponse() *SeldonMessage {
-	if m != nil {
-		return m.Response
-	}
-	return nil
-}
-
-func (m *Feedback) GetReward() float32 {
-	if m != nil {
-		return m.Reward
-	}
-	return 0
-}
-
-func (m *Feedback) GetTruth() *SeldonMessage {
-	if m != nil {
-		return m.Truth
-	}
-	return nil
-}
-
-type RequestResponse struct {
-	Request              *SeldonMessage `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
-	Response             *SeldonMessage `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *RequestResponse) Reset()         { *m = RequestResponse{} }
-func (m *RequestResponse) String() string { return proto.CompactTextString(m) }
-func (*RequestResponse) ProtoMessage()    {}
-func (*RequestResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_430b55197713f541, []int{8}
-}
-
-func (m *RequestResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RequestResponse.Unmarshal(m, b)
-}
-func (m *RequestResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RequestResponse.Marshal(b, m, deterministic)
-}
-func (m *RequestResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RequestResponse.Merge(m, src)
-}
-func (m *RequestResponse) XXX_Size() int {
-	return xxx_messageInfo_RequestResponse.Size(m)
-}
-func (m *RequestResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_RequestResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RequestResponse proto.InternalMessageInfo
-
-func (m *RequestResponse) GetRequest() *SeldonMessage {
-	if m != nil {
-		return m.Request
-	}
-	return nil
-}
-
-func (m *RequestResponse) GetResponse() *SeldonMessage {
-	if m != nil {
-		return m.Response
-	}
-	return nil
-}
-
-func init() {
-	proto.RegisterEnum("seldon.protos.Metric_MetricType", Metric_MetricType_name, Metric_MetricType_value)
-	proto.RegisterEnum("seldon.protos.Status_StatusFlag", Status_StatusFlag_name, Status_StatusFlag_value)
-	proto.RegisterType((*SeldonMessage)(nil), "seldon.protos.SeldonMessage")
-	proto.RegisterType((*DefaultData)(nil), "seldon.protos.DefaultData")
-	proto.RegisterType((*Tensor)(nil), "seldon.protos.Tensor")
-	proto.RegisterType((*Meta)(nil), "seldon.protos.Meta")
-	proto.RegisterMapType((map[string]string)(nil), "seldon.protos.Meta.RequestPathEntry")
-	proto.RegisterMapType((map[string]int32)(nil), "seldon.protos.Meta.RoutingEntry")
-	proto.RegisterMapType((map[string]*_struct.Value)(nil), "seldon.protos.Meta.TagsEntry")
-	proto.RegisterType((*Metric)(nil), "seldon.protos.Metric")
-	proto.RegisterMapType((map[string]string)(nil), "seldon.protos.Metric.TagsEntry")
-	proto.RegisterType((*SeldonMessageList)(nil), "seldon.protos.SeldonMessageList")
-	proto.RegisterType((*Status)(nil), "seldon.protos.Status")
-	proto.RegisterType((*Feedback)(nil), "seldon.protos.Feedback")
-	proto.RegisterType((*RequestResponse)(nil), "seldon.protos.RequestResponse")
-}
-
-func init() { proto.RegisterFile("prediction.proto", fileDescriptor_430b55197713f541) }
-
-var fileDescriptor_430b55197713f541 = []byte{
-	// 1032 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xdb, 0x6e, 0x23, 0x45,
-	0x10, 0xf5, 0xd8, 0x1e, 0x3b, 0x2e, 0x67, 0xb3, 0xb3, 0xcd, 0x5e, 0x2c, 0x6b, 0x11, 0x96, 0x85,
-	0x96, 0x08, 0xb1, 0x1e, 0xf0, 0x2e, 0x10, 0xe5, 0x61, 0xa5, 0x5c, 0x9c, 0x8b, 0xb4, 0xd9, 0x44,
-	0x6d, 0x07, 0x69, 0x91, 0x10, 0x6a, 0x7b, 0xda, 0x93, 0x21, 0xf6, 0xb4, 0xe9, 0xee, 0x21, 0xca,
-	0x33, 0xe2, 0x81, 0x0f, 0x40, 0x02, 0x3e, 0x81, 0x2f, 0xe1, 0x0d, 0xf1, 0x47, 0xa8, 0x2f, 0x63,
-	0x3b, 0x83, 0xd7, 0x79, 0x88, 0x85, 0x78, 0x72, 0x77, 0xd5, 0x39, 0xa7, 0xba, 0xaa, 0xab, 0xda,
-	0x36, 0x78, 0x13, 0x4e, 0x83, 0x68, 0x20, 0x23, 0x16, 0xb7, 0x26, 0x9c, 0x49, 0x86, 0xee, 0x09,
-	0x3a, 0x0a, 0xd2, 0x9d, 0xa8, 0x3f, 0x0d, 0x19, 0x0b, 0x47, 0xd4, 0xd7, 0xdb, 0x7e, 0x32, 0xf4,
-	0x85, 0xe4, 0xc9, 0x40, 0x1a, 0x77, 0xfd, 0x99, 0xa4, 0xb1, 0x60, 0x7c, 0x38, 0x62, 0x57, 0xfe,
-	0x80, 0x71, 0xea, 0x0f, 0x39, 0x19, 0xd3, 0x2b, 0xc6, 0x2f, 0x7d, 0xe3, 0x31, 0xb8, 0xe6, 0x2f,
-	0x79, 0xb8, 0xd7, 0xd5, 0xba, 0x27, 0x54, 0x08, 0x12, 0x52, 0xf4, 0x1c, 0x4a, 0x42, 0x12, 0x99,
-	0x88, 0x9a, 0xd3, 0x70, 0x36, 0xab, 0xed, 0x47, 0xad, 0x1b, 0x71, 0x5b, 0x5d, 0xed, 0xc4, 0x16,
-	0x84, 0x3e, 0x82, 0xe2, 0x98, 0x4a, 0x52, 0xcb, 0x6b, 0xf0, 0x7b, 0x19, 0xf0, 0x09, 0x95, 0x04,
-	0x6b, 0x00, 0xfa, 0x14, 0x8a, 0x01, 0x91, 0xa4, 0x56, 0xd0, 0xc0, 0x7a, 0x06, 0xb8, 0x4f, 0x87,
-	0x24, 0x19, 0xc9, 0x7d, 0x22, 0xc9, 0x51, 0x0e, 0x6b, 0x24, 0xaa, 0x43, 0xb9, 0x1f, 0xc5, 0xca,
-	0x54, 0x2b, 0x36, 0x9c, 0xcd, 0xf5, 0xa3, 0x1c, 0x4e, 0x0d, 0xca, 0x27, 0x24, 0xd7, 0x3e, 0xb7,
-	0xe1, 0x6c, 0x56, 0x94, 0xcf, 0x1a, 0xd0, 0x4b, 0x58, 0xfb, 0x4e, 0x30, 0x43, 0x2c, 0xe9, 0x68,
-	0x8f, 0x5b, 0xa6, 0x58, 0xad, 0xb4, 0x58, 0xad, 0xaf, 0xc8, 0x28, 0xa1, 0x47, 0x39, 0x3c, 0x45,
-	0xee, 0xae, 0x03, 0xa8, 0xa8, 0xdf, 0xb2, 0x98, 0xb2, 0x61, 0xf3, 0x6f, 0x07, 0xaa, 0x73, 0x67,
-	0x42, 0x0f, 0xc1, 0x8d, 0xc9, 0x98, 0xaa, 0xa2, 0x14, 0x36, 0x2b, 0xd8, 0x6c, 0x90, 0x0f, 0x25,
-	0x53, 0x4d, 0x9b, 0x7e, 0xb6, 0x56, 0x3d, 0xed, 0x3c, 0xca, 0x61, 0x0b, 0x43, 0x5f, 0x40, 0x39,
-	0x0e, 0x08, 0xe7, 0xe4, 0x7a, 0x5a, 0x87, 0xec, 0xc9, 0x5e, 0x47, 0x42, 0xa6, 0xa7, 0x4b, 0xc1,
-	0xe8, 0x73, 0x58, 0x93, 0x43, 0x1b, 0xaa, 0xa8, 0x89, 0x4f, 0x5a, 0xb3, 0x1b, 0xb6, 0x71, 0xce,
-	0x94, 0x84, 0xca, 0x29, 0x85, 0x66, 0x72, 0x7a, 0x05, 0x25, 0x03, 0x44, 0x35, 0x70, 0xc5, 0x05,
-	0x99, 0x50, 0x9d, 0x8d, 0xbb, 0x9b, 0xf7, 0x1c, 0x6c, 0x0c, 0xa8, 0x0e, 0xa5, 0x1f, 0x54, 0x70,
-	0x51, 0xcb, 0x37, 0x0a, 0x9b, 0x8e, 0x76, 0x59, 0x4b, 0xf3, 0xaf, 0x02, 0x14, 0xd5, 0x85, 0x22,
-	0x04, 0xc5, 0x49, 0x12, 0x05, 0xba, 0x41, 0x2a, 0x58, 0xaf, 0xd1, 0x67, 0x50, 0x94, 0x24, 0x34,
-	0xb4, 0x6a, 0xfb, 0xfd, 0x05, 0x7d, 0xd0, 0xea, 0x91, 0x50, 0x74, 0x62, 0xc9, 0xaf, 0xb1, 0x86,
-	0xa2, 0x6d, 0x28, 0x73, 0x96, 0xc8, 0x28, 0x0e, 0x6b, 0x05, 0xcd, 0x6a, 0x2c, 0x62, 0x61, 0x03,
-	0x31, 0xc4, 0x94, 0x80, 0x0e, 0xa0, 0xca, 0xe9, 0xf7, 0x09, 0x15, 0xf2, 0x8c, 0xc8, 0x8b, 0x5a,
-	0x51, 0xf3, 0x3f, 0x5c, 0xc8, 0x9f, 0xc1, 0x8c, 0xc6, 0x3c, 0x11, 0xf9, 0x50, 0x1e, 0x53, 0xc9,
-	0xa3, 0x81, 0xa8, 0xb9, 0x5a, 0xe3, 0xd1, 0xbf, 0x35, 0x78, 0x34, 0xc0, 0x29, 0xaa, 0x7e, 0x0a,
-	0x95, 0x69, 0x1e, 0xc8, 0x83, 0xc2, 0x25, 0xbd, 0xb6, 0x75, 0x50, 0x4b, 0xf4, 0x09, 0xb8, 0xba,
-	0x5a, 0xb6, 0x21, 0xde, 0xd1, 0x78, 0xd8, 0x80, 0xb6, 0xf3, 0x5b, 0x4e, 0x7d, 0x1b, 0xd6, 0xe7,
-	0x53, 0x5c, 0xa0, 0xf9, 0x70, 0x5e, 0xd3, 0x9d, 0xe7, 0xbe, 0x02, 0x2f, 0x9b, 0xde, 0x6d, 0xfc,
-	0xca, 0x1c, 0xbf, 0xf9, 0x53, 0x1e, 0x4a, 0x26, 0xc1, 0x05, 0xb4, 0x97, 0x50, 0x94, 0xd7, 0x13,
-	0xc3, 0xda, 0x58, 0x74, 0x37, 0x3c, 0x1a, 0xd8, 0x8f, 0xde, 0xf5, 0x84, 0x62, 0x8d, 0x9e, 0x05,
-	0x53, 0xfd, 0x9d, 0xb7, 0xc1, 0xd0, 0x0b, 0xdb, 0x1d, 0xe6, 0x9e, 0x3e, 0x58, 0xac, 0x95, 0xe9,
-	0x8f, 0xfa, 0x97, 0xcb, 0x4b, 0xfd, 0xee, 0xb4, 0x7c, 0x80, 0xd9, 0xb9, 0x50, 0x15, 0xca, 0x7b,
-	0xa7, 0xe7, 0x6f, 0x7a, 0x1d, 0xec, 0xe5, 0x50, 0x05, 0xdc, 0xc3, 0x9d, 0xf3, 0xc3, 0x8e, 0xe7,
-	0xa8, 0x65, 0xef, 0xf8, 0xa4, 0x83, 0xbd, 0x7c, 0xf3, 0x2d, 0x3c, 0xb8, 0xf1, 0x08, 0xaa, 0x19,
-	0x44, 0xfb, 0xb0, 0x21, 0xe6, 0x8d, 0x66, 0xf6, 0xab, 0xed, 0xa7, 0xd9, 0x07, 0x71, 0x1e, 0x84,
-	0x33, 0x9c, 0xe6, 0x1f, 0x0e, 0x94, 0xcc, 0x93, 0xa9, 0xc6, 0x66, 0xc0, 0x02, 0xaa, 0x73, 0x70,
-	0xb1, 0x5e, 0x2b, 0x5b, 0x14, 0x0f, 0x99, 0xcd, 0x41, 0xaf, 0xd1, 0x63, 0x28, 0x71, 0x4a, 0x04,
-	0x8b, 0x75, 0x0d, 0x2b, 0xd8, 0xee, 0xd0, 0xd6, 0xf4, 0x65, 0x2e, 0x2e, 0xbc, 0x12, 0x13, 0xc6,
-	0x7e, 0x1c, 0x8c, 0x48, 0x98, 0x3e, 0xd2, 0xcd, 0x67, 0x00, 0x33, 0xab, 0x2a, 0x48, 0xf7, 0x7c,
-	0x6f, 0xaf, 0xd3, 0xed, 0x7a, 0x39, 0xb5, 0x39, 0xd8, 0x39, 0x7e, 0x7d, 0x8e, 0x3b, 0x9e, 0xd3,
-	0xfc, 0xd3, 0x81, 0xb5, 0x03, 0x4a, 0x83, 0x3e, 0x19, 0x5c, 0xaa, 0xb7, 0xca, 0x4e, 0x8a, 0xfd,
-	0x26, 0x58, 0x9e, 0x78, 0x0a, 0x46, 0x5b, 0xb0, 0xc6, 0xa9, 0x98, 0xb0, 0x58, 0xa4, 0x53, 0xb0,
-	0x9c, 0x38, 0x45, 0x9b, 0xc4, 0xaf, 0x08, 0x0f, 0x6c, 0xf3, 0xd8, 0x1d, 0x6a, 0x83, 0x2b, 0x79,
-	0xa2, 0xc7, 0xfc, 0x76, 0x39, 0x03, 0x6d, 0xfe, 0xe8, 0xc0, 0x7d, 0x3b, 0x1b, 0x38, 0xd5, 0xff,
-	0xcf, 0x33, 0x6a, 0xff, 0x5c, 0x80, 0xf2, 0x21, 0x8d, 0xa9, 0x9a, 0xb0, 0x37, 0xb0, 0xd1, 0xe3,
-	0x24, 0x16, 0x43, 0xc6, 0xc7, 0xc7, 0xf1, 0x24, 0x91, 0x68, 0xa9, 0x4a, 0x7d, 0xa9, 0xb7, 0x99,
-	0x43, 0xa7, 0x70, 0x7f, 0xaa, 0x77, 0x9a, 0xc8, 0xbb, 0x0b, 0x76, 0xc0, 0x55, 0x2f, 0x11, 0xbd,
-	0xa3, 0xcc, 0x09, 0x54, 0x76, 0xc2, 0x90, 0xd3, 0x90, 0x48, 0x8a, 0x1a, 0xcb, 0xc0, 0x6a, 0xcc,
-	0x6e, 0x95, 0x3b, 0x84, 0xf5, 0x2e, 0x8d, 0x83, 0x69, 0x5b, 0x3e, 0xc9, 0xe0, 0x53, 0xc7, 0x6d,
-	0x42, 0xed, 0xdf, 0x1c, 0x70, 0x4f, 0x58, 0x40, 0x47, 0xe8, 0x10, 0xca, 0x67, 0xe6, 0xd7, 0xd5,
-	0x1d, 0x53, 0x5d, 0xd9, 0xd9, 0x7e, 0x75, 0xa0, 0xa4, 0x6b, 0xcf, 0x57, 0x75, 0x0b, 0x2b, 0x3b,
-	0xda, 0x37, 0x50, 0x9d, 0xb6, 0x19, 0xe5, 0xab, 0xee, 0xe2, 0x76, 0x00, 0x0f, 0x4c, 0xf3, 0xce,
-	0x07, 0x59, 0x75, 0x6b, 0xb7, 0xdf, 0xc2, 0xda, 0x1e, 0x1b, 0xf7, 0xa3, 0x98, 0xf2, 0x15, 0xf7,
-	0x67, 0xfb, 0x77, 0xf5, 0xc0, 0x6b, 0xdb, 0xff, 0xaf, 0xaf, 0x76, 0xcf, 0xc0, 0x8b, 0xd8, 0x4d,
-	0xcc, 0xae, 0x77, 0x36, 0xfd, 0x67, 0xa1, 0x7f, 0x31, 0x8a, 0xaf, 0x3f, 0x0e, 0x23, 0x79, 0x91,
-	0xf4, 0x5b, 0x03, 0x36, 0xf6, 0x0d, 0x36, 0x62, 0x76, 0xf1, 0x5c, 0xff, 0x79, 0x08, 0x99, 0x3f,
-	0xb9, 0x0c, 0x7d, 0x32, 0x89, 0xfa, 0x25, 0xad, 0xf2, 0xe2, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff,
-	0x0e, 0x7e, 0x3f, 0x3e, 0xa0, 0x0c, 0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// GenericClient is the client API for Generic service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GenericClient interface {
-	TransformInput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	TransformOutput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	Route(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	Aggregate(ctx context.Context, in *SeldonMessageList, opts ...grpc.CallOption) (*SeldonMessage, error)
-	SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type genericClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewGenericClient(cc *grpc.ClientConn) GenericClient {
-	return &genericClient{cc}
-}
-
-func (c *genericClient) TransformInput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Generic/TransformInput", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *genericClient) TransformOutput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Generic/TransformOutput", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *genericClient) Route(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Generic/Route", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *genericClient) Aggregate(ctx context.Context, in *SeldonMessageList, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Generic/Aggregate", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *genericClient) SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Generic/SendFeedback", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// GenericServer is the server API for Generic service.
-type GenericServer interface {
-	TransformInput(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	TransformOutput(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	Route(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	Aggregate(context.Context, *SeldonMessageList) (*SeldonMessage, error)
-	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
-}
-
-// UnimplementedGenericServer can be embedded to have forward compatible implementations.
-type UnimplementedGenericServer struct {
-}
-
-func (*UnimplementedGenericServer) TransformInput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TransformInput not implemented")
-}
-func (*UnimplementedGenericServer) TransformOutput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TransformOutput not implemented")
-}
-func (*UnimplementedGenericServer) Route(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Route not implemented")
-}
-func (*UnimplementedGenericServer) Aggregate(ctx context.Context, req *SeldonMessageList) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Aggregate not implemented")
-}
-func (*UnimplementedGenericServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
-}
-
-func RegisterGenericServer(s *grpc.Server, srv GenericServer) {
-	s.RegisterService(&_Generic_serviceDesc, srv)
-}
-
-func _Generic_TransformInput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GenericServer).TransformInput(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Generic/TransformInput",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GenericServer).TransformInput(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Generic_TransformOutput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GenericServer).TransformOutput(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Generic/TransformOutput",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GenericServer).TransformOutput(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Generic_Route_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GenericServer).Route(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Generic/Route",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GenericServer).Route(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Generic_Aggregate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessageList)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GenericServer).Aggregate(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Generic/Aggregate",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GenericServer).Aggregate(ctx, req.(*SeldonMessageList))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Generic_SendFeedback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Feedback)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GenericServer).SendFeedback(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Generic/SendFeedback",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GenericServer).SendFeedback(ctx, req.(*Feedback))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Generic_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Generic",
-	HandlerType: (*GenericServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "TransformInput",
-			Handler:    _Generic_TransformInput_Handler,
-		},
-		{
-			MethodName: "TransformOutput",
-			Handler:    _Generic_TransformOutput_Handler,
-		},
-		{
-			MethodName: "Route",
-			Handler:    _Generic_Route_Handler,
-		},
-		{
-			MethodName: "Aggregate",
-			Handler:    _Generic_Aggregate_Handler,
-		},
-		{
-			MethodName: "SendFeedback",
-			Handler:    _Generic_SendFeedback_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// ModelClient is the client API for Model service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ModelClient interface {
-	Predict(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type modelClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewModelClient(cc *grpc.ClientConn) ModelClient {
-	return &modelClient{cc}
-}
-
-func (c *modelClient) Predict(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Model/Predict", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *modelClient) SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Model/SendFeedback", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// ModelServer is the server API for Model service.
-type ModelServer interface {
-	Predict(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
-}
-
-// UnimplementedModelServer can be embedded to have forward compatible implementations.
-type UnimplementedModelServer struct {
-}
-
-func (*UnimplementedModelServer) Predict(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Predict not implemented")
-}
-func (*UnimplementedModelServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
-}
-
-func RegisterModelServer(s *grpc.Server, srv ModelServer) {
-	s.RegisterService(&_Model_serviceDesc, srv)
-}
-
-func _Model_Predict_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ModelServer).Predict(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Model/Predict",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ModelServer).Predict(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Model_SendFeedback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Feedback)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ModelServer).SendFeedback(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Model/SendFeedback",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ModelServer).SendFeedback(ctx, req.(*Feedback))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Model_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Model",
-	HandlerType: (*ModelServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "Predict",
-			Handler:    _Model_Predict_Handler,
-		},
-		{
-			MethodName: "SendFeedback",
-			Handler:    _Model_SendFeedback_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// RouterClient is the client API for Router service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type RouterClient interface {
-	Route(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type routerClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewRouterClient(cc *grpc.ClientConn) RouterClient {
-	return &routerClient{cc}
-}
-
-func (c *routerClient) Route(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Router/Route", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *routerClient) SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Router/SendFeedback", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// RouterServer is the server API for Router service.
-type RouterServer interface {
-	Route(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
-}
-
-// UnimplementedRouterServer can be embedded to have forward compatible implementations.
-type UnimplementedRouterServer struct {
-}
-
-func (*UnimplementedRouterServer) Route(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Route not implemented")
-}
-func (*UnimplementedRouterServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
-}
-
-func RegisterRouterServer(s *grpc.Server, srv RouterServer) {
-	s.RegisterService(&_Router_serviceDesc, srv)
-}
-
-func _Router_Route_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(RouterServer).Route(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Router/Route",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(RouterServer).Route(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Router_SendFeedback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Feedback)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(RouterServer).SendFeedback(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Router/SendFeedback",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(RouterServer).SendFeedback(ctx, req.(*Feedback))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Router_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Router",
-	HandlerType: (*RouterServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "Route",
-			Handler:    _Router_Route_Handler,
-		},
-		{
-			MethodName: "SendFeedback",
-			Handler:    _Router_SendFeedback_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// TransformerClient is the client API for Transformer service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type TransformerClient interface {
-	TransformInput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type transformerClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewTransformerClient(cc *grpc.ClientConn) TransformerClient {
-	return &transformerClient{cc}
-}
-
-func (c *transformerClient) TransformInput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Transformer/TransformInput", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// TransformerServer is the server API for Transformer service.
-type TransformerServer interface {
-	TransformInput(context.Context, *SeldonMessage) (*SeldonMessage, error)
-}
-
-// UnimplementedTransformerServer can be embedded to have forward compatible implementations.
-type UnimplementedTransformerServer struct {
-}
-
-func (*UnimplementedTransformerServer) TransformInput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TransformInput not implemented")
-}
-
-func RegisterTransformerServer(s *grpc.Server, srv TransformerServer) {
-	s.RegisterService(&_Transformer_serviceDesc, srv)
-}
-
-func _Transformer_TransformInput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(TransformerServer).TransformInput(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Transformer/TransformInput",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(TransformerServer).TransformInput(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Transformer_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Transformer",
-	HandlerType: (*TransformerServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "TransformInput",
-			Handler:    _Transformer_TransformInput_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// OutputTransformerClient is the client API for OutputTransformer service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type OutputTransformerClient interface {
-	TransformOutput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type outputTransformerClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewOutputTransformerClient(cc *grpc.ClientConn) OutputTransformerClient {
-	return &outputTransformerClient{cc}
-}
-
-func (c *outputTransformerClient) TransformOutput(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.OutputTransformer/TransformOutput", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// OutputTransformerServer is the server API for OutputTransformer service.
-type OutputTransformerServer interface {
-	TransformOutput(context.Context, *SeldonMessage) (*SeldonMessage, error)
-}
-
-// UnimplementedOutputTransformerServer can be embedded to have forward compatible implementations.
-type UnimplementedOutputTransformerServer struct {
-}
-
-func (*UnimplementedOutputTransformerServer) TransformOutput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TransformOutput not implemented")
-}
-
-func RegisterOutputTransformerServer(s *grpc.Server, srv OutputTransformerServer) {
-	s.RegisterService(&_OutputTransformer_serviceDesc, srv)
-}
-
-func _OutputTransformer_TransformOutput_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OutputTransformerServer).TransformOutput(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.OutputTransformer/TransformOutput",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OutputTransformerServer).TransformOutput(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _OutputTransformer_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.OutputTransformer",
-	HandlerType: (*OutputTransformerServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "TransformOutput",
-			Handler:    _OutputTransformer_TransformOutput_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// CombinerClient is the client API for Combiner service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type CombinerClient interface {
-	Aggregate(ctx context.Context, in *SeldonMessageList, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type combinerClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewCombinerClient(cc *grpc.ClientConn) CombinerClient {
-	return &combinerClient{cc}
-}
-
-func (c *combinerClient) Aggregate(ctx context.Context, in *SeldonMessageList, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Combiner/Aggregate", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// CombinerServer is the server API for Combiner service.
-type CombinerServer interface {
-	Aggregate(context.Context, *SeldonMessageList) (*SeldonMessage, error)
-}
-
-// UnimplementedCombinerServer can be embedded to have forward compatible implementations.
-type UnimplementedCombinerServer struct {
-}
-
-func (*UnimplementedCombinerServer) Aggregate(ctx context.Context, req *SeldonMessageList) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Aggregate not implemented")
-}
-
-func RegisterCombinerServer(s *grpc.Server, srv CombinerServer) {
-	s.RegisterService(&_Combiner_serviceDesc, srv)
-}
-
-func _Combiner_Aggregate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessageList)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(CombinerServer).Aggregate(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Combiner/Aggregate",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CombinerServer).Aggregate(ctx, req.(*SeldonMessageList))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Combiner_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Combiner",
-	HandlerType: (*CombinerServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "Aggregate",
-			Handler:    _Combiner_Aggregate_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
-
-// SeldonClient is the client API for Seldon service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type SeldonClient interface {
-	Predict(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error)
-	SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error)
-}
-
-type seldonClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewSeldonClient(cc *grpc.ClientConn) SeldonClient {
-	return &seldonClient{cc}
-}
-
-func (c *seldonClient) Predict(ctx context.Context, in *SeldonMessage, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Seldon/Predict", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *seldonClient) SendFeedback(ctx context.Context, in *Feedback, opts ...grpc.CallOption) (*SeldonMessage, error) {
-	out := new(SeldonMessage)
-	err := c.cc.Invoke(ctx, "/seldon.protos.Seldon/SendFeedback", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// SeldonServer is the server API for Seldon service.
-type SeldonServer interface {
-	Predict(context.Context, *SeldonMessage) (*SeldonMessage, error)
-	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
-}
-
-// UnimplementedSeldonServer can be embedded to have forward compatible implementations.
-type UnimplementedSeldonServer struct {
-}
-
-func (*UnimplementedSeldonServer) Predict(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Predict not implemented")
-}
-func (*UnimplementedSeldonServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
-}
-
-func RegisterSeldonServer(s *grpc.Server, srv SeldonServer) {
-	s.RegisterService(&_Seldon_serviceDesc, srv)
-}
-
-func _Seldon_Predict_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SeldonMessage)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(SeldonServer).Predict(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Seldon/Predict",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SeldonServer).Predict(ctx, req.(*SeldonMessage))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Seldon_SendFeedback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Feedback)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(SeldonServer).SendFeedback(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/seldon.protos.Seldon/SendFeedback",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SeldonServer).SendFeedback(ctx, req.(*Feedback))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Seldon_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "seldon.protos.Seldon",
-	HandlerType: (*SeldonServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "Predict",
-			Handler:    _Seldon_Predict_Handler,
-		},
-		{
-			MethodName: "SendFeedback",
-			Handler:    _Seldon_SendFeedback_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "prediction.proto",
-}
diff --git a/incubating/wrappers/s2i/go/Makefile b/incubating/wrappers/s2i/go/Makefile
index a0a36f7813..657e3b3e76 100644
--- a/incubating/wrappers/s2i/go/Makefile
+++ b/incubating/wrappers/s2i/go/Makefile
@@ -1,15 +1,20 @@
 
-
-.PHONY: compile_tensorflow_proto
-compile_tensorflow_proto:
-	./generate_tensorflow_proto.sh
+SELDON_CORE_DIR=../../../../
 
 .PHONY: compile_proto
 compile_proto:
-	cp ../../../proto/prediction.proto pkg/api
-	cd pkg/api && protoc -I. -I${GOPATH}/src/github.com/tensorflow/tensorflow --go_out=paths=source_relative,plugins=grpc:. prediction.proto
-	rm pkg/api/prediction.proto
+	rm -rf pkg/api && mkdir -p pkg/api
+
+	cp ${SELDON_CORE_DIR}/proto/prediction.proto pkg/api
+
+	$(MAKE) -C ${SELDON_CORE_DIR}/proto/tensorflow/ create_protos
+	cp -r $(SELDON_CORE_DIR)/proto/tensorflow/tensorflow pkg/api
+
+	cd pkg/api && protoc -I. -I./tensorflow --go_out=paths=source_relative,plugins=grpc:. *.proto
+	cd pkg/api && protoc -I. -I./tensorflow --go_out=paths=source_relative,plugins=grpc:. ./tensorflow/core/framework/*.proto
 
+	find ./pkg -name "*.pb.go" -type f -exec perl -e "s/github\.com\/tensorflow\/tensorflow\/tensorflow\/go/github\.com\/seldonio\/seldon-core\/incubating\/wrappers\/s2i\/go\/pkg\/api\/tensorflow/g" -pi {} +
+	find ./pkg -name "*.proto" -type f -delete
 
 .PHONY: build_docker
 build_docker:
diff --git a/incubating/wrappers/s2i/go/pkg/api/prediction.pb.go b/incubating/wrappers/s2i/go/pkg/api/prediction.pb.go
index 0de308c752..07bdec1031 100644
--- a/incubating/wrappers/s2i/go/pkg/api/prediction.pb.go
+++ b/incubating/wrappers/s2i/go/pkg/api/prediction.pb.go
@@ -8,8 +8,10 @@ import (
 	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
 	_struct "github.com/golang/protobuf/ptypes/struct"
-	framework "github.com/tensorflow/tensorflow/tensorflow/go/core/framework"
+	framework "github.com/seldonio/seldon-core/incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework"
 	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
 	math "math"
 )
 
@@ -84,6 +86,7 @@ type SeldonMessage struct {
 	//	*SeldonMessage_Data
 	//	*SeldonMessage_BinData
 	//	*SeldonMessage_StrData
+	//	*SeldonMessage_JsonData
 	DataOneof            isSeldonMessage_DataOneof `protobuf_oneof:"data_oneof"`
 	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
 	XXX_unrecognized     []byte                    `json:"-"`
@@ -145,12 +148,18 @@ type SeldonMessage_StrData struct {
 	StrData string `protobuf:"bytes,5,opt,name=strData,proto3,oneof"`
 }
 
+type SeldonMessage_JsonData struct {
+	JsonData *_struct.Value `protobuf:"bytes,6,opt,name=jsonData,proto3,oneof"`
+}
+
 func (*SeldonMessage_Data) isSeldonMessage_DataOneof() {}
 
 func (*SeldonMessage_BinData) isSeldonMessage_DataOneof() {}
 
 func (*SeldonMessage_StrData) isSeldonMessage_DataOneof() {}
 
+func (*SeldonMessage_JsonData) isSeldonMessage_DataOneof() {}
+
 func (m *SeldonMessage) GetDataOneof() isSeldonMessage_DataOneof {
 	if m != nil {
 		return m.DataOneof
@@ -179,12 +188,20 @@ func (m *SeldonMessage) GetStrData() string {
 	return ""
 }
 
+func (m *SeldonMessage) GetJsonData() *_struct.Value {
+	if x, ok := m.GetDataOneof().(*SeldonMessage_JsonData); ok {
+		return x.JsonData
+	}
+	return nil
+}
+
 // XXX_OneofWrappers is for the internal use of the proto package.
 func (*SeldonMessage) XXX_OneofWrappers() []interface{} {
 	return []interface{}{
 		(*SeldonMessage_Data)(nil),
 		(*SeldonMessage_BinData)(nil),
 		(*SeldonMessage_StrData)(nil),
+		(*SeldonMessage_JsonData)(nil),
 	}
 }
 
@@ -705,72 +722,73 @@ func init() {
 func init() { proto.RegisterFile("prediction.proto", fileDescriptor_430b55197713f541) }
 
 var fileDescriptor_430b55197713f541 = []byte{
-	// 1028 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xdb, 0x6e, 0x1b, 0x45,
-	0x18, 0xf6, 0xda, 0x5e, 0x3b, 0xfe, 0x9d, 0xa6, 0xdb, 0xa1, 0x07, 0xcb, 0x2a, 0xc2, 0xb2, 0x50,
-	0xc9, 0x05, 0xf5, 0x82, 0xcb, 0x21, 0x8a, 0x50, 0xa5, 0x1c, 0x9c, 0x83, 0xd4, 0x34, 0xd1, 0xd8,
-	0x41, 0x2a, 0x12, 0x42, 0x63, 0xef, 0x78, 0xb3, 0x8a, 0xbd, 0xb3, 0xcc, 0xcc, 0x12, 0x72, 0x8d,
-	0xb8, 0xe0, 0x0d, 0x80, 0x47, 0xe0, 0x49, 0xb8, 0x43, 0x3c, 0x01, 0xaf, 0x82, 0xe6, 0xb0, 0xb6,
-	0xe3, 0x1a, 0xe7, 0x22, 0x16, 0xea, 0x95, 0x67, 0xfe, 0xff, 0xfb, 0xbf, 0x99, 0x6f, 0xfe, 0x83,
-	0xbc, 0xe0, 0x25, 0x9c, 0x06, 0xd1, 0x40, 0x46, 0x2c, 0x6e, 0x25, 0x9c, 0x49, 0x86, 0xee, 0x09,
-	0x3a, 0x0a, 0xb2, 0x9d, 0xa8, 0x3f, 0x0d, 0x19, 0x0b, 0x47, 0xd4, 0xd7, 0xdb, 0x7e, 0x3a, 0xf4,
-	0x85, 0xe4, 0xe9, 0x40, 0x1a, 0x77, 0xfd, 0x99, 0xa4, 0xb1, 0x60, 0x7c, 0x38, 0x62, 0x57, 0xfe,
-	0x80, 0x71, 0xea, 0x0f, 0x39, 0x19, 0xd3, 0x2b, 0xc6, 0x2f, 0x7d, 0xe3, 0x31, 0xb8, 0xe6, 0x3f,
-	0x0e, 0xdc, 0xeb, 0x6a, 0xde, 0x13, 0x2a, 0x04, 0x09, 0x29, 0x7a, 0x0e, 0x25, 0x21, 0x89, 0x4c,
-	0x45, 0xcd, 0x69, 0x38, 0x9b, 0xd5, 0xf6, 0xa3, 0xd6, 0x8d, 0x73, 0x5b, 0x5d, 0xed, 0xc4, 0x16,
-	0x84, 0x3e, 0x82, 0xe2, 0x98, 0x4a, 0x52, 0xcb, 0x6b, 0xf0, 0x7b, 0x73, 0xe0, 0x13, 0x2a, 0x09,
-	0xd6, 0x00, 0xf4, 0x09, 0x14, 0x03, 0x22, 0x49, 0xad, 0xa0, 0x81, 0xf5, 0x39, 0xe0, 0x3e, 0x1d,
-	0x92, 0x74, 0x24, 0xf7, 0x89, 0x24, 0x47, 0x39, 0xac, 0x91, 0xa8, 0x0e, 0xe5, 0x7e, 0x14, 0x2b,
-	0x53, 0xad, 0xd8, 0x70, 0x36, 0xd7, 0x8f, 0x72, 0x38, 0x33, 0x28, 0x9f, 0x90, 0x5c, 0xfb, 0xdc,
-	0x86, 0xb3, 0x59, 0x51, 0x3e, 0x6b, 0xd8, 0x5d, 0x07, 0x50, 0xf1, 0xdf, 0xb1, 0x98, 0xb2, 0x61,
-	0xf3, 0x6f, 0x07, 0xaa, 0x33, 0xec, 0xe8, 0x21, 0xb8, 0x31, 0x19, 0x53, 0x25, 0xaf, 0xb0, 0x59,
-	0xc1, 0x66, 0x83, 0x7c, 0x28, 0x99, 0x77, 0xb1, 0x42, 0xe6, 0x55, 0xf7, 0xb4, 0xf3, 0x28, 0x87,
-	0x2d, 0x0c, 0x7d, 0x01, 0xe5, 0x38, 0x20, 0x9c, 0x93, 0xeb, 0x89, 0x22, 0x93, 0x90, 0x56, 0x96,
-	0x90, 0xd6, 0xab, 0x48, 0xc8, 0xaf, 0xc9, 0x28, 0xa5, 0xea, 0x72, 0x16, 0x8c, 0x3e, 0x87, 0x35,
-	0x39, 0xb4, 0x47, 0x15, 0x75, 0xe0, 0x93, 0xd6, 0x34, 0x57, 0xf6, 0x9c, 0x33, 0x45, 0x71, 0x94,
-	0xc3, 0x13, 0xe8, 0x9c, 0xa6, 0x97, 0x50, 0x32, 0x40, 0x54, 0x03, 0x57, 0x5c, 0x90, 0x84, 0x6a,
-	0x35, 0xee, 0x6e, 0xde, 0x73, 0xb0, 0x31, 0xa0, 0x3a, 0x94, 0x7e, 0x50, 0x87, 0x8b, 0x5a, 0xbe,
-	0x51, 0xd8, 0x74, 0xb4, 0xcb, 0x5a, 0x9a, 0x7f, 0x15, 0xa0, 0xa8, 0x52, 0x83, 0x10, 0x14, 0x93,
-	0x34, 0x0a, 0x74, 0xaa, 0x2b, 0x58, 0xaf, 0xd1, 0xa7, 0x50, 0x94, 0x24, 0x34, 0x61, 0xd5, 0xf6,
-	0xfb, 0x0b, 0x32, 0xda, 0xea, 0x91, 0x50, 0x74, 0x62, 0xc9, 0xaf, 0xb1, 0x86, 0xa2, 0x6d, 0x28,
-	0x73, 0x96, 0xca, 0x28, 0x0e, 0x6b, 0x05, 0x1d, 0xd5, 0x58, 0x14, 0x85, 0x0d, 0xc4, 0x04, 0x66,
-	0x01, 0xe8, 0x00, 0xaa, 0x9c, 0x7e, 0x9f, 0x52, 0x21, 0xcf, 0x88, 0xbc, 0xa8, 0x15, 0x75, 0xfc,
-	0x87, 0x0b, 0xe3, 0xa7, 0x30, 0xc3, 0x31, 0x1b, 0x88, 0x7c, 0x28, 0x8f, 0xa9, 0xe4, 0xd1, 0x40,
-	0xd4, 0x5c, 0xcd, 0xf1, 0xe8, 0x6d, 0x0e, 0x1e, 0x0d, 0x70, 0x86, 0xaa, 0x9f, 0x42, 0x65, 0xa2,
-	0x03, 0x79, 0x50, 0xb8, 0xa4, 0xd7, 0xf6, 0x1d, 0xd4, 0x12, 0x7d, 0x0c, 0xae, 0x7e, 0x2d, 0x5b,
-	0x10, 0x8f, 0xdf, 0x4a, 0xaf, 0x4e, 0x2d, 0x36, 0xa0, 0xed, 0xfc, 0x96, 0x53, 0xdf, 0x86, 0xf5,
-	0x59, 0x89, 0x0b, 0x38, 0x1f, 0xce, 0x72, 0xba, 0xb3, 0xb1, 0x2f, 0xc1, 0x9b, 0x97, 0x77, 0x5b,
-	0x7c, 0x65, 0x26, 0xbe, 0xf9, 0x73, 0x1e, 0x4a, 0x46, 0xe0, 0x82, 0xb0, 0xcf, 0xa0, 0x28, 0xaf,
-	0x13, 0x13, 0xb5, 0xb1, 0x28, 0x37, 0x3c, 0x1a, 0xd8, 0x9f, 0xde, 0x75, 0x42, 0xb1, 0x46, 0x4f,
-	0x0f, 0x53, 0xf5, 0x9d, 0xb7, 0x87, 0xa1, 0x17, 0xb6, 0x3a, 0x4c, 0x9e, 0x3e, 0x58, 0xcc, 0x35,
-	0x57, 0x1f, 0xf5, 0x2f, 0x97, 0x3f, 0xf5, 0x7f, 0xcb, 0xf2, 0x01, 0xa6, 0xf7, 0x42, 0x55, 0x28,
-	0xef, 0x9d, 0x9e, 0xbf, 0xee, 0x75, 0xb0, 0x97, 0x43, 0x15, 0x70, 0x0f, 0x77, 0xce, 0x0f, 0x3b,
-	0x9e, 0xa3, 0x96, 0xbd, 0xe3, 0x93, 0x0e, 0xf6, 0xf2, 0xcd, 0x37, 0xf0, 0xe0, 0xc6, 0x38, 0x53,
-	0x3d, 0x88, 0xf6, 0x61, 0x43, 0xcc, 0x1a, 0x4d, 0xef, 0x57, 0xdb, 0x4f, 0xe7, 0x47, 0xdb, 0x2c,
-	0x08, 0xcf, 0xc5, 0x34, 0xff, 0x70, 0xa0, 0x64, 0x86, 0x9f, 0x6a, 0x9b, 0x01, 0x0b, 0xa8, 0xd6,
-	0xe0, 0x62, 0xbd, 0x56, 0xb6, 0x28, 0x1e, 0x32, 0xab, 0x41, 0xaf, 0xd1, 0x63, 0x28, 0x71, 0x4a,
-	0x04, 0x8b, 0xf5, 0x1b, 0x56, 0xb0, 0xdd, 0xa1, 0xad, 0xc9, 0x8c, 0x2d, 0x2e, 0x4c, 0x89, 0x39,
-	0xc6, 0xfe, 0x1c, 0x8c, 0x48, 0x98, 0x8d, 0xdb, 0xe6, 0x33, 0x80, 0xa9, 0x55, 0x3d, 0x48, 0xf7,
-	0x7c, 0x6f, 0xaf, 0xd3, 0xed, 0x7a, 0x39, 0xb5, 0x39, 0xd8, 0x39, 0x7e, 0x75, 0x8e, 0x3b, 0x9e,
-	0xd3, 0xfc, 0xd3, 0x81, 0xb5, 0x03, 0x4a, 0x83, 0x3e, 0x19, 0x5c, 0xaa, 0x59, 0x65, 0x3b, 0xc5,
-	0xce, 0xf4, 0xe5, 0xc2, 0x33, 0x30, 0xda, 0x82, 0x35, 0x4e, 0x45, 0xc2, 0x62, 0x91, 0x75, 0xc1,
-	0xf2, 0xc0, 0x09, 0xda, 0x08, 0xbf, 0x22, 0x3c, 0xb0, 0xc5, 0x63, 0x77, 0xa8, 0x0d, 0xae, 0xe4,
-	0xa9, 0x6e, 0xf3, 0xdb, 0xe9, 0x0c, 0xb4, 0xf9, 0x93, 0x03, 0xf7, 0x6d, 0x6f, 0xe0, 0x8c, 0xff,
-	0x7f, 0x57, 0xd4, 0xfe, 0xa5, 0x00, 0xe5, 0x43, 0x1a, 0x53, 0xd5, 0x61, 0xaf, 0x61, 0xa3, 0xc7,
-	0x49, 0x2c, 0x86, 0x8c, 0x8f, 0x8f, 0xe3, 0x24, 0x95, 0x68, 0x29, 0x4b, 0x7d, 0xa9, 0xb7, 0x99,
-	0x43, 0xa7, 0x70, 0x7f, 0xc2, 0x77, 0x9a, 0xca, 0xbb, 0x13, 0x76, 0xc0, 0x55, 0x93, 0x88, 0xde,
-	0x91, 0xe6, 0x04, 0x2a, 0x3b, 0x61, 0xc8, 0x69, 0x48, 0x24, 0x45, 0x8d, 0x65, 0x60, 0xd5, 0x66,
-	0xb7, 0xd2, 0x1d, 0xc2, 0x7a, 0x97, 0xc6, 0xc1, 0xa4, 0x2c, 0x9f, 0xcc, 0xe1, 0x33, 0xc7, 0x6d,
-	0x44, 0xed, 0xdf, 0x1c, 0x70, 0x4f, 0x58, 0x40, 0x47, 0xe8, 0x10, 0xca, 0x67, 0xe6, 0x7f, 0xd2,
-	0x1d, 0xa5, 0xae, 0xec, 0x6e, 0xbf, 0x3a, 0x50, 0xd2, 0x6f, 0xcf, 0x57, 0x95, 0x85, 0x95, 0x5d,
-	0xed, 0x5b, 0xa8, 0x4e, 0xca, 0x8c, 0xf2, 0x55, 0x57, 0x71, 0x3b, 0x80, 0x07, 0xa6, 0x78, 0x67,
-	0x0f, 0x59, 0x75, 0x69, 0xb7, 0xdf, 0xc0, 0xda, 0x1e, 0x1b, 0xf7, 0xa3, 0x98, 0xf2, 0x15, 0xd7,
-	0x67, 0xfb, 0x77, 0x35, 0xe0, 0xb5, 0xed, 0xdd, 0xab, 0xab, 0xdd, 0x3e, 0x78, 0x11, 0xbb, 0x89,
-	0xd9, 0xf5, 0xce, 0x26, 0xdf, 0x08, 0xfa, 0x1f, 0xa3, 0xf8, 0xe6, 0xab, 0x30, 0x92, 0x17, 0x69,
-	0xbf, 0x35, 0x60, 0x63, 0xdf, 0x60, 0x23, 0x66, 0x17, 0xcf, 0xf5, 0x67, 0x00, 0xfd, 0x91, 0x8c,
-	0x93, 0x11, 0x15, 0xfe, 0x15, 0x27, 0x49, 0x42, 0xb9, 0xf0, 0x43, 0xe6, 0x27, 0x97, 0xa1, 0x4f,
-	0x92, 0xa8, 0x5f, 0xd2, 0xbc, 0x2f, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x02, 0x18, 0x38, 0x4f,
-	0x7c, 0x0c, 0x00, 0x00,
+	// 1049 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xdd, 0x6e, 0x1b, 0x45,
+	0x14, 0xf6, 0xda, 0x5e, 0x3b, 0x3e, 0x4e, 0xd3, 0xed, 0xd0, 0x1f, 0xcb, 0x2a, 0xc2, 0xb2, 0x50,
+	0xc9, 0x05, 0xf5, 0x82, 0x5b, 0x20, 0xca, 0x45, 0xa5, 0xfc, 0x38, 0x3f, 0x52, 0xd3, 0x44, 0x63,
+	0x07, 0xa9, 0x48, 0x08, 0x8d, 0xbd, 0xe3, 0xcd, 0x12, 0x7b, 0x67, 0x99, 0x99, 0x25, 0xca, 0x35,
+	0xe2, 0x82, 0x07, 0x40, 0x02, 0x1e, 0x81, 0x27, 0xe1, 0x0e, 0xf1, 0x46, 0x68, 0x7e, 0xd6, 0x76,
+	0x8c, 0xeb, 0x5c, 0xc4, 0x42, 0xbd, 0xca, 0xcc, 0x39, 0xdf, 0xf7, 0x9d, 0x39, 0x67, 0xce, 0x99,
+	0xac, 0xc1, 0x4b, 0x38, 0x0d, 0xa2, 0x81, 0x8c, 0x58, 0xdc, 0x4a, 0x38, 0x93, 0x0c, 0xdd, 0x13,
+	0x74, 0x14, 0x64, 0x3b, 0x51, 0x7f, 0x1a, 0x32, 0x16, 0x8e, 0xa8, 0xaf, 0xb7, 0xfd, 0x74, 0xe8,
+	0x0b, 0xc9, 0xd3, 0x81, 0x34, 0xee, 0xfa, 0x33, 0x49, 0x63, 0xc1, 0xf8, 0x70, 0xc4, 0xae, 0xfc,
+	0x01, 0xe3, 0xd4, 0x1f, 0x72, 0x32, 0xa6, 0x57, 0x8c, 0x5f, 0xfa, 0xc6, 0x63, 0x70, 0xcd, 0x5f,
+	0xf3, 0x70, 0xaf, 0xab, 0x75, 0x4f, 0xa8, 0x10, 0x24, 0xa4, 0xe8, 0x39, 0x94, 0x84, 0x24, 0x32,
+	0x15, 0x35, 0xa7, 0xe1, 0x6c, 0x56, 0xdb, 0x8f, 0x5a, 0x37, 0xe2, 0xb6, 0xba, 0xda, 0x89, 0x2d,
+	0x08, 0x7d, 0x02, 0xc5, 0x31, 0x95, 0xa4, 0x96, 0xd7, 0xe0, 0x0f, 0xe6, 0xc0, 0x27, 0x54, 0x12,
+	0xac, 0x01, 0xe8, 0x33, 0x28, 0x06, 0x44, 0x92, 0x5a, 0x41, 0x03, 0xeb, 0x73, 0xc0, 0x7d, 0x3a,
+	0x24, 0xe9, 0x48, 0xee, 0x13, 0x49, 0x8e, 0x72, 0x58, 0x23, 0x51, 0x1d, 0xca, 0xfd, 0x28, 0x56,
+	0xa6, 0x5a, 0xb1, 0xe1, 0x6c, 0xae, 0x1f, 0xe5, 0x70, 0x66, 0x50, 0x3e, 0x21, 0xb9, 0xf6, 0xb9,
+	0x0d, 0x67, 0xb3, 0xa2, 0x7c, 0xd6, 0x80, 0x5e, 0xc2, 0xda, 0xf7, 0x82, 0x19, 0x62, 0x49, 0x47,
+	0x7b, 0xdc, 0x32, 0xc5, 0x6a, 0x65, 0xc5, 0x6a, 0x7d, 0x4d, 0x46, 0x29, 0x3d, 0xca, 0xe1, 0x09,
+	0x72, 0x77, 0x1d, 0x40, 0x45, 0xfd, 0x8e, 0xc5, 0x94, 0x0d, 0x9b, 0xff, 0x38, 0x50, 0x9d, 0x39,
+	0x13, 0x7a, 0x08, 0x6e, 0x4c, 0xc6, 0x54, 0x15, 0xa5, 0xb0, 0x59, 0xc1, 0x66, 0x83, 0x7c, 0x28,
+	0x99, 0x6a, 0xda, 0xf4, 0xe7, 0x6b, 0xd5, 0xd3, 0xce, 0xa3, 0x1c, 0xb6, 0x30, 0xf4, 0x25, 0x94,
+	0xe3, 0x80, 0x70, 0x4e, 0xae, 0x27, 0x75, 0x98, 0x3f, 0xd9, 0xeb, 0x48, 0xc8, 0xec, 0x74, 0x19,
+	0x18, 0x7d, 0x01, 0x6b, 0x72, 0x68, 0x43, 0x15, 0x35, 0xf1, 0x49, 0x6b, 0x7a, 0xc3, 0x36, 0xce,
+	0x99, 0x92, 0x50, 0x39, 0x65, 0xd0, 0xb9, 0x9c, 0x5e, 0x41, 0xc9, 0x00, 0x51, 0x0d, 0x5c, 0x71,
+	0x41, 0x12, 0xaa, 0xb3, 0x71, 0x77, 0xf3, 0x9e, 0x83, 0x8d, 0x01, 0xd5, 0xa1, 0xf4, 0xa3, 0x0a,
+	0x2e, 0x6a, 0xf9, 0x46, 0x61, 0xd3, 0xd1, 0x2e, 0x6b, 0x69, 0xfe, 0x5d, 0x80, 0xa2, 0xba, 0x50,
+	0x84, 0xa0, 0x98, 0xa4, 0x51, 0xa0, 0x1b, 0xa4, 0x82, 0xf5, 0x1a, 0x7d, 0x0e, 0x45, 0x49, 0x42,
+	0x43, 0xab, 0xb6, 0x3f, 0x5c, 0xd0, 0x07, 0xad, 0x1e, 0x09, 0x45, 0x27, 0x96, 0xfc, 0x1a, 0x6b,
+	0x28, 0xda, 0x86, 0x32, 0x67, 0xa9, 0x8c, 0xe2, 0xb0, 0x56, 0xd0, 0xac, 0xc6, 0x22, 0x16, 0x36,
+	0x10, 0x43, 0xcc, 0x08, 0xe8, 0x00, 0xaa, 0x9c, 0xfe, 0x90, 0x52, 0x21, 0xcf, 0x88, 0xbc, 0xa8,
+	0x15, 0x35, 0xff, 0xe3, 0x85, 0xfc, 0x29, 0xcc, 0x68, 0xcc, 0x12, 0x91, 0x0f, 0xe5, 0x31, 0x95,
+	0x3c, 0x1a, 0x88, 0x9a, 0xab, 0x35, 0x1e, 0xfd, 0x57, 0x83, 0x47, 0x03, 0x9c, 0xa1, 0xea, 0xa7,
+	0x50, 0x99, 0xe4, 0x81, 0x3c, 0x28, 0x5c, 0xd2, 0x6b, 0x5b, 0x07, 0xb5, 0x44, 0x9f, 0x82, 0xab,
+	0xab, 0x65, 0x1b, 0xe2, 0x1d, 0x8d, 0x87, 0x0d, 0x68, 0x3b, 0xbf, 0xe5, 0xd4, 0xb7, 0x61, 0x7d,
+	0x36, 0xc5, 0x05, 0x9a, 0x0f, 0x67, 0x35, 0xdd, 0x59, 0xee, 0x2b, 0xf0, 0xe6, 0xd3, 0xbb, 0x8d,
+	0x5f, 0x99, 0xe1, 0x37, 0x7f, 0xce, 0x43, 0xc9, 0x24, 0xb8, 0x80, 0xf6, 0x12, 0x8a, 0xf2, 0x3a,
+	0x31, 0xac, 0x8d, 0x45, 0x77, 0xc3, 0xa3, 0x81, 0xfd, 0xd3, 0xbb, 0x4e, 0x28, 0xd6, 0xe8, 0x69,
+	0x30, 0xd5, 0xdf, 0x79, 0x1b, 0x0c, 0xbd, 0xb0, 0xdd, 0x61, 0xee, 0xe9, 0xa3, 0xc5, 0x5a, 0x73,
+	0xfd, 0x51, 0xff, 0x6a, 0x79, 0xa9, 0xdf, 0x9d, 0x96, 0x0f, 0x30, 0x3d, 0x17, 0xaa, 0x42, 0x79,
+	0xef, 0xf4, 0xfc, 0x4d, 0xaf, 0x83, 0xbd, 0x1c, 0xaa, 0x80, 0x7b, 0xb8, 0x73, 0x7e, 0xd8, 0xf1,
+	0x1c, 0xb5, 0xec, 0x1d, 0x9f, 0x74, 0xb0, 0x97, 0x6f, 0xbe, 0x85, 0x07, 0x37, 0x1e, 0x41, 0x35,
+	0x83, 0x68, 0x1f, 0x36, 0xc4, 0xac, 0xd1, 0xcc, 0x7e, 0xb5, 0xfd, 0x74, 0xfe, 0x41, 0x9c, 0x05,
+	0xe1, 0x39, 0x4e, 0xf3, 0x4f, 0x07, 0x4a, 0xe6, 0xc9, 0x54, 0x63, 0x33, 0x60, 0x01, 0xd5, 0x39,
+	0xb8, 0x58, 0xaf, 0x95, 0x2d, 0x8a, 0x87, 0xcc, 0xe6, 0xa0, 0xd7, 0xe8, 0x31, 0x94, 0x38, 0x25,
+	0x82, 0xc5, 0xba, 0x86, 0x15, 0x6c, 0x77, 0x68, 0x6b, 0xf2, 0x32, 0x17, 0x17, 0x5e, 0x89, 0x09,
+	0x63, 0xff, 0x1c, 0x8c, 0x48, 0x98, 0x3d, 0xd2, 0xcd, 0x67, 0x00, 0x53, 0xab, 0x2a, 0x48, 0xf7,
+	0x7c, 0x6f, 0xaf, 0xd3, 0xed, 0x7a, 0x39, 0xb5, 0x39, 0xd8, 0x39, 0x7e, 0x7d, 0x8e, 0x3b, 0x9e,
+	0xd3, 0xfc, 0xcb, 0x81, 0xb5, 0x03, 0x4a, 0x83, 0x3e, 0x19, 0x5c, 0xaa, 0xb7, 0xca, 0x4e, 0x8a,
+	0xfd, 0x4f, 0xb0, 0x3c, 0xf1, 0x0c, 0x8c, 0xb6, 0x60, 0x8d, 0x53, 0x91, 0xb0, 0x58, 0x64, 0x53,
+	0xb0, 0x9c, 0x38, 0x41, 0x9b, 0xc4, 0xaf, 0x08, 0x0f, 0x6c, 0xf3, 0xd8, 0x1d, 0x6a, 0x83, 0x2b,
+	0x79, 0xaa, 0xc7, 0xfc, 0x76, 0x39, 0x03, 0x6d, 0xfe, 0xe4, 0xc0, 0x7d, 0x3b, 0x1b, 0x38, 0xd3,
+	0xff, 0xdf, 0x33, 0x6a, 0xff, 0x52, 0x80, 0xf2, 0x21, 0x8d, 0xa9, 0x9a, 0xb0, 0x37, 0xb0, 0xd1,
+	0xe3, 0x24, 0x16, 0x43, 0xc6, 0xc7, 0xc7, 0x71, 0x92, 0x4a, 0xb4, 0x54, 0xa5, 0xbe, 0xd4, 0xdb,
+	0xcc, 0xa1, 0x53, 0xb8, 0x3f, 0xd1, 0x3b, 0x4d, 0xe5, 0xdd, 0x05, 0x3b, 0xe0, 0xaa, 0x97, 0x88,
+	0xde, 0x51, 0xe6, 0x04, 0x2a, 0x3b, 0x61, 0xc8, 0x69, 0x48, 0x24, 0x45, 0x8d, 0x65, 0x60, 0x35,
+	0x66, 0xb7, 0xca, 0x1d, 0xc2, 0x7a, 0x97, 0xc6, 0xc1, 0xa4, 0x2d, 0x9f, 0xcc, 0xe1, 0x33, 0xc7,
+	0x6d, 0x42, 0xed, 0xdf, 0x1d, 0x70, 0x4f, 0x58, 0x40, 0x47, 0xe8, 0x10, 0xca, 0x67, 0xe6, 0xeb,
+	0xea, 0x8e, 0xa9, 0xae, 0xec, 0x6c, 0xbf, 0x39, 0x50, 0xd2, 0xb5, 0xe7, 0xab, 0xba, 0x85, 0x95,
+	0x1d, 0xed, 0x5b, 0xa8, 0x4e, 0xda, 0x8c, 0xf2, 0x55, 0x77, 0x71, 0x3b, 0x80, 0x07, 0xa6, 0x79,
+	0x67, 0x83, 0xac, 0xba, 0xb5, 0xdb, 0x6f, 0x61, 0x6d, 0x8f, 0x8d, 0xfb, 0x51, 0x4c, 0xf9, 0x8a,
+	0xfb, 0xb3, 0xfd, 0x87, 0x7a, 0xe0, 0xb5, 0xed, 0xfd, 0xeb, 0xab, 0xdd, 0x0b, 0xf0, 0x22, 0x76,
+	0x13, 0xb3, 0xeb, 0x9d, 0x4d, 0x7e, 0x59, 0xe8, 0x2f, 0x46, 0xf1, 0xcd, 0x6e, 0x18, 0xc9, 0x8b,
+	0xb4, 0xdf, 0x1a, 0xb0, 0xb1, 0x6f, 0xb0, 0x11, 0xb3, 0x8b, 0xe7, 0xfa, 0xc7, 0x43, 0x14, 0x0f,
+	0xd2, 0x3e, 0x51, 0xdf, 0x28, 0xfe, 0x15, 0x27, 0x49, 0x42, 0xb9, 0xf0, 0x45, 0x3b, 0xf2, 0x43,
+	0xe6, 0x27, 0x97, 0xa1, 0x4f, 0x92, 0xa8, 0x5f, 0xd2, 0xea, 0x2f, 0xfe, 0x0d, 0x00, 0x00, 0xff,
+	0xff, 0x8b, 0x68, 0xbe, 0x88, 0xb8, 0x0c, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -854,6 +872,26 @@ type GenericServer interface {
 	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
 }
 
+// UnimplementedGenericServer can be embedded to have forward compatible implementations.
+type UnimplementedGenericServer struct {
+}
+
+func (*UnimplementedGenericServer) TransformInput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TransformInput not implemented")
+}
+func (*UnimplementedGenericServer) TransformOutput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TransformOutput not implemented")
+}
+func (*UnimplementedGenericServer) Route(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Route not implemented")
+}
+func (*UnimplementedGenericServer) Aggregate(ctx context.Context, req *SeldonMessageList) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Aggregate not implemented")
+}
+func (*UnimplementedGenericServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
+}
+
 func RegisterGenericServer(s *grpc.Server, srv GenericServer) {
 	s.RegisterService(&_Generic_serviceDesc, srv)
 }
@@ -1017,6 +1055,17 @@ type ModelServer interface {
 	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
 }
 
+// UnimplementedModelServer can be embedded to have forward compatible implementations.
+type UnimplementedModelServer struct {
+}
+
+func (*UnimplementedModelServer) Predict(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Predict not implemented")
+}
+func (*UnimplementedModelServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
+}
+
 func RegisterModelServer(s *grpc.Server, srv ModelServer) {
 	s.RegisterService(&_Model_serviceDesc, srv)
 }
@@ -1114,6 +1163,17 @@ type RouterServer interface {
 	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
 }
 
+// UnimplementedRouterServer can be embedded to have forward compatible implementations.
+type UnimplementedRouterServer struct {
+}
+
+func (*UnimplementedRouterServer) Route(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Route not implemented")
+}
+func (*UnimplementedRouterServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
+}
+
 func RegisterRouterServer(s *grpc.Server, srv RouterServer) {
 	s.RegisterService(&_Router_serviceDesc, srv)
 }
@@ -1200,6 +1260,14 @@ type TransformerServer interface {
 	TransformInput(context.Context, *SeldonMessage) (*SeldonMessage, error)
 }
 
+// UnimplementedTransformerServer can be embedded to have forward compatible implementations.
+type UnimplementedTransformerServer struct {
+}
+
+func (*UnimplementedTransformerServer) TransformInput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TransformInput not implemented")
+}
+
 func RegisterTransformerServer(s *grpc.Server, srv TransformerServer) {
 	s.RegisterService(&_Transformer_serviceDesc, srv)
 }
@@ -1264,6 +1332,14 @@ type OutputTransformerServer interface {
 	TransformOutput(context.Context, *SeldonMessage) (*SeldonMessage, error)
 }
 
+// UnimplementedOutputTransformerServer can be embedded to have forward compatible implementations.
+type UnimplementedOutputTransformerServer struct {
+}
+
+func (*UnimplementedOutputTransformerServer) TransformOutput(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TransformOutput not implemented")
+}
+
 func RegisterOutputTransformerServer(s *grpc.Server, srv OutputTransformerServer) {
 	s.RegisterService(&_OutputTransformer_serviceDesc, srv)
 }
@@ -1328,6 +1404,14 @@ type CombinerServer interface {
 	Aggregate(context.Context, *SeldonMessageList) (*SeldonMessage, error)
 }
 
+// UnimplementedCombinerServer can be embedded to have forward compatible implementations.
+type UnimplementedCombinerServer struct {
+}
+
+func (*UnimplementedCombinerServer) Aggregate(ctx context.Context, req *SeldonMessageList) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Aggregate not implemented")
+}
+
 func RegisterCombinerServer(s *grpc.Server, srv CombinerServer) {
 	s.RegisterService(&_Combiner_serviceDesc, srv)
 }
@@ -1403,6 +1487,17 @@ type SeldonServer interface {
 	SendFeedback(context.Context, *Feedback) (*SeldonMessage, error)
 }
 
+// UnimplementedSeldonServer can be embedded to have forward compatible implementations.
+type UnimplementedSeldonServer struct {
+}
+
+func (*UnimplementedSeldonServer) Predict(ctx context.Context, req *SeldonMessage) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Predict not implemented")
+}
+func (*UnimplementedSeldonServer) SendFeedback(ctx context.Context, req *Feedback) (*SeldonMessage, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented")
+}
+
 func RegisterSeldonServer(s *grpc.Server, srv SeldonServer) {
 	s.RegisterService(&_Seldon_serviceDesc, srv)
 }
diff --git a/go/pkg/api/tensorflow/core/framework/resource_handle.pb.go b/incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/resource_handle.pb.go
similarity index 100%
rename from go/pkg/api/tensorflow/core/framework/resource_handle.pb.go
rename to incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/resource_handle.pb.go
diff --git a/go/pkg/api/tensorflow/core/framework/tensor.pb.go b/incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/tensor.pb.go
similarity index 100%
rename from go/pkg/api/tensorflow/core/framework/tensor.pb.go
rename to incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/tensor.pb.go
diff --git a/go/pkg/api/tensorflow/core/framework/tensor_shape.pb.go b/incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/tensor_shape.pb.go
similarity index 100%
rename from go/pkg/api/tensorflow/core/framework/tensor_shape.pb.go
rename to incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/tensor_shape.pb.go
diff --git a/go/pkg/api/tensorflow/core/framework/types.pb.go b/incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/types.pb.go
similarity index 100%
rename from go/pkg/api/tensorflow/core/framework/types.pb.go
rename to incubating/wrappers/s2i/go/pkg/api/tensorflow/core/framework/types.pb.go
diff --git a/proto/prediction.proto b/proto/prediction.proto
index aaea919ef5..de9d69e1d7 100644
--- a/proto/prediction.proto
+++ b/proto/prediction.proto
@@ -7,7 +7,7 @@ package seldon.protos;
 
 option java_package = "io.seldon.protos";
 option java_outer_classname = "PredictionProtos";
-option go_package = "github.com/seldonio/seldon-core/go/pkg/api";
+option go_package = "github.com/seldonio/seldon-core/incubating/wrappers/s2i/go/pkg/api";
 
 // [START Messages]