diff --git a/common/constant/key.go b/common/constant/key.go
index 1479af2305b1ce4280c2aa7f4016e314ac358513..16986c7421345318d3477adca59de800b9d9c415 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -40,6 +40,7 @@ const (
 	TOKEN_KEY              = "token"
 	LOCAL_ADDR             = "local-addr"
 	REMOTE_ADDR            = "remote-addr"
+	PATH_SEPARATOR         = "/"
 	DUBBO_KEY              = "dubbo"
 	RELEASE_KEY            = "release"
 	ANYHOST_KEY            = "anyhost"
diff --git a/common/observer/event.go b/common/observer/event.go
index d63d7836bb4da65c9e4e5b7e4ce70234348f3c3d..8c3362feeee3d62315eb734460f486dcdbfe2f36 100644
--- a/common/observer/event.go
+++ b/common/observer/event.go
@@ -36,31 +36,31 @@ type Event interface {
 	GetTimestamp() time.Time
 }
 
-// baseEvent is the base implementation of Event
+// BaseEvent is the base implementation of Event
 // You should never use it directly
 type BaseEvent struct {
-	source    interface{}
-	timestamp time.Time
+	Source    interface{}
+	Timestamp time.Time
 }
 
 // GetSource return the source
 func (b *BaseEvent) GetSource() interface{} {
-	return b.source
+	return b.Source
 }
 
-// GetTimestamp return the timestamp when the event is created
+// GetTimestamp return the Timestamp when the event is created
 func (b *BaseEvent) GetTimestamp() time.Time {
-	return b.timestamp
+	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)
+	return fmt.Sprintf("BaseEvent[source = %#v]", b.Source)
 }
 
 func newBaseEvent(source interface{}) *BaseEvent {
 	return &BaseEvent{
-		source:    source,
-		timestamp: time.Now(),
+		Source:    source,
+		Timestamp: time.Now(),
 	}
 }
diff --git a/registry/event.go b/registry/event.go
index 3a7d60695cf3fa14ab3e7817513c50a491d231c2..94ada0cc8b1ecb6a7610d8d7997f1c009d95483c 100644
--- a/registry/event.go
+++ b/registry/event.go
@@ -19,6 +19,7 @@ package registry
 
 import (
 	"fmt"
+	"github.com/apache/dubbo-go/common/observer"
 	"math/rand"
 	"time"
 )
@@ -47,40 +48,26 @@ 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
+// ServiceInstancesChangedEvent represents service instances make some changing
+type ServiceInstancesChangedEvent struct {
+	observer.BaseEvent
+	ServiceName string
+	Instances   []ServiceInstance
 }
 
-// baseEvent is the base implementation of Event
-// You should never use it directly
-type baseEvent struct {
-	source    interface{}
-	timestamp time.Time
+// String return the description of the event
+func (s *ServiceInstancesChangedEvent) String() string {
+	return fmt.Sprintf("ServiceInstancesChangedEvent[source=%s]", s.ServiceName)
 }
 
-// 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(),
+// NewServiceInstancesChangedEvent will create the ServiceInstanceChangedEvent instance
+func NewServiceInstancesChangedEvent(serviceName string, instances []ServiceInstance) *ServiceInstancesChangedEvent {
+	return &ServiceInstancesChangedEvent{
+		BaseEvent: observer.BaseEvent{
+			Source:    serviceName,
+			Timestamp: time.Now(),
+		},
+		ServiceName: serviceName,
+		Instances:   instances,
 	}
 }
diff --git a/registry/event_listener.go b/registry/event_listener.go
index e112325caba0902ff82171e77a7c118a77197e59..0aaa081a4488de5c291485277cdc0fc14ef4e380 100644
--- a/registry/event_listener.go
+++ b/registry/event_listener.go
@@ -16,3 +16,29 @@
  */
 
 package registry
+
+import (
+	"reflect"
+)
+
+import (
+	"github.com/apache/dubbo-go/common/observer"
+)
+
+// TODO (implement ConditionalEventListener)
+type ServiceInstancesChangedListener struct {
+	ServiceName string
+	observer.EventListener
+}
+
+func (sicl *ServiceInstancesChangedListener) OnEvent(e observer.Event) error {
+	return nil
+}
+
+func (sicl *ServiceInstancesChangedListener) GetPriority() int {
+	return -1
+}
+
+func (sicl *ServiceInstancesChangedListener) GetEventType() reflect.Type {
+	return reflect.TypeOf(&ServiceInstancesChangedEvent{})
+}
diff --git a/registry/service_discovery.go b/registry/service_discovery.go
index b7731d6b091587d7ff66f763622246d4dd5f5513..a8228a4abe8ed07e3c5afda300702f778daea4ae 100644
--- a/registry/service_discovery.go
+++ b/registry/service_discovery.go
@@ -26,12 +26,6 @@ import (
 	gxpage "github.com/dubbogo/gost/page"
 )
 
-import (
-	"github.com/apache/dubbo-go/common"
-	"github.com/apache/dubbo-go/common/observer/event"
-	eventlistener "github.com/apache/dubbo-go/registry/listener"
-)
-
 const DefaultPageSize = 100
 
 type ServiceDiscovery interface {
@@ -79,7 +73,7 @@ type ServiceDiscovery interface {
 	// ----------------- event ----------------------
 	// AddListener adds a new ServiceInstancesChangedListener
 	// see addServiceInstancesChangedListener in Java
-	AddListener(listener *eventlistener.ServiceInstancesChangedListener) error
+	AddListener(listener *ServiceInstancesChangedListener) error
 
 	// DispatchEventByServiceName dispatches the ServiceInstancesChangedEvent to service instance whose name is serviceName
 	DispatchEventByServiceName(serviceName string) error
@@ -88,5 +82,5 @@ type ServiceDiscovery interface {
 	DispatchEventForInstances(serviceName string, instances []ServiceInstance) error
 
 	// DispatchEvent dispatches the event
-	DispatchEvent(event *event.ServiceInstancesChangedEvent) error
+	DispatchEvent(event *ServiceInstancesChangedEvent) error
 }