diff --git a/go.mod b/go.mod
index 54b39d322e83e05c4c54ffdf166dd4f0aa039249..d1ee5568db0c134ef021a69d18af06f680c20af6 100644
--- a/go.mod
+++ b/go.mod
@@ -56,4 +56,6 @@ require (
 	gopkg.in/yaml.v2 v2.2.2
 )
 
+replace github.com/dubbogo/gost => /Users/mindeng/git/apache-dubbo/gost
+
 go 1.13
diff --git a/registry/event.go b/registry/event.go
index 37d863d2162cb3b9d6a9f7eba8823286eb99441c..0500cc70188b5cf59a2058fee224106fea06001a 100644
--- a/registry/event.go
+++ b/registry/event.go
@@ -32,9 +32,9 @@ func init() {
 	rand.Seed(time.Now().UnixNano())
 }
 
-//////////////////////////////////////////
+// ////////////////////////////////////////
 // service event
-//////////////////////////////////////////
+// ////////////////////////////////////////
 
 // ServiceEvent ...
 type ServiceEvent struct {
@@ -45,3 +45,47 @@ type ServiceEvent struct {
 func (e ServiceEvent) String() string {
 	return fmt.Sprintf("ServiceEvent{Action{%s}, Path{%s}}", e.Action, e.Service)
 }
+
+// Event is align with Event interface in Java.
+// it's the top abstraction
+// Align with 2.7.5
+type Event interface {
+	fmt.Stringer
+	GetSource() interface{}
+	GetTimestamp() time.Time
+}
+
+// baseEvent is the base implementation of Event
+// You should never use it directly
+type baseEvent struct {
+	source    interface{}
+	timestamp time.Time
+}
+
+// GetSource return the source
+func (b *baseEvent) GetSource() interface{} {
+	return b.source
+}
+
+// GetTimestamp return the timestamp when the event is created
+func (b *baseEvent) GetTimestamp() time.Time {
+	return b.timestamp
+}
+
+// String return a human readable string representing this event
+func (b *baseEvent) String() string {
+	return fmt.Sprintf("baseEvent[source = %#v]", b.source)
+}
+
+func newBaseEvent(source interface{}) *baseEvent {
+	return &baseEvent{
+		source:    source,
+		timestamp: time.Now(),
+	}
+}
+
+// ServiceInstancesChangedEvent represents service instances make some changing
+type ServiceInstancesChangedEvent struct {
+	fmt.Stringer
+	baseEvent
+}
diff --git a/registry/event_listener.go b/registry/event_listener.go
new file mode 100644
index 0000000000000000000000000000000000000000..4bfec5d841d1c8b975d9fa9639029bc3bdf71d2c
--- /dev/null
+++ b/registry/event_listener.go
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package registry
+
+import (
+	gxsort "github.com/dubbogo/gost/sort"
+)
+
+// EventListener is an new interface used to align with dubbo 2.7.5
+// It contains the Prioritized means that the listener has its priority
+type EventListener interface {
+	gxsort.Prioritized
+	// OnEvent handle this event
+	OnEvent(e Event) error
+}
+
+// ConditionalEventListener only handle the event which it can handle
+type ConditionalEventListener interface {
+	EventListener
+	// Accept will make the decision whether it should handle this event
+	Accept(e Event) bool
+}
+
+// TODO (implement ConditionalEventListener)
+type ServiceInstancesChangedListener struct {
+
+}
diff --git a/registry/service_discovery.go b/registry/service_discovery.go
new file mode 100644
index 0000000000000000000000000000000000000000..11b059c389643b7fa648cf5fde14e2e57a3c11b0
--- /dev/null
+++ b/registry/service_discovery.go
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package registry
+
+import (
+	"fmt"
+)
+
+import (
+	gxset "github.com/dubbogo/gost/container/set"
+	gxpage "github.com/dubbogo/gost/page"
+)
+
+import (
+	"github.com/apache/dubbo-go/common"
+)
+
+type ServiceDiscovery interface {
+
+	fmt.Stringer
+
+	// ----------------- lifecycle -------------------
+
+	// Initialize will initialize the service discovery instance
+	// if initialize failed, it will return the error
+	Initialize(url common.URL) error
+
+	// Destroy will destroy the service discovery.
+	// If the discovery cannot be destroy, it will return an error.
+	Destroy() error
+
+
+	// ----------------- registration ----------------
+
+	// Register will register an instance of ServiceInstance to registry
+	Register(instance ServiceInstance) error
+
+	// Update will update the data of the instance in registry
+	Update(instance ServiceInstance) error
+
+	// Unregister will unregister this instance from registry
+	Unregister(instance ServiceInstance) error
+
+
+	// ----------------- discovery -------------------
+	// GetDefaultPageSize will return the default page size
+	GetDefaultPageSize() int
+
+	// GetServices will return the all service names.
+	GetServices() gxset.HashSet
+
+	// GetInstances will return all service instances with serviceName
+	GetInstances(serviceName string) []ServiceInstance
+
+	// GetInstancesByPage will return a page containing instances of ServiceInstance with the serviceName
+	// the page will start at offset
+	GetInstancesByPage(serviceName string, offset int, pageSize int) gxpage.Pager
+
+	// GetHealthyInstancesByPage will return a page containing instances of ServiceInstance.
+	// The param healthy indices that the instance should be healthy or not.
+	// The page will start at offset
+	GetHealthyInstancesByPage(serviceName string, offset int, pageSize int, healthy bool) gxpage.Pager
+
+	// Batch get all instances by the specified service names
+	GetRequestInstances(serviceNames []string, offset int, requestedSize int) map[string]gxpage.Pager
+
+
+	// ----------------- event ----------------------
+	// AddListener adds a new ServiceInstancesChangedListener
+	AddListener(listener *ServiceInstancesChangedListener) error
+
+	// DispatchEventByServiceName dispatches the ServiceInstancesChangedEvent to service instance whose name is serviceName
+	DispatchEventByServiceName(serviceName string) error
+
+	// DispatchEventForInstances dispatches the ServiceInstancesChangedEvent to target instances
+	DispatchEventForInstances(serviceName string, instances []ServiceInstance) error
+
+	// DispatchEvent dispatches the event
+	DispatchEvent(event ServiceInstancesChangedEvent) error
+}
diff --git a/registry/service_instance.go b/registry/service_instance.go
new file mode 100644
index 0000000000000000000000000000000000000000..d27ed8accfc4a415dc9474b22433a62779b59662
--- /dev/null
+++ b/registry/service_instance.go
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package registry
+
+type ServiceInstance interface {
+
+	// GetId will return this instance's id. It should be unique.
+	GetId() string
+
+	// GetServiceName will return the serviceName
+	GetServiceName() string
+
+	// GetHost will return the hostname
+	GetHost() string
+
+	// GetPort will return the port.
+	// if the port is not present, return error
+	GetPort() (int, error)
+
+	// IsEnable will return the enable status of this instance
+	IsEnable() bool
+
+	// IsHealthy will return the value represent the instance whether healthy or not
+	IsHealthy() bool
+
+	// GetMetadata will return the metadata
+	GetMetadata() map[string]string
+}