Repository: Tochemey/goakt
Pull request #33 (2023-03-04 22:57:57)

chore: cleanup

codecov[bot]: # [Codecov](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) Report
Patch coverage: **`12.96`**% and project coverage change: **`-13.66`** :warning:
> Comparison is base [(`f93959d`)](https://codecov.io/gh/Tochemey/goakt/commit/f93959d784267da714f0ab9f0d9dcc001e8cda09?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) 47.48% compared to head [(`eca0fe0`)](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) 33.83%.

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff             @@
##             main      #33       +/-   ##
===========================================
- Coverage   47.48%   33.83%   -13.66%     
===========================================
  Files          30       37        +7     
  Lines        2487     3807     +1320     
===========================================
+ Hits         1181     1288      +107     
- Misses       1243     2447     +1204     
- Partials       63       72        +9     
```


| [Impacted Files](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) | Coverage Δ | |
|---|---|---|
| [actors/api.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-YWN0b3JzL2FwaS5nbw==) | `41.72% <0.00%> (ø)` | |
| [actors/context.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-YWN0b3JzL2NvbnRleHQuZ28=) | `31.81% <ø> (ø)` | |
| [actors/pid\_map.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-YWN0b3JzL3BpZF9tYXAuZ28=) | `100.00% <ø> (ø)` | |
| [internal/goakt/v1/cluster\_grpc.pb.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-aW50ZXJuYWwvZ29ha3QvdjEvY2x1c3Rlcl9ncnBjLnBiLmdv) | `0.00% <0.00%> (ø)` | |
| [internal/goakt/v1/persistence.pb.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-aW50ZXJuYWwvZ29ha3QvdjEvcGVyc2lzdGVuY2UucGIuZ28=) | `8.38% <ø> (ø)` | |
| [internal/goakt/v1/remoting\_grpc.pb.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-aW50ZXJuYWwvZ29ha3QvdjEvcmVtb3RpbmdfZ3JwYy5wYi5nbw==) | `0.00% <ø> (ø)` | |
| [telemetry/system\_metrics.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-dGVsZW1ldHJ5L3N5c3RlbV9tZXRyaWNzLmdv) | `70.00% <0.00%> (-2.73%)` | :arrow_down: |
| [internal/goakt/v1/cluster.pb.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-aW50ZXJuYWwvZ29ha3QvdjEvY2x1c3Rlci5wYi5nbw==) | `4.59% <4.59%> (ø)` | |
| [actors/actor\_system.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-YWN0b3JzL2FjdG9yX3N5c3RlbS5nbw==) | `34.70% <6.25%> (ø)` | |
| [internal/goakt/v1/remoting.pb.go](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene#diff-aW50ZXJuYWwvZ29ha3QvdjEvcmVtb3RpbmcucGIuZ28=) | `7.84% <9.09%> (ø)` | |
| ... and [12 more](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) | |

Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene)

</details>

[:umbrella: View full report at Codecov](https://codecov.io/gh/Tochemey/goakt/pull/33?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).   
:loudspeaker: Do you have feedback about the report comment? [Let us know in this issue](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).


Patch:
diff --git a/Earthfile b/Earthfile
index b084209..b89ec25 100644
--- a/Earthfile
+++ b/Earthfile
@@ -41,7 +41,7 @@ local-test:
 
     SAVE ARTIFACT coverage.out AS LOCAL coverage.out
 
-protogen:
+internal-pb:
     # copy the proto files to generate
     COPY --dir protos/ ./
     COPY buf.work.yaml buf.gen.yaml ./
@@ -52,7 +52,20 @@ protogen:
             --path protos/internal/goakt
 
     # save artifact to
-    SAVE ARTIFACT gen gen AS LOCAL pb
+    SAVE ARTIFACT gen gen AS LOCAL internal
+
+protogen:
+    # copy the proto files to generate
+    COPY --dir protos/ ./
+    COPY buf.work.yaml buf.gen.yaml ./
+
+    # generate the pbs
+    RUN buf generate \
+            --template buf.gen.yaml \
+            --path protos/public/messages
+
+    # save artifact to
+    SAVE ARTIFACT gen/messages AS LOCAL messages
 
 testprotogen:
     # copy the proto files to generate
diff --git a/actors/actor.go b/actors/actor.go
index e107240..fb9cb7a 100644
--- a/actors/actor.go
+++ b/actors/actor.go
@@ -8,7 +8,7 @@ import (
 // This will be implemented by any user who wants to create an actor
 type Actor interface {
 	// PreStart pre-starts the actor. This function can be used to set up some database connections
-	// or some sort of initialization before the actor start processing messages
+	// or some sort of initialization before the actor start processing public
 	PreStart(ctx context.Context) error
 	// Receive processes any message dropped into the actor mailbox.
 	// The receiver of any message can either reply to the sender of the message with a new message or reply to the message synchronously
@@ -16,6 +16,6 @@ type Actor interface {
 	// One thing to know is that actor can communicate synchronously as well, just that will hinder the performance of the system.
 	Receive(ctx ReceiveContext)
 	// PostStop is executed when the actor is shutting down.
-	// The execution happens when every messages that have not been processed yet will be processed before the actor shutdowns
+	// The execution happens when every public that have not been processed yet will be processed before the actor shutdowns
 	PostStop(ctx context.Context) error
 }
diff --git a/actors/actor_system.go b/actors/actor_system.go
index c2a086b..3a6dd17 100644
--- a/actors/actor_system.go
+++ b/actors/actor_system.go
@@ -6,8 +6,8 @@ import (
 
 	cmp "github.com/orcaman/concurrent-map/v2"
 	"github.com/pkg/errors"
+	internalpb "github.com/tochemey/goakt/internal/goakt/v1"
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 	"github.com/tochemey/goakt/pkg/grpc"
 	"github.com/tochemey/goakt/pkg/resync"
 	"github.com/tochemey/goakt/telemetry"
@@ -128,7 +128,7 @@ func (a *actorSystem) StartActor(ctx context.Context, name string, actor Actor)
 		return nil
 	}
 	// get the path of the given actor
-	actorPath := NewPath(name, NewAddress(protocol, a.name, a.host, a.port))
+	actorPath := NewPath(name, NewLocalAddress(protocol, a.name, a.host, a.port))
 	// check whether the given actor already exist in the system or not
 	pid, exist := a.actors.Get(actorPath.String())
 	// actor already exist no need recreate it.
@@ -169,7 +169,7 @@ func (a *actorSystem) StopActor(ctx context.Context, name string) error {
 		return errors.New("actor system has not started yet")
 	}
 	// get the path of the given actor
-	actorPath := NewPath(name, NewAddress(protocol, a.name, a.host, a.port))
+	actorPath := NewPath(name, NewLocalAddress(protocol, a.name, a.host, a.port))
 	// check whether the given actor already exist in the system or not
 	pid, exist := a.actors.Get(actorPath.String())
 	// actor is found.
@@ -190,7 +190,7 @@ func (a *actorSystem) RestartActor(ctx context.Context, name string) (PID, error
 		return nil, errors.New("actor system has not started yet")
 	}
 	// get the path of the given actor
-	actorPath := NewPath(name, NewAddress(protocol, a.name, a.host, a.port))
+	actorPath := NewPath(name, NewLocalAddress(protocol, a.name, a.host, a.port))
 	// check whether the given actor already exist in the system or not
 	pid, exist := a.actors.Get(actorPath.String())
 	// actor is found.
@@ -299,11 +299,11 @@ func (a *actorSystem) Stop(ctx context.Context) error {
 
 // RegisterService register the remoting service
 func (a *actorSystem) RegisterService(srv *ggrpc.Server) {
-	pb.RegisterRemoteMessagingServiceServer(srv, a)
+	internalpb.RegisterRemoteMessagingServiceServer(srv, a)
 }
 
 // RemoteLookup for an actor on a remote host.
-func (a *actorSystem) RemoteLookup(ctx context.Context, request *pb.RemoteLookupRequest) (*pb.RemoteLookupResponse, error) {
+func (a *actorSystem) RemoteLookup(ctx context.Context, request *internalpb.RemoteLookupRequest) (*internalpb.RemoteLookupResponse, error) {
 	// add a span context
 	ctx, span := telemetry.SpanContext(ctx, "RemoteLookup")
 	defer span.End()
@@ -312,7 +312,7 @@ func (a *actorSystem) RemoteLookup(ctx context.Context, request *pb.RemoteLookup
 	logger := a.logger.WithContext(ctx)
 
 	// first let us make a copy of the incoming request
-	reqCopy := proto.Clone(request).(*pb.RemoteLookupRequest)
+	reqCopy := proto.Clone(request).(*internalpb.RemoteLookupRequest)
 
 	// let us validate the host and port
 	hostAndPort := fmt.Sprintf("%s:%d", reqCopy.GetHost(), reqCopy.GetPort())
@@ -325,7 +325,7 @@ func (a *actorSystem) RemoteLookup(ctx context.Context, request *pb.RemoteLookup
 
 	// construct the actor address
 	name := reqCopy.GetName()
-	actorPath := NewPath(name, NewAddress(protocol, a.Name(), reqCopy.GetHost(), int(reqCopy.GetPort())))
+	actorPath := NewPath(name, NewLocalAddress(protocol, a.Name(), reqCopy.GetHost(), int(reqCopy.GetPort())))
 	// start or get the PID of the actor
 	// check whether the given actor already exist in the system or not
 	pid, exist := a.actors.Get(actorPath.String())
@@ -339,13 +339,13 @@ func (a *actorSystem) RemoteLookup(ctx context.Context, request *pb.RemoteLookup
 	// let us construct the address
 	addr := pid.ActorPath().RemoteAddress()
 
-	return &pb.RemoteLookupResponse{Address: addr}, nil
+	return &internalpb.RemoteLookupResponse{Address: addr}, nil
 }
 
 // RemoteAsk is used to send a message to an actor remotely and expect a response
 // immediately. With this type of message the receiver cannot communicate back to Sender
 // except reply the message with a response. This one-way communication
-func (a *actorSystem) RemoteAsk(ctx context.Context, request *pb.RemoteAskRequest) (*pb.RemoteAskResponse, error) {
+func (a *actorSystem) RemoteAsk(ctx context.Context, request *internalpb.RemoteAskRequest) (*internalpb.RemoteAskResponse, error) {
 	// add a span context
 	ctx, span := telemetry.SpanContext(ctx, "RemoteAsk")
 	defer span.End()
@@ -353,7 +353,7 @@ func (a *actorSystem) RemoteAsk(ctx context.Context, request *pb.RemoteAskReques
 	// get a context logger
 	logger := a.logger.WithContext(ctx)
 	// first let us make a copy of the incoming request
-	reqCopy := proto.Clone(request).(*pb.RemoteAskRequest)
+	reqCopy := proto.Clone(request).(*internalpb.RemoteAskRequest)
 
 	// let us validate the host and port
 	hostAndPort := fmt.Sprintf("%s:%d", reqCopy.GetReceiver().GetHost(), reqCopy.GetReceiver().GetPort())
@@ -366,7 +366,7 @@ func (a *actorSystem) RemoteAsk(ctx context.Context, request *pb.RemoteAskReques
 
 	// construct the actor address
 	name := reqCopy.GetReceiver().GetName()
-	actorPath := NewPath(name, NewAddress(protocol, a.name, a.host, a.port))
+	actorPath := NewPath(name, NewLocalAddress(protocol, a.name, a.host, a.port))
 	// start or get the PID of the actor
 	// check whether the given actor already exist in the system or not
 	pid, exist := a.actors.Get(actorPath.String())
@@ -392,13 +392,13 @@ func (a *actorSystem) RemoteAsk(ctx context.Context, request *pb.RemoteAskReques
 	}
 	// let us marshal the reply
 	marshaled, _ := anypb.New(reply)
-	return &pb.RemoteAskResponse{Message: marshaled}, nil
+	return &internalpb.RemoteAskResponse{Message: marshaled}, nil
 }
 
 // RemoteTell is used to send a message to an actor remotely by another actor
 // This is the only way remote actors can interact with each other. The actor on the
 // other line can reply to the sender by using the Sender in the message
-func (a *actorSystem) RemoteTell(ctx context.Context, request *pb.RemoteTellRequest) (*pb.RemoteTellResponse, error) {
+func (a *actorSystem) RemoteTell(ctx context.Context, request *internalpb.RemoteTellRequest) (*internalpb.RemoteTellResponse, error) {
 	// add a span context
 	ctx, span := telemetry.SpanContext(ctx, "RemoteTell")
 	defer span.End()
@@ -406,7 +406,7 @@ func (a *actorSystem) RemoteTell(ctx context.Context, request *pb.RemoteTellRequ
 	// get a context logger
 	logger := a.logger.WithContext(ctx)
 	// first let us make a copy of the incoming request
-	reqCopy := proto.Clone(request).(*pb.RemoteTellRequest)
+	reqCopy := proto.Clone(request).(*internalpb.RemoteTellRequest)
 
 	receiver := reqCopy.GetRemoteMessage().GetReceiver()
 	// let us validate the host and port
@@ -421,7 +421,7 @@ func (a *actorSystem) RemoteTell(ctx context.Context, request *pb.RemoteTellRequ
 	// construct the actor address
 	actorPath := NewPath(
 		receiver.GetName(),
-		NewAddress(
+		NewLocalAddress(
 			protocol,
 			a.Name(),
 			receiver.GetHost(),
@@ -447,7 +447,7 @@ func (a *actorSystem) RemoteTell(ctx context.Context, request *pb.RemoteTellRequ
 		logger.Error(ErrRemoteSendFailure(err))
 		return nil, ErrRemoteSendFailure(err)
 	}
-	return &pb.RemoteTellResponse{}, nil
+	return &internalpb.RemoteTellResponse{}, nil
 }
 
 // registerMetrics register the PID metrics with OTel instrumentation.
@@ -487,7 +487,7 @@ func (a *actorSystem) handleRemoteTell(ctx context.Context, to PID, message prot
 	return SendAsync(ctx, to, message)
 }
 
-// startRemoting starts the remoting service to handle remote messages
+// startRemoting starts the remoting service to handle remote public
 func (a *actorSystem) startRemoting(ctx context.Context) error {
 	// start remoting when remoting is enabled
 	if a.config.remotingEnabled {
diff --git a/actors/api.go b/actors/api.go
index 9a6179a..2b0d66e 100644
--- a/actors/api.go
+++ b/actors/api.go
@@ -6,7 +6,8 @@ import (
 	"sync"
 	"time"
 
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
+	internalpb "github.com/tochemey/goakt/internal/goakt/v1"
+	pb "github.com/tochemey/goakt/messages/v1"
 	"github.com/tochemey/goakt/pkg/grpc"
 	"github.com/tochemey/goakt/telemetry"
 	"google.golang.org/grpc/codes"
@@ -121,9 +122,9 @@ func RemoteSendAsync(ctx context.Context, to *pb.Address, message proto.Message)
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", to.GetHost(), to.GetPort()))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 	// prepare the rpcRequest to send
-	request := &pb.RemoteTellRequest{
+	request := &internalpb.RemoteTellRequest{
 		RemoteMessage: &pb.RemoteMessage{
 			Sender:   RemoteNoSender,
 			Receiver: to,
@@ -151,9 +152,9 @@ func RemoteSendSync(ctx context.Context, to *pb.Address, message proto.Message)
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", to.GetHost(), to.GetPort()))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 	// prepare the rpcRequest to send
-	rpcRequest := &pb.RemoteAskRequest{
+	rpcRequest := &internalpb.RemoteAskRequest{
 		Receiver: to,
 		Message:  marshaled,
 	}
@@ -175,10 +176,10 @@ func RemoteLookup(ctx context.Context, host string, port int, name string) (addr
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", host, port))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 
 	// prepare the request to send
-	request := &pb.RemoteLookupRequest{
+	request := &internalpb.RemoteLookupRequest{
 		Host: host,
 		Port: int32(port),
 		Name: name,
diff --git a/actors/config.go b/actors/config.go
index 24723b2..0616380 100644
--- a/actors/config.go
+++ b/actors/config.go
@@ -8,7 +8,6 @@ import (
 	"time"
 
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 	"github.com/tochemey/goakt/telemetry"
 )
 
@@ -37,7 +36,7 @@ type Config struct {
 	// initialization fails. The default value is 5
 	actorInitMaxRetries int
 	// Specifies the supervisor strategy
-	supervisorStrategy pb.StrategyDirective
+	supervisorStrategy StrategyDirective
 	// Specifies the telemetry config
 	telemetry *telemetry.Telemetry
 	// Specifies whether remoting is enabled.
@@ -67,7 +66,7 @@ func NewConfig(name, nodeHostAndPort string, options ...Option) (*Config, error)
 		expireActorAfter:    2 * time.Second,
 		replyTimeout:        100 * time.Millisecond,
 		actorInitMaxRetries: 5,
-		supervisorStrategy:  pb.StrategyDirective_STOP_DIRECTIVE,
+		supervisorStrategy:  StopDirective,
 		telemetry:           telemetry.New(),
 		remotingEnabled:     false,
 	}
@@ -188,7 +187,7 @@ func WithPassivationDisabled() Option {
 }
 
 // WithSupervisorStrategy sets the supervisor strategy
-func WithSupervisorStrategy(strategy pb.StrategyDirective) Option {
+func WithSupervisorStrategy(strategy StrategyDirective) Option {
 	return OptionFunc(func(config *Config) {
 		config.supervisorStrategy = strategy
 	})
diff --git a/actors/context.go b/actors/context.go
index 6d69549..17f4eda 100644
--- a/actors/context.go
+++ b/actors/context.go
@@ -7,7 +7,7 @@ import (
 	"google.golang.org/protobuf/proto"
 )
 
-// ReceiveContext is the context that is used by the actor to receive messages
+// ReceiveContext is the context that is used by the actor to receive public
 type ReceiveContext interface {
 	// Context returns the context attached to the message
 	Context() context.Context
@@ -24,7 +24,7 @@ type ReceiveContext interface {
 	Response(resp proto.Message)
 	// Become switch the current behavior of the actor to a new behavior
 	// The current message in process during the transition will still be processed with the current
-	// behavior before the transition. However, subsequent messages will be processed with the new behavior.
+	// behavior before the transition. However, subsequent public will be processed with the new behavior.
 	// One needs to call UnBecome to reset the actor behavior to the default one which is the Actor.Receive method
 	// which is the default behavior.
 	Become(behavior Behavior)
@@ -33,7 +33,7 @@ type ReceiveContext interface {
 	UnBecome()
 	// BecomeStacked sets a new behavior to the actor.
 	// The current message in process during the transition will still be processed with the current
-	// behavior before the transition. However, subsequent messages will be processed with the new behavior.
+	// behavior before the transition. However, subsequent public will be processed with the new behavior.
 	// One needs to call UnBecomeStacked to go the previous the actor's behavior.
 	// which is the default behavior.
 	BecomeStacked(behavior Behavior)
@@ -53,7 +53,7 @@ type receiveContext struct {
 
 // BecomeStacked sets a new behavior to the actor.
 // The current message in process during the transition will still be processed with the current
-// behavior before the transition. However, subsequent messages will be processed with the new behavior.
+// behavior before the transition. However, subsequent public will be processed with the new behavior.
 // One needs to call UnBecomeStacked to go the previous the actor's behavior.
 // which is the default behavior.
 func (m *receiveContext) BecomeStacked(behavior Behavior) {
diff --git a/actors/address.go b/actors/local_address.go
similarity index 51%
rename from actors/address.go
rename to actors/local_address.go
index 062c3ae..5f42fba 100644
--- a/actors/address.go
+++ b/actors/local_address.go
@@ -9,13 +9,13 @@ import (
 )
 
 const (
-	protocol = "goakt"
+	protocol = "messages"
 )
 
-// Address represents the physical location under which an Actor can be
+// LocalAddress represents the physical location under which an Actor can be
 // reached. Examples are local addresses, identified by the ActorSystem’s name,
 // and remote addresses, identified by protocol, host and port.
-type Address struct {
+type LocalAddress struct {
 	// host is the host address
 	host string
 	// port is the port number
@@ -26,9 +26,9 @@ type Address struct {
 	protocol string
 }
 
-// NewAddress creates an instance of Address
-func NewAddress(protocol string, system string, host string, port int) *Address {
-	return &Address{
+// NewLocalAddress creates an instance of LocalAddress
+func NewLocalAddress(protocol string, system string, host string, port int) *LocalAddress {
+	return &LocalAddress{
 		host:     host,
 		port:     port,
 		system:   system,
@@ -36,61 +36,49 @@ func NewAddress(protocol string, system string, host string, port int) *Address
 	}
 }
 
-// WithHost sets the hosts of a given Address and returns a new instance of the address
-func (a *Address) WithHost(host string) *Address {
-	return NewAddress(a.Protocol(), a.System(), host, a.Port())
+// WithHost sets the hosts of a given LocalAddress and returns a new instance of the address
+func (a *LocalAddress) WithHost(host string) *LocalAddress {
+	return NewLocalAddress(a.Protocol(), a.System(), host, a.Port())
 }
 
-// WithPort sets the port of a given Address and returns a new instance of the address
-func (a *Address) WithPort(port int) *Address {
-	return NewAddress(a.Protocol(), a.System(), a.System(), port)
+// WithPort sets the port of a given LocalAddress and returns a new instance of the address
+func (a *LocalAddress) WithPort(port int) *LocalAddress {
+	return NewLocalAddress(a.Protocol(), a.System(), a.System(), port)
 }
 
-// WithSystem sets the actor system of a given Address and returns a new instance of the address
-func (a *Address) WithSystem(system string) *Address {
-	return NewAddress(a.Protocol(), system, a.Host(), a.Port())
+// WithSystem sets the actor system of a given LocalAddress and returns a new instance of the address
+func (a *LocalAddress) WithSystem(system string) *LocalAddress {
+	return NewLocalAddress(a.Protocol(), system, a.Host(), a.Port())
 }
 
-// WithProtocol sets the protocol of a given Address and returns a new instance of the address
-func (a *Address) WithProtocol(protocol string) *Address {
-	return NewAddress(protocol, a.System(), a.Host(), a.Port())
+// WithProtocol sets the protocol of a given LocalAddress and returns a new instance of the address
+func (a *LocalAddress) WithProtocol(protocol string) *LocalAddress {
+	return NewLocalAddress(protocol, a.System(), a.Host(), a.Port())
 }
 
 // Host returns the host
-func (a *Address) Host() string {
+func (a *LocalAddress) Host() string {
 	return a.host
 }
 
 // Port returns the port number
-func (a *Address) Port() int {
+func (a *LocalAddress) Port() int {
 	return a.port
 }
 
 // System returns the actor system name
-func (a *Address) System() string {
+func (a *LocalAddress) System() string {
 	return a.system
 }
 
 // Protocol returns the protocol
-func (a *Address) Protocol() string {
+func (a *LocalAddress) Protocol() string {
 	return a.protocol
 }
 
-// IsRemote true if this Address is usable globally.
-// Unlike locally defined addresses of global scope are safe to sent to other hosts, as they globally and uniquely identify an addressable entity.
-func (a *Address) IsRemote() bool {
-	return len(a.host) > 0
-}
-
-// IsLocal returns true if this Address is only defined locally.
-// It is not safe to send locally scoped addresses to remote
-func (a *Address) IsLocal() bool {
-	return len(a.host) == 0
-}
-
 // HostPort returns the host and port in the following string format
 // @host:port
-func (a *Address) HostPort() string {
+func (a *LocalAddress) HostPort() string {
 	// create a bytes buffer instance
 	buf := bytes.NewBuffer(nil)
 	// write the host value when it is set
@@ -109,10 +97,10 @@ func (a *Address) HostPort() string {
 	return buf.String()
 }
 
-// String returns the canonical String representation of this Address formatted as:
+// String returns the canonical String representation of this LocalAddress formatted as:
 // `protocol://system@host:port`
-func (a *Address) String() string {
-	// if the protocol is not goakt
+func (a *LocalAddress) String() string {
+	// if the protocol is not messages
 	// then panic
 	if a.protocol != protocol {
 		panic("invalid protocol")
@@ -140,8 +128,8 @@ func (a *Address) String() string {
 	return buf.String()
 }
 
-// Parse parses a new Address from a given string
-func (a *Address) Parse(address string) *Address {
+// Parse parses a new LocalAddress from a given string
+func (a *LocalAddress) Parse(address string) *LocalAddress {
 	// let us parse the address and panic in case of error
 	uri, err := url.Parse(address)
 	// panic when there is an error
@@ -158,8 +146,8 @@ func (a *Address) Parse(address string) *Address {
 	}
 
 	if uri.User == nil {
-		return NewAddress(uri.Scheme, uri.Hostname(), "", port)
+		return NewLocalAddress(uri.Scheme, uri.Hostname(), "", port)
 	}
 
-	return NewAddress(uri.Scheme, uri.User.String(), uri.Hostname(), port)
+	return NewLocalAddress(uri.Scheme, uri.User.String(), uri.Hostname(), port)
 }
diff --git a/actors/path.go b/actors/path.go
index fc8d688..76286e9 100644
--- a/actors/path.go
+++ b/actors/path.go
@@ -3,15 +3,14 @@ package actors
 import (
 	"fmt"
 
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
-
 	"github.com/google/uuid"
+	pb "github.com/tochemey/goakt/messages/v1"
 )
 
 // Path is a unique path to an actor
 type Path struct {
-	// specifies the Address under which this path can be reached
-	address *Address
+	// specifies the LocalAddress under which this path can be reached
+	address *LocalAddress
 	// specifies the name of the actor that this path refers to.
 	name string
 	// specifies the internal unique id of the actor that this path refer to.
@@ -21,7 +20,7 @@ type Path struct {
 }
 
 // NewPath creates an immutable Path
-func NewPath(name string, address *Address) *Path {
+func NewPath(name string, address *LocalAddress) *Path {
 	// create the instance and return it
 	return &Path{
 		address: address,
@@ -43,8 +42,8 @@ func (a *Path) WithParent(parent *Path) *Path {
 	return newPath
 }
 
-// Address return the actor path address
-func (a *Path) Address() *Address {
+// LocalAddress return the actor path local address
+func (a *Path) LocalAddress() *LocalAddress {
 	return a.address
 }
 
@@ -66,8 +65,8 @@ func (a *Path) String() string {
 // RemoteAddress returns the remote from path
 func (a *Path) RemoteAddress() *pb.Address {
 	return &pb.Address{
-		Host: a.Address().Host(),
-		Port: int32(a.Address().Port()),
+		Host: a.LocalAddress().Host(),
+		Port: int32(a.LocalAddress().Port()),
 		Name: a.Name(),
 		Id:   a.ID().String(),
 	}
diff --git a/actors/pid.go b/actors/pid.go
index 86fcda8..fec9737 100644
--- a/actors/pid.go
+++ b/actors/pid.go
@@ -8,8 +8,9 @@ import (
 
 	"github.com/cenkalti/backoff"
 	"github.com/pkg/errors"
+	internalpb "github.com/tochemey/goakt/internal/goakt/v1"
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
+	pb "github.com/tochemey/goakt/messages/v1"
 	"github.com/tochemey/goakt/pkg/grpc"
 	"github.com/tochemey/goakt/pkg/tools"
 	"github.com/tochemey/goakt/telemetry"
@@ -31,13 +32,13 @@ type watchMan struct {
 type PID interface {
 	// Shutdown gracefully shuts down the given actor
 	Shutdown(ctx context.Context) error
-	// IsOnline returns true when the actor is online ready to process messages and false
+	// IsOnline returns true when the actor is online ready to process public and false
 	// when the actor is stopped or not started at all
 	IsOnline() bool
-	// ReceivedCount returns the total number of messages processed by the actor
+	// ReceivedCount returns the total number of public processed by the actor
 	// at a given point in time while the actor heart is still beating
 	ReceivedCount(ctx context.Context) uint64
-	// ErrorsCount returns the total number of panic attacks that occur while the actor is processing messages
+	// ErrorsCount returns the total number of panic attacks that occur while the actor is processing public
 	// at a given point in time while the actor heart is still beating
 	ErrorsCount(ctx context.Context) uint64
 	// SpawnChild creates a child actor
@@ -96,7 +97,7 @@ type pid struct {
 	// specifies the actor path
 	actorPath *Path
 
-	// helps determine whether the actor should handle messages or not.
+	// helps determine whether the actor should handle public or not.
 	isOnline bool
 	// is captured whenever a mail is sent to the actor
 	lastProcessingTime atomic.Time
@@ -114,7 +115,7 @@ type pid struct {
 	// initialization fails. The default value is 5 seconds
 	initMaxRetries int
 
-	// shutdownTimeout specifies how long to wait for the remaining messages
+	// shutdownTimeout specifies how long to wait for the remaining public
 	// in the actor mailbox to be processed before completing the shutdown process
 	// the default value is 5 seconds
 	shutdownTimeout time.Duration
@@ -148,7 +149,7 @@ type pid struct {
 	mu sync.RWMutex
 
 	// supervisor strategy
-	supervisorStrategy pb.StrategyDirective
+	supervisorStrategy StrategyDirective
 
 	// specifies the current actor behavior
 	behaviorStack BehaviorStack
@@ -186,7 +187,7 @@ func newPID(ctx context.Context, actorPath *Path, actor Actor, opts ...pidOption
 		mailboxSizeCounter:     atomic.NewUint64(0),
 		mu:                     sync.RWMutex{},
 		children:               newPIDMap(10),
-		supervisorStrategy:     pb.StrategyDirective_STOP_DIRECTIVE,
+		supervisorStrategy:     StopDirective,
 		watchMen:               tools.NewConcurrentSlice[*watchMan](),
 		telemetry:              telemetry.New(),
 		actorPath:              actorPath,
@@ -197,9 +198,9 @@ func newPID(ctx context.Context, actorPath *Path, actor Actor, opts ...pidOption
 		opt(pid)
 	}
 
-	// initialize the actor and init processing messages
+	// initialize the actor and init processing public
 	pid.init(ctx)
-	// init processing messages
+	// init processing public
 	go pid.receive()
 	// init the passivation listener loop iff passivation is set
 	if pid.passivateAfter > 0 {
@@ -233,7 +234,7 @@ func (p *pid) Children(ctx context.Context) []PID {
 	return kiddos
 }
 
-// IsOnline returns true when the actor is alive ready to process messages and false
+// IsOnline returns true when the actor is alive ready to process public and false
 // when the actor is stopped or not started at all
 func (p *pid) IsOnline() bool {
 	p.mu.RLock()
@@ -259,7 +260,7 @@ func (p *pid) ActorPath() *Path {
 }
 
 // Restart restarts the actor. This call can panic which is the expected behaviour.
-// During restart all messages that are in the mailbox and not yet processed will be ignored
+// During restart all public that are in the mailbox and not yet processed will be ignored
 func (p *pid) Restart(ctx context.Context) error {
 	// add a span context
 	ctx, span := telemetry.SpanContext(ctx, "Restart")
@@ -295,7 +296,7 @@ func (p *pid) Restart(ctx context.Context) error {
 	p.reset()
 	// initialize the actor
 	p.init(ctx)
-	// init processing messages
+	// init processing public
 	go p.receive()
 	// init the passivation listener loop iff passivation is set
 	if p.passivateAfter > 0 {
@@ -318,7 +319,7 @@ func (p *pid) SpawnChild(ctx context.Context, name string, actor Actor) (PID, er
 	}
 
 	// create the child actor path
-	childActorPath := NewPath(name, p.ActorPath().Address()).WithParent(p.ActorPath())
+	childActorPath := NewPath(name, p.ActorPath().LocalAddress()).WithParent(p.ActorPath())
 
 	// check whether the child actor already exist and just return the PID
 	if cid, ok := p.children.Get(childActorPath); ok {
@@ -361,7 +362,7 @@ func (p *pid) MailboxSize(ctx context.Context) uint64 {
 	return p.mailboxSizeCounter.Load()
 }
 
-// ReceivedCount returns the total number of messages processed by the actor
+// ReceivedCount returns the total number of public processed by the actor
 // at a given time while the actor is still alive
 func (p *pid) ReceivedCount(ctx context.Context) uint64 {
 	// add a span context
@@ -370,7 +371,7 @@ func (p *pid) ReceivedCount(ctx context.Context) uint64 {
 	return p.receivedMessageCounter.Load()
 }
 
-// ErrorsCount returns the total number of panic attacks that occur while the actor is processing messages
+// ErrorsCount returns the total number of panic attacks that occur while the actor is processing public
 // at a given point in time while the actor heart is still beating
 func (p *pid) ErrorsCount(ctx context.Context) uint64 {
 	// add a span context
@@ -488,10 +489,10 @@ func (p *pid) RemoteLookup(ctx context.Context, host string, port int, name stri
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", host, port))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 
 	// prepare the request to send
-	request := &pb.RemoteLookupRequest{
+	request := &internalpb.RemoteLookupRequest{
 		Host: host,
 		Port: int32(port),
 		Name: name,
@@ -507,7 +508,6 @@ func (p *pid) RemoteLookup(ctx context.Context, host string, port int, name stri
 		}
 		return nil, err
 	}
-
 	// return the response
 	return response.GetAddress(), nil
 }
@@ -526,18 +526,18 @@ func (p *pid) RemoteTell(ctx context.Context, to *pb.Address, message proto.Mess
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", to.GetHost(), to.GetPort()))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 
 	// construct the from address
 	sender := &pb.Address{
-		Host: p.ActorPath().Address().Host(),
-		Port: int32(p.ActorPath().Address().Port()),
+		Host: p.ActorPath().LocalAddress().Host(),
+		Port: int32(p.ActorPath().LocalAddress().Port()),
 		Name: p.ActorPath().Name(),
 		Id:   p.ActorPath().ID().String(),
 	}
 
 	// prepare the rpcRequest to send
-	request := &pb.RemoteTellRequest{
+	request := &internalpb.RemoteTellRequest{
 		RemoteMessage: &pb.RemoteMessage{
 			Sender:   sender,
 			Receiver: to,
@@ -565,9 +565,9 @@ func (p *pid) RemoteAsk(ctx context.Context, to *pb.Address, message proto.Messa
 
 	// create an instance of remote client service
 	rpcConn, _ := grpc.GetClientConn(ctx, fmt.Sprintf("%s:%d", to.GetHost(), to.GetPort()))
-	remoteClient := pb.NewRemoteMessagingServiceClient(rpcConn)
+	remoteClient := internalpb.NewRemoteMessagingServiceClient(rpcConn)
 	// prepare the rpcRequest to send
-	rpcRequest := &pb.RemoteAskRequest{
+	rpcRequest := &internalpb.RemoteAskRequest{
 		Receiver: to,
 		Message:  marshaled,
 	}
@@ -582,7 +582,7 @@ func (p *pid) RemoteAsk(ctx context.Context, to *pb.Address, message proto.Messa
 }
 
 // Shutdown gracefully shuts down the given actor
-// All current messages in the mailbox will be processed before the actor shutdown after a period of time
+// All current public in the mailbox will be processed before the actor shutdown after a period of time
 // that can be configured. All child actors will be gracefully shutdown.
 func (p *pid) Shutdown(ctx context.Context) error {
 	// add a span context
@@ -604,7 +604,7 @@ func (p *pid) Shutdown(ctx context.Context) error {
 
 	// add some logging
 	p.logger.Info("Shutdown process is on going for actor=%s...", p.ActorPath().String())
-	// signal we are shutting down to stop processing messages
+	// signal we are shutting down to stop processing public
 	p.shutdownSignal <- Unit{}
 	// perform some cleanup with the actor
 	if err := p.Actor.PostStop(ctx); err != nil {
@@ -674,7 +674,7 @@ func (p *pid) doReceive(ctx ReceiveContext) {
 	p.receivedMessageCounter.Inc()
 }
 
-// init initializes the given actor and init processing messages
+// init initializes the given actor and init processing public
 // when the initialization failed the actor is automatically shutdown
 func (p *pid) init(ctx context.Context) {
 	// add a span context
@@ -761,8 +761,8 @@ func (p *pid) stop(ctx context.Context) {
 	p.mu.Unlock()
 	// stop all the child actors
 	p.freeChildren(ctx)
-	// wait for all messages in the mailbox to be processed
-	// init a ticker that run every 10 ms to make sure we process all messages in the
+	// wait for all public in the mailbox to be processed
+	// init a ticker that run every 10 ms to make sure we process all public in the
 	// mailbox.
 	ticker := time.NewTicker(10 * time.Millisecond)
 	timer := time.After(p.shutdownTimeout)
@@ -788,10 +788,10 @@ func (p *pid) stop(ctx context.Context) {
 	}()
 	// listen to ticker stop signal
 	<-tickerStopSig
-	// signal we are shutting down to stop processing messages
+	// signal we are shutting down to stop processing public
 	p.shutdownSignal <- Unit{}
 	// add some logging
-	p.logger.Infof("Remaining messages in the mailbox have been processed for actor=%s", p.ActorPath().String())
+	p.logger.Infof("Remaining public in the mailbox have been processed for actor=%s", p.ActorPath().String())
 	// stop the ticker
 	ticker.Stop()
 }
@@ -901,7 +901,7 @@ func (p *pid) supervise(cid PID, watcher *watchMan) {
 		case err := <-watcher.ErrChan:
 			p.logger.Errorf("child actor=%s is panicking: Err=%v", cid.ActorPath().String(), err)
 			switch p.supervisorStrategy {
-			case pb.StrategyDirective_STOP_DIRECTIVE:
+			case StopDirective:
 				// shutdown the actor and panic in case of error
 				if err := cid.Shutdown(context.Background()); err != nil {
 					panic(err)
@@ -910,7 +910,7 @@ func (p *pid) supervise(cid PID, watcher *watchMan) {
 				p.UnWatch(cid)
 				// remove the actor from the children map
 				p.children.Delete(cid.ActorPath())
-			case pb.StrategyDirective_RESTART_DIRECTIVE:
+			case RestartDirective:
 				// restart the actor
 				if err := cid.Restart(context.Background()); err != nil {
 					panic(err)
@@ -929,7 +929,7 @@ func (p *pid) supervise(cid PID, watcher *watchMan) {
 	}
 }
 
-// passivationListener checks whether the actor is processing messages or not.
+// passivationListener checks whether the actor is processing public or not.
 // when the actor is idle, it automatically shuts down to free resources
 func (p *pid) passivationListener() {
 	p.logger.Info("start the passivation listener...")
diff --git a/actors/pid_map.go b/actors/pid_map.go
index db68a9e..69e2b08 100644
--- a/actors/pid_map.go
+++ b/actors/pid_map.go
@@ -3,7 +3,7 @@ package actors
 import (
 	"sync"
 
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
+	pb "github.com/tochemey/goakt/messages/v1"
 )
 
 // Unit type
diff --git a/actors/pid_option.go b/actors/pid_option.go
index 1fc78fe..27bd495 100644
--- a/actors/pid_option.go
+++ b/actors/pid_option.go
@@ -4,7 +4,6 @@ import (
 	"time"
 
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 	"github.com/tochemey/goakt/telemetry"
 )
 
@@ -49,7 +48,7 @@ func withActorSystem(sys ActorSystem) pidOption {
 
 // withSupervisorStrategy sets the supervisor strategy to used when dealing
 // with child actors
-func withSupervisorStrategy(strategy pb.StrategyDirective) pidOption {
+func withSupervisorStrategy(strategy StrategyDirective) pidOption {
 	return func(pid *pid) {
 		pid.supervisorStrategy = strategy
 	}
diff --git a/actors/supervisor.go b/actors/supervisor.go
new file mode 100644
index 0000000..f82a72c
--- /dev/null
+++ b/actors/supervisor.go
@@ -0,0 +1,9 @@
+package actors
+
+// StrategyDirective represents the supervisor strategy directive
+type StrategyDirective int
+
+const (
+	RestartDirective StrategyDirective = iota
+	StopDirective
+)
diff --git a/buf.gen.yaml b/buf.gen.yaml
index 60b547e..40fdf39 100644
--- a/buf.gen.yaml
+++ b/buf.gen.yaml
@@ -2,10 +2,6 @@ version: v1
 managed:
   enabled: true
   optimize_for: CODE_SIZE
-  go_package_prefix:
-    default: github.com/tochemey/goakt/gen
-    except:
-      - buf.build/googleapis/googleapis
 plugins:
   - name: go
     out: gen
diff --git a/buf.work.yaml b/buf.work.yaml
index 6411f65..80947e6 100644
--- a/buf.work.yaml
+++ b/buf.work.yaml
@@ -3,3 +3,4 @@ directories:
   - protos/internal
   - protos/test
   - protos/sample
+  - protos/public
diff --git a/examples/actor-receive/main.go b/examples/actor-receive/main.go
index 59c364a..44e81f9 100644
--- a/examples/actor-receive/main.go
+++ b/examples/actor-receive/main.go
@@ -17,7 +17,7 @@ import (
 func main() {
 	ctx := context.Background()
 
-	// use the goakt default logger. real-life implement the logger interface`
+	// use the messages default logger. real-life implement the logger interface`
 	logger := log.DefaultLogger
 	// create the actor system configuration. kindly in real-life application handle the error
 	config, _ := goakt.NewConfig("SampleActorSystem", "127.0.0.1:0",
@@ -36,7 +36,7 @@ func main() {
 
 	startTime := time.Now()
 
-	// send some messages to the actor
+	// send some public to the actor
 	count := 100
 	for i := 0; i < count; i++ {
 		_ = goakt.SendAsync(ctx, actor, new(samplepb.Ping))
@@ -48,7 +48,7 @@ func main() {
 	<-interruptSignal
 
 	// log some stats
-	logger.Infof("Actor=%s has processed %d messages in %s", actor.ActorPath().String(), actor.ReceivedCount(ctx), time.Since(startTime))
+	logger.Infof("Actor=%s has processed %d public in %s", actor.ActorPath().String(), actor.ReceivedCount(ctx), time.Since(startTime))
 
 	// stop the actor system
 	_ = actorSystem.Stop(ctx)
@@ -91,6 +91,6 @@ func (p *Pinger) Receive(ctx goakt.ReceiveContext) {
 
 func (p *Pinger) PostStop(ctx context.Context) error {
 	p.logger.Info("About to stop")
-	p.logger.Infof("Processed=%d messages", p.count.Load())
+	p.logger.Infof("Processed=%d public", p.count.Load())
 	return nil
 }
diff --git a/examples/actor-to-actor/main.go b/examples/actor-to-actor/main.go
index 70ea7f6..4dc4311 100644
--- a/examples/actor-to-actor/main.go
+++ b/examples/actor-to-actor/main.go
@@ -18,7 +18,7 @@ import (
 func main() {
 	ctx := context.Background()
 
-	// use the goakt default logger. real-life implement the logger interface`
+	// use the messages default logger. real-life implement the logger interface`
 	logger := log.DefaultLogger
 
 	// create the actor system configuration. kindly in real-life application handle the error
@@ -42,8 +42,8 @@ func main() {
 
 	// shutdown both actors after 3 seconds of conversation
 	timer := time.AfterFunc(3*time.Second, func() {
-		log.DefaultLogger.Infof("PingActor=%s has processed %d messages", pingActor.ActorPath().String(), pingActor.ReceivedCount(ctx))
-		log.DefaultLogger.Infof("PongActor=%s has processed %d messages", pongActor.ActorPath().String(), pongActor.ReceivedCount(ctx))
+		log.DefaultLogger.Infof("PingActor=%s has processed %d public", pingActor.ActorPath().String(), pingActor.ReceivedCount(ctx))
+		log.DefaultLogger.Infof("PongActor=%s has processed %d public", pongActor.ActorPath().String(), pongActor.ReceivedCount(ctx))
 		_ = pingActor.Shutdown(ctx)
 		_ = pongActor.Shutdown(ctx)
 	})
@@ -100,7 +100,7 @@ func (p *PingActor) Receive(ctx goakt.ReceiveContext) {
 
 func (p *PingActor) PostStop(ctx context.Context) error {
 	p.logger.Info("About to stop")
-	p.logger.Infof("Processed=%d messages", p.count.Load())
+	p.logger.Infof("Processed=%d public", p.count.Load())
 	return nil
 }
 
@@ -144,6 +144,6 @@ func (p *PongActor) Receive(ctx goakt.ReceiveContext) {
 
 func (p *PongActor) PostStop(ctx context.Context) error {
 	p.logger.Info("About to stop")
-	p.logger.Infof("Processed=%d messages", p.count.Load())
+	p.logger.Infof("Processed=%d public", p.count.Load())
 	return nil
 }
diff --git a/examples/remoting/ping/main.go b/examples/remoting/ping/main.go
index fc51634..eb128bb 100644
--- a/examples/remoting/ping/main.go
+++ b/examples/remoting/ping/main.go
@@ -8,13 +8,12 @@ import (
 	"sync"
 	"syscall"
 
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
-	"google.golang.org/protobuf/proto"
-
 	goakt "github.com/tochemey/goakt/actors"
 	samplepb "github.com/tochemey/goakt/examples/protos/pb/v1"
 	"github.com/tochemey/goakt/log"
+	pb "github.com/tochemey/goakt/messages/v1"
 	"go.uber.org/atomic"
+	"google.golang.org/protobuf/proto"
 )
 
 const (
@@ -25,7 +24,7 @@ const (
 func main() {
 	ctx := context.Background()
 
-	// use the goakt default logger. real-life implement the logger interface`
+	// use the messages default logger. real-life implement the logger interface`
 	logger := log.DefaultLogger
 
 	// create the actor system configuration. kindly in real-life application handle the error
@@ -111,6 +110,6 @@ func (p *PingActor) Receive(ctx goakt.ReceiveContext) {
 
 func (p *PingActor) PostStop(ctx context.Context) error {
 	p.logger.Info("About to stop")
-	p.logger.Infof("Processed=%d messages", p.count.Load())
+	p.logger.Infof("Processed=%d public", p.count.Load())
 	return nil
 }
diff --git a/examples/remoting/pong/main.go b/examples/remoting/pong/main.go
index 1a9b89e..378328f 100644
--- a/examples/remoting/pong/main.go
+++ b/examples/remoting/pong/main.go
@@ -8,14 +8,12 @@ import (
 	"sync"
 	"syscall"
 
-	"google.golang.org/protobuf/proto"
-
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
-
 	goakt "github.com/tochemey/goakt/actors"
 	samplepb "github.com/tochemey/goakt/examples/protos/pb/v1"
 	"github.com/tochemey/goakt/log"
+	pb "github.com/tochemey/goakt/messages/v1"
 	"go.uber.org/atomic"
+	"google.golang.org/protobuf/proto"
 )
 
 const (
@@ -26,7 +24,7 @@ const (
 func main() {
 	ctx := context.Background()
 
-	// use the goakt default logger. real-life implement the logger interface`
+	// use the messages default logger. real-life implement the logger interface`
 	logger := log.DefaultLogger
 
 	// create the actor system configuration. kindly in real-life application handle the error
@@ -103,6 +101,6 @@ func (p *PongActor) Receive(ctx goakt.ReceiveContext) {
 
 func (p *PongActor) PostStop(ctx context.Context) error {
 	p.logger.Info("About to stop")
-	p.logger.Infof("Processed=%d messages", p.count.Load())
+	p.logger.Infof("Processed=%d public", p.count.Load())
 	return nil
 }
diff --git a/go.mod b/go.mod
index b45a3f0..327a8e8 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/tochemey/goakt
 go 1.19
 
 require (
-	github.com/XSAM/otelsql v0.19.0
+	github.com/XSAM/otelsql v0.20.0
 	github.com/cenkalti/backoff v2.2.1+incompatible
 	github.com/georgysavva/scany v1.2.1
 	github.com/google/go-cmp v0.5.9
@@ -13,15 +13,15 @@ require (
 	github.com/orcaman/concurrent-map/v2 v2.0.1
 	github.com/ory/dockertest v3.3.5+incompatible
 	github.com/pkg/errors v0.9.1
-	github.com/stretchr/testify v1.8.1
-	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0
-	go.opentelemetry.io/otel v1.13.0
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0
-	go.opentelemetry.io/otel/metric v0.36.0
-	go.opentelemetry.io/otel/sdk v1.13.0
-	go.opentelemetry.io/otel/trace v1.13.0
+	github.com/stretchr/testify v1.8.2
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.40.0
+	go.opentelemetry.io/otel v1.14.0
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0
+	go.opentelemetry.io/otel/metric v0.37.0
+	go.opentelemetry.io/otel/sdk v1.14.0
+	go.opentelemetry.io/otel/trace v1.14.0
 	go.uber.org/atomic v1.10.0
-	go.uber.org/goleak v1.2.0
+	go.uber.org/goleak v1.2.1
 	google.golang.org/grpc v1.53.0
 	google.golang.org/protobuf v1.28.1
 )
@@ -37,25 +37,27 @@ require (
 	github.com/docker/go-units v0.5.0 // indirect
 	github.com/go-logr/logr v1.2.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
-	github.com/golang/glog v1.0.0 // indirect
+	github.com/golang/glog v1.1.0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect
-	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.1 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 // indirect
+	github.com/kr/text v0.2.0 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.0.2 // indirect
 	github.com/opencontainers/runc v1.1.4 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/sirupsen/logrus v1.9.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
-	golang.org/x/mod v0.8.0 // indirect
+	golang.org/x/crypto v0.6.0 // indirect
+	golang.org/x/mod v0.9.0 // indirect
 	golang.org/x/net v0.7.0 // indirect
-	golang.org/x/sys v0.5.0 // indirect
-	golang.org/x/text v0.7.0 // indirect
+	golang.org/x/sys v0.6.0 // indirect
+	golang.org/x/text v0.8.0 // indirect
 	golang.org/x/tools v0.6.0 // indirect
-	google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
-	gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
+	google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gotest.tools v2.2.0+incompatible // indirect
 )
diff --git a/go.sum b/go.sum
index 110d82e..1acabe9 100644
--- a/go.sum
+++ b/go.sum
@@ -13,7 +13,7 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
 cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
 cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
 cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww=
+cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -43,8 +43,8 @@ github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2B
 github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
 github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/XSAM/otelsql v0.19.0 h1:ggoHKrQMT7nBg3zQBDmASeytVp56BpG2yx7T8SXQFYc=
-github.com/XSAM/otelsql v0.19.0/go.mod h1:YlF8cCdVv0Pol37Nsf1UFneWqNOdqK5X1azLJN6c8zA=
+github.com/XSAM/otelsql v0.20.0 h1:HIiNs5pmYxgqwm3c6J4Xv6JJ0zBlCAb0HUEJBNX/g2k=
+github.com/XSAM/otelsql v0.20.0/go.mod h1:65rhbaPV/WUP7I9F3yODndlvGD7xH3JGL/oR62XemZk=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
@@ -77,6 +77,7 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -116,8 +117,9 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
 github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
+github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -180,8 +182,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW
 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.1 h1:I6ITHEanAwjB0FvaxmGm8pKqmCLR7QIe05ZmO4QAXMw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.1/go.mod h1:gYC+WX4YJFarA2ie73G2epzt7TBWpo9pzcBnK1g0MSw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@@ -252,8 +254,9 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -322,8 +325,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
@@ -338,23 +341,23 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0 h1:MUes2rbdXa1ce9mwKYzTyBG0CtqpLT0NgKTFAz8FIDs=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0/go.mod h1:tETUy0CG/bwb1vHaXyNZJJP9395sjxlQQ5e69KtvZMc=
-go.opentelemetry.io/otel v1.13.0 h1:1ZAKnNQKwBBxFtww/GwxNUyTf0AxkZzrukO8MeXqe4Y=
-go.opentelemetry.io/otel v1.13.0/go.mod h1:FH3RtdZCzRkJYFTCsAKDy9l/XYjMdNv6QrkFFB8DvVg=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 h1:pa05sNT/P8OsIQ8mPZKTIyiBuzS/xDGLVx+DCt0y6Vs=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 h1:Any/nVxaoMq1T2w0W85d6w5COlLuCCgOYKQhJJWEMwQ=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0/go.mod h1:46vAP6RWfNn7EKov73l5KBFlNxz8kYlxR1woU+bJ4ZY=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 h1:Wz7UQn7/eIqZVDJbuNEM6PmqeA71cWXrWcXekP5HZgU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0/go.mod h1:OhH1xvgA5jZW2M/S4PcvtDlFE1VULRRBsibBrKuJQGI=
-go.opentelemetry.io/otel/metric v0.36.0 h1:t0lgGI+L68QWt3QtOIlqM9gXoxqxWLhZ3R/e5oOAY0Q=
-go.opentelemetry.io/otel/metric v0.36.0/go.mod h1:wKVw57sd2HdSZAzyfOM9gTqqE8v7CbqWsYL6AyrH9qk=
-go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM=
-go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I=
-go.opentelemetry.io/otel/sdk/metric v0.36.0 h1:dEXpkkOAEcHiRiaZdvd63MouV+3bCtAB/bF3jlNKnr8=
-go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY=
-go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.40.0 h1:5jD3teb4Qh7mx/nfzq4jO2WFFpvXD0vYWFDrdvNWmXk=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.40.0/go.mod h1:UMklln0+MRhZC4e3PwmN3pCtq4DyIadWw4yikh6bNrw=
+go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
+go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 h1:/fXHZHGvro6MVqV34fJzDhi7sHGpX3Ej/Qjmfn003ho=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0/go.mod h1:UFG7EBMRdXyFstOwH028U0sVf+AvukSGhF0g8+dmNG8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 h1:TKf2uAs2ueguzLaxOCBXNpHxfO/aC7PAdDsSH0IbeRQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0/go.mod h1:HrbCVv40OOLTABmOn1ZWty6CHXkU8DK/Urc43tHug70=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 h1:ap+y8RXX3Mu9apKVtOkM6WSFESLM8K3wNQyOU8sWHcc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0/go.mod h1:5w41DY6S9gZrbjuq6Y+753e96WfPha5IcsOSZTtullM=
+go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKfDXedEs=
+go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s=
+go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
+go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=
+go.opentelemetry.io/otel/sdk/metric v0.37.0 h1:haYBBtZZxiI3ROwSmkZnI+d0+AVzBWeviuYQDeBWosU=
+go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
+go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
 go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
@@ -363,8 +366,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
 go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
-go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
-go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
+go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
@@ -379,8 +382,9 @@ golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
+golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -402,7 +406,6 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
@@ -412,8 +415,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
+golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -510,8 +513,8 @@ golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -519,8 +522,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -634,8 +637,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D
 google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds=
-google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
+google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488 h1:QQF+HdiI4iocoxUjjpLgvTYDHKm99C/VtTBFnfiCJos=
+google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -671,8 +674,8 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175
 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/internal/goakt/v1/cluster.pb.go b/internal/goakt/v1/cluster.pb.go
new file mode 100644
index 0000000..5d4e057
--- /dev/null
+++ b/internal/goakt/v1/cluster.pb.go
@@ -0,0 +1,868 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.1
+// 	protoc        (unknown)
+// source: goakt/v1/cluster.proto
+
+package goaktv1
+
+import (
+	v1 "github.com/tochemey/goakt/messages/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// PutActorRequest is used to put an actor
+// meta information onto the state store
+type PutActorRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the actor
+	Actor *WireActor `protobuf:"bytes,1,opt,name=actor,proto3" json:"actor,omitempty"`
+}
+
+func (x *PutActorRequest) Reset() {
+	*x = PutActorRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutActorRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutActorRequest) ProtoMessage() {}
+
+func (x *PutActorRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PutActorRequest.ProtoReflect.Descriptor instead.
+func (*PutActorRequest) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *PutActorRequest) GetActor() *WireActor {
+	if x != nil {
+		return x.Actor
+	}
+	return nil
+}
+
+type PutActorResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *PutActorResponse) Reset() {
+	*x = PutActorResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutActorResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutActorResponse) ProtoMessage() {}
+
+func (x *PutActorResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PutActorResponse.ProtoReflect.Descriptor instead.
+func (*PutActorResponse) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{1}
+}
+
+// GetActorRequest is used to fetch an actor from the cluster
+type GetActorRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the actor name
+	ActorName string `protobuf:"bytes,1,opt,name=actor_name,json=actorName,proto3" json:"actor_name,omitempty"`
+}
+
+func (x *GetActorRequest) Reset() {
+	*x = GetActorRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetActorRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetActorRequest) ProtoMessage() {}
+
+func (x *GetActorRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetActorRequest.ProtoReflect.Descriptor instead.
+func (*GetActorRequest) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetActorRequest) GetActorName() string {
+	if x != nil {
+		return x.ActorName
+	}
+	return ""
+}
+
+type GetActorResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the actor meta on the wire
+	Actor *WireActor `protobuf:"bytes,1,opt,name=actor,proto3" json:"actor,omitempty"`
+}
+
+func (x *GetActorResponse) Reset() {
+	*x = GetActorResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetActorResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetActorResponse) ProtoMessage() {}
+
+func (x *GetActorResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetActorResponse.ProtoReflect.Descriptor instead.
+func (*GetActorResponse) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetActorResponse) GetActor() *WireActor {
+	if x != nil {
+		return x.Actor
+	}
+	return nil
+}
+
+// AddNodeRequest is used to add a node to the cluster
+type AddNodeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the node ID
+	NodeId uint32 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
+	// Specifies the node host address
+	Host string `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"`
+	// Specifies the remote port
+	Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
+}
+
+func (x *AddNodeRequest) Reset() {
+	*x = AddNodeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddNodeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddNodeRequest) ProtoMessage() {}
+
+func (x *AddNodeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddNodeRequest.ProtoReflect.Descriptor instead.
+func (*AddNodeRequest) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *AddNodeRequest) GetNodeId() uint32 {
+	if x != nil {
+		return x.NodeId
+	}
+	return 0
+}
+
+func (x *AddNodeRequest) GetHost() string {
+	if x != nil {
+		return x.Host
+	}
+	return ""
+}
+
+func (x *AddNodeRequest) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+type AddNodeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *AddNodeResponse) Reset() {
+	*x = AddNodeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddNodeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddNodeResponse) ProtoMessage() {}
+
+func (x *AddNodeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddNodeResponse.ProtoReflect.Descriptor instead.
+func (*AddNodeResponse) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{5}
+}
+
+// RemoveNodeRequest removes a node from the cluster
+type RemoveNodeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the node ID
+	NodeId uint32 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
+}
+
+func (x *RemoveNodeRequest) Reset() {
+	*x = RemoveNodeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemoveNodeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemoveNodeRequest) ProtoMessage() {}
+
+func (x *RemoveNodeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RemoveNodeRequest.ProtoReflect.Descriptor instead.
+func (*RemoveNodeRequest) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *RemoveNodeRequest) GetNodeId() uint32 {
+	if x != nil {
+		return x.NodeId
+	}
+	return 0
+}
+
+type RemoveNodeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RemoveNodeResponse) Reset() {
+	*x = RemoveNodeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemoveNodeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemoveNodeResponse) ProtoMessage() {}
+
+func (x *RemoveNodeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RemoveNodeResponse.ProtoReflect.Descriptor instead.
+func (*RemoveNodeResponse) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{7}
+}
+
+// WireState specifies the raft Finite State Machine entries
+type WireState struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies raft FSM entries
+	Actors map[string]*WireActor `protobuf:"bytes,1,rep,name=actors,proto3" json:"actors,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *WireState) Reset() {
+	*x = WireState{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WireState) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WireState) ProtoMessage() {}
+
+func (x *WireState) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WireState.ProtoReflect.Descriptor instead.
+func (*WireState) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *WireState) GetActors() map[string]*WireActor {
+	if x != nil {
+		return x.Actors
+	}
+	return nil
+}
+
+// WireActor represents the actor information on the
+// wire
+type WireActor struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the actor name.
+	// The actor name can be either the actor FQN or an alias
+	ActorName string `protobuf:"bytes,1,opt,name=actor_name,json=actorName,proto3" json:"actor_name,omitempty"`
+	// Specifies the actor address
+	ActorAddress *v1.Address `protobuf:"bytes,2,opt,name=actor_address,json=actorAddress,proto3" json:"actor_address,omitempty"`
+	// Specifies the actor payload. The payload is used
+	// to recreate this actor in case the node hosting the actor is dead and we want to recreate the given actor
+	// on another node of the cluster
+	ActorPayload []byte `protobuf:"bytes,3,opt,name=actor_payload,json=actorPayload,proto3" json:"actor_payload,omitempty"`
+}
+
+func (x *WireActor) Reset() {
+	*x = WireActor{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WireActor) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WireActor) ProtoMessage() {}
+
+func (x *WireActor) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WireActor.ProtoReflect.Descriptor instead.
+func (*WireActor) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *WireActor) GetActorName() string {
+	if x != nil {
+		return x.ActorName
+	}
+	return ""
+}
+
+func (x *WireActor) GetActorAddress() *v1.Address {
+	if x != nil {
+		return x.ActorAddress
+	}
+	return nil
+}
+
+func (x *WireActor) GetActorPayload() []byte {
+	if x != nil {
+		return x.ActorPayload
+	}
+	return nil
+}
+
+// Peer specifies the node peer settings
+type Peer struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the peer unique id
+	NodeId uint32 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
+	// Specifies the peer host and port
+	HostAndPort string `protobuf:"bytes,2,opt,name=host_and_port,json=hostAndPort,proto3" json:"host_and_port,omitempty"`
+}
+
+func (x *Peer) Reset() {
+	*x = Peer{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_goakt_v1_cluster_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Peer) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Peer) ProtoMessage() {}
+
+func (x *Peer) ProtoReflect() protoreflect.Message {
+	mi := &file_goakt_v1_cluster_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Peer.ProtoReflect.Descriptor instead.
+func (*Peer) Descriptor() ([]byte, []int) {
+	return file_goakt_v1_cluster_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *Peer) GetNodeId() uint32 {
+	if x != nil {
+		return x.NodeId
+	}
+	return 0
+}
+
+func (x *Peer) GetHostAndPort() string {
+	if x != nil {
+		return x.HostAndPort
+	}
+	return ""
+}
+
+var File_goakt_v1_cluster_proto protoreflect.FileDescriptor
+
+var file_goakt_v1_cluster_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74,
+	0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e,
+	0x76, 0x31, 0x1a, 0x19, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3c, 0x0a,
+	0x0f, 0x50, 0x75, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x29, 0x0a, 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x41,
+	0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x12, 0x0a, 0x10, 0x50,
+	0x75, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x30, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d,
+	0x65, 0x22, 0x3d, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x57, 0x69, 0x72, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72,
+	0x22, 0x51, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68,
+	0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12,
+	0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70,
+	0x6f, 0x72, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e,
+	0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x6f,
+	0x64, 0x65, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f,
+	0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x09, 0x57,
+	0x69, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f,
+	0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x63,
+	0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72,
+	0x73, 0x1a, 0x4e, 0x0a, 0x0b, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x72,
+	0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+	0x01, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x57, 0x69, 0x72, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x12,
+	0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39,
+	0x0a, 0x0d, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
+	0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0c, 0x61, 0x63, 0x74,
+	0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x74,
+	0x6f, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x0c, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x43,
+	0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12,
+	0x22, 0x0a, 0x0d, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x41, 0x6e, 0x64, 0x50,
+	0x6f, 0x72, 0x74, 0x32, 0x9f, 0x02, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x50, 0x75, 0x74, 0x41, 0x63, 0x74,
+	0x6f, 0x72, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75,
+	0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e,
+	0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x41, 0x63, 0x74, 0x6f,
+	0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x47, 0x65, 0x74,
+	0x41, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41,
+	0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07,
+	0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64,
+	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x61,
+	0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x94, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
+	0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f,
+	0x61, 0x6b, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x61,
+	0x6b, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03,
+	0x47, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02,
+	0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b,
+	0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0xea, 0x02, 0x09, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_goakt_v1_cluster_proto_rawDescOnce sync.Once
+	file_goakt_v1_cluster_proto_rawDescData = file_goakt_v1_cluster_proto_rawDesc
+)
+
+func file_goakt_v1_cluster_proto_rawDescGZIP() []byte {
+	file_goakt_v1_cluster_proto_rawDescOnce.Do(func() {
+		file_goakt_v1_cluster_proto_rawDescData = protoimpl.X.CompressGZIP(file_goakt_v1_cluster_proto_rawDescData)
+	})
+	return file_goakt_v1_cluster_proto_rawDescData
+}
+
+var file_goakt_v1_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
+var file_goakt_v1_cluster_proto_goTypes = []interface{}{
+	(*PutActorRequest)(nil),    // 0: goakt.v1.PutActorRequest
+	(*PutActorResponse)(nil),   // 1: goakt.v1.PutActorResponse
+	(*GetActorRequest)(nil),    // 2: goakt.v1.GetActorRequest
+	(*GetActorResponse)(nil),   // 3: goakt.v1.GetActorResponse
+	(*AddNodeRequest)(nil),     // 4: goakt.v1.AddNodeRequest
+	(*AddNodeResponse)(nil),    // 5: goakt.v1.AddNodeResponse
+	(*RemoveNodeRequest)(nil),  // 6: goakt.v1.RemoveNodeRequest
+	(*RemoveNodeResponse)(nil), // 7: goakt.v1.RemoveNodeResponse
+	(*WireState)(nil),          // 8: goakt.v1.WireState
+	(*WireActor)(nil),          // 9: goakt.v1.WireActor
+	(*Peer)(nil),               // 10: goakt.v1.Peer
+	nil,                        // 11: goakt.v1.WireState.ActorsEntry
+	(*v1.Address)(nil),         // 12: messages.v1.Address
+}
+var file_goakt_v1_cluster_proto_depIdxs = []int32{
+	9,  // 0: goakt.v1.PutActorRequest.actor:type_name -> goakt.v1.WireActor
+	9,  // 1: goakt.v1.GetActorResponse.actor:type_name -> goakt.v1.WireActor
+	11, // 2: goakt.v1.WireState.actors:type_name -> goakt.v1.WireState.ActorsEntry
+	12, // 3: goakt.v1.WireActor.actor_address:type_name -> messages.v1.Address
+	9,  // 4: goakt.v1.WireState.ActorsEntry.value:type_name -> goakt.v1.WireActor
+	0,  // 5: goakt.v1.ClusterService.PutActor:input_type -> goakt.v1.PutActorRequest
+	2,  // 6: goakt.v1.ClusterService.GetActor:input_type -> goakt.v1.GetActorRequest
+	4,  // 7: goakt.v1.ClusterService.AddNode:input_type -> goakt.v1.AddNodeRequest
+	6,  // 8: goakt.v1.ClusterService.RemoveNode:input_type -> goakt.v1.RemoveNodeRequest
+	1,  // 9: goakt.v1.ClusterService.PutActor:output_type -> goakt.v1.PutActorResponse
+	3,  // 10: goakt.v1.ClusterService.GetActor:output_type -> goakt.v1.GetActorResponse
+	5,  // 11: goakt.v1.ClusterService.AddNode:output_type -> goakt.v1.AddNodeResponse
+	7,  // 12: goakt.v1.ClusterService.RemoveNode:output_type -> goakt.v1.RemoveNodeResponse
+	9,  // [9:13] is the sub-list for method output_type
+	5,  // [5:9] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_goakt_v1_cluster_proto_init() }
+func file_goakt_v1_cluster_proto_init() {
+	if File_goakt_v1_cluster_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_goakt_v1_cluster_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutActorRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutActorResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetActorRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetActorResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddNodeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddNodeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemoveNodeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemoveNodeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WireState); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WireActor); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_goakt_v1_cluster_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Peer); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_goakt_v1_cluster_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   12,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_goakt_v1_cluster_proto_goTypes,
+		DependencyIndexes: file_goakt_v1_cluster_proto_depIdxs,
+		MessageInfos:      file_goakt_v1_cluster_proto_msgTypes,
+	}.Build()
+	File_goakt_v1_cluster_proto = out.File
+	file_goakt_v1_cluster_proto_rawDesc = nil
+	file_goakt_v1_cluster_proto_goTypes = nil
+	file_goakt_v1_cluster_proto_depIdxs = nil
+}
diff --git a/internal/goakt/v1/cluster_grpc.pb.go b/internal/goakt/v1/cluster_grpc.pb.go
new file mode 100644
index 0000000..3c522d9
--- /dev/null
+++ b/internal/goakt/v1/cluster_grpc.pb.go
@@ -0,0 +1,219 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc             (unknown)
+// source: goakt/v1/cluster.proto
+
+package goaktv1
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// ClusterServiceClient is the client API for ClusterService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ClusterServiceClient interface {
+	// PutActor adds an actor meta to the cluster
+	PutActor(ctx context.Context, in *PutActorRequest, opts ...grpc.CallOption) (*PutActorResponse, error)
+	// GetActor reads an actor meta from the cluster
+	GetActor(ctx context.Context, in *GetActorRequest, opts ...grpc.CallOption) (*GetActorResponse, error)
+	// AddNode adds a new node to the cluster
+	AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error)
+	// RemoveNode removes a node from the cluster
+	RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error)
+}
+
+type clusterServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewClusterServiceClient(cc grpc.ClientConnInterface) ClusterServiceClient {
+	return &clusterServiceClient{cc}
+}
+
+func (c *clusterServiceClient) PutActor(ctx context.Context, in *PutActorRequest, opts ...grpc.CallOption) (*PutActorResponse, error) {
+	out := new(PutActorResponse)
+	err := c.cc.Invoke(ctx, "/goakt.v1.ClusterService/PutActor", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *clusterServiceClient) GetActor(ctx context.Context, in *GetActorRequest, opts ...grpc.CallOption) (*GetActorResponse, error) {
+	out := new(GetActorResponse)
+	err := c.cc.Invoke(ctx, "/goakt.v1.ClusterService/GetActor", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *clusterServiceClient) AddNode(ctx context.Context, in *AddNodeRequest, opts ...grpc.CallOption) (*AddNodeResponse, error) {
+	out := new(AddNodeResponse)
+	err := c.cc.Invoke(ctx, "/goakt.v1.ClusterService/AddNode", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *clusterServiceClient) RemoveNode(ctx context.Context, in *RemoveNodeRequest, opts ...grpc.CallOption) (*RemoveNodeResponse, error) {
+	out := new(RemoveNodeResponse)
+	err := c.cc.Invoke(ctx, "/goakt.v1.ClusterService/RemoveNode", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ClusterServiceServer is the server API for ClusterService service.
+// All implementations should embed UnimplementedClusterServiceServer
+// for forward compatibility
+type ClusterServiceServer interface {
+	// PutActor adds an actor meta to the cluster
+	PutActor(context.Context, *PutActorRequest) (*PutActorResponse, error)
+	// GetActor reads an actor meta from the cluster
+	GetActor(context.Context, *GetActorRequest) (*GetActorResponse, error)
+	// AddNode adds a new node to the cluster
+	AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error)
+	// RemoveNode removes a node from the cluster
+	RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error)
+}
+
+// UnimplementedClusterServiceServer should be embedded to have forward compatible implementations.
+type UnimplementedClusterServiceServer struct {
+}
+
+func (UnimplementedClusterServiceServer) PutActor(context.Context, *PutActorRequest) (*PutActorResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method PutActor not implemented")
+}
+func (UnimplementedClusterServiceServer) GetActor(context.Context, *GetActorRequest) (*GetActorResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetActor not implemented")
+}
+func (UnimplementedClusterServiceServer) AddNode(context.Context, *AddNodeRequest) (*AddNodeResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AddNode not implemented")
+}
+func (UnimplementedClusterServiceServer) RemoveNode(context.Context, *RemoveNodeRequest) (*RemoveNodeResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method RemoveNode not implemented")
+}
+
+// UnsafeClusterServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ClusterServiceServer will
+// result in compilation errors.
+type UnsafeClusterServiceServer interface {
+	mustEmbedUnimplementedClusterServiceServer()
+}
+
+func RegisterClusterServiceServer(s grpc.ServiceRegistrar, srv ClusterServiceServer) {
+	s.RegisterService(&ClusterService_ServiceDesc, srv)
+}
+
+func _ClusterService_PutActor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PutActorRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ClusterServiceServer).PutActor(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/goakt.v1.ClusterService/PutActor",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ClusterServiceServer).PutActor(ctx, req.(*PutActorRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ClusterService_GetActor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetActorRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ClusterServiceServer).GetActor(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/goakt.v1.ClusterService/GetActor",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ClusterServiceServer).GetActor(ctx, req.(*GetActorRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ClusterService_AddNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddNodeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ClusterServiceServer).AddNode(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/goakt.v1.ClusterService/AddNode",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ClusterServiceServer).AddNode(ctx, req.(*AddNodeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ClusterService_RemoveNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RemoveNodeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ClusterServiceServer).RemoveNode(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/goakt.v1.ClusterService/RemoveNode",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ClusterServiceServer).RemoveNode(ctx, req.(*RemoveNodeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// ClusterService_ServiceDesc is the grpc.ServiceDesc for ClusterService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var ClusterService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "goakt.v1.ClusterService",
+	HandlerType: (*ClusterServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "PutActor",
+			Handler:    _ClusterService_PutActor_Handler,
+		},
+		{
+			MethodName: "GetActor",
+			Handler:    _ClusterService_GetActor_Handler,
+		},
+		{
+			MethodName: "AddNode",
+			Handler:    _ClusterService_AddNode_Handler,
+		},
+		{
+			MethodName: "RemoveNode",
+			Handler:    _ClusterService_RemoveNode_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "goakt/v1/cluster.proto",
+}
diff --git a/pb/goakt/v1/persistence.pb.go b/internal/goakt/v1/persistence.pb.go
similarity index 96%
rename from pb/goakt/v1/persistence.pb.go
rename to internal/goakt/v1/persistence.pb.go
index 7270ac9..908f346 100644
--- a/pb/goakt/v1/persistence.pb.go
+++ b/internal/goakt/v1/persistence.pb.go
@@ -464,17 +464,18 @@ var file_goakt_v1_persistence_proto_rawDesc = []byte{
 	0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
 	0x22, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x0a, 0x0f, 0x47,
-	0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x93,
+	0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x42, 0x98,
 	0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x42,
 	0x10, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74,
-	0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
 	0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74,
-	0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f,
-	0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x47, 0x6f,
-	0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56,
-	0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x47, 0x6f, 0x61, 0x6b, 0x74,
-	0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f,
+	0x76, 0x31, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x58, 0x58,
+	0xaa, 0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x47, 0x6f,
+	0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56,
+	0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09,
+	0x47, 0x6f, 0x61, 0x6b, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
 var (
diff --git a/pb/goakt/v1/remoting.pb.go b/internal/goakt/v1/remoting.pb.go
similarity index 51%
rename from pb/goakt/v1/remoting.pb.go
rename to internal/goakt/v1/remoting.pb.go
index 22a0c62..778dd0a 100644
--- a/pb/goakt/v1/remoting.pb.go
+++ b/internal/goakt/v1/remoting.pb.go
@@ -7,6 +7,7 @@
 package goaktv1
 
 import (
+	v1 "github.com/tochemey/goakt/messages/v1"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	anypb "google.golang.org/protobuf/types/known/anypb"
@@ -30,7 +31,7 @@ type RemoteAskRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	// Specifies the receiver' address
-	Receiver *Address `protobuf:"bytes,1,opt,name=receiver,proto3" json:"receiver,omitempty"`
+	Receiver *v1.Address `protobuf:"bytes,1,opt,name=receiver,proto3" json:"receiver,omitempty"`
 	// Specifies the message to send to the actor
 	// Any proto message is allowed to be sent
 	Message *anypb.Any `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
@@ -68,7 +69,7 @@ func (*RemoteAskRequest) Descriptor() ([]byte, []int) {
 	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{0}
 }
 
-func (x *RemoteAskRequest) GetReceiver() *Address {
+func (x *RemoteAskRequest) GetReceiver() *v1.Address {
 	if x != nil {
 		return x.Receiver
 	}
@@ -139,7 +140,7 @@ type RemoteTellRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	RemoteMessage *RemoteMessage `protobuf:"bytes,1,opt,name=remote_message,json=remoteMessage,proto3" json:"remote_message,omitempty"`
+	RemoteMessage *v1.RemoteMessage `protobuf:"bytes,1,opt,name=remote_message,json=remoteMessage,proto3" json:"remote_message,omitempty"`
 }
 
 func (x *RemoteTellRequest) Reset() {
@@ -174,7 +175,7 @@ func (*RemoteTellRequest) Descriptor() ([]byte, []int) {
 	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *RemoteTellRequest) GetRemoteMessage() *RemoteMessage {
+func (x *RemoteTellRequest) GetRemoteMessage() *v1.RemoteMessage {
 	if x != nil {
 		return x.RemoteMessage
 	}
@@ -219,82 +220,6 @@ func (*RemoteTellResponse) Descriptor() ([]byte, []int) {
 	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{3}
 }
 
-// Address represents an actor address
-type Address struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Specifies the remote host address
-	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
-	// Specifies the remote port
-	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
-	// Specifies the actor name
-	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
-	// Specifies the actor unique id on the remote host
-	Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"`
-}
-
-func (x *Address) Reset() {
-	*x = Address{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_goakt_v1_remoting_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Address) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Address) ProtoMessage() {}
-
-func (x *Address) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_v1_remoting_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Address.ProtoReflect.Descriptor instead.
-func (*Address) Descriptor() ([]byte, []int) {
-	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *Address) GetHost() string {
-	if x != nil {
-		return x.Host
-	}
-	return ""
-}
-
-func (x *Address) GetPort() int32 {
-	if x != nil {
-		return x.Port
-	}
-	return 0
-}
-
-func (x *Address) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *Address) GetId() string {
-	if x != nil {
-		return x.Id
-	}
-	return ""
-}
-
 // RemoteLookupRequest checks whether a given actor exists on a remote host
 type RemoteLookupRequest struct {
 	state         protoimpl.MessageState
@@ -312,7 +237,7 @@ type RemoteLookupRequest struct {
 func (x *RemoteLookupRequest) Reset() {
 	*x = RemoteLookupRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_goakt_v1_remoting_proto_msgTypes[5]
+		mi := &file_goakt_v1_remoting_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -325,7 +250,7 @@ func (x *RemoteLookupRequest) String() string {
 func (*RemoteLookupRequest) ProtoMessage() {}
 
 func (x *RemoteLookupRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_v1_remoting_proto_msgTypes[5]
+	mi := &file_goakt_v1_remoting_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -338,7 +263,7 @@ func (x *RemoteLookupRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RemoteLookupRequest.ProtoReflect.Descriptor instead.
 func (*RemoteLookupRequest) Descriptor() ([]byte, []int) {
-	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{5}
+	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *RemoteLookupRequest) GetHost() string {
@@ -368,13 +293,13 @@ type RemoteLookupResponse struct {
 	unknownFields protoimpl.UnknownFields
 
 	// Specifies the actor address
-	Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Address *v1.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 }
 
 func (x *RemoteLookupResponse) Reset() {
 	*x = RemoteLookupResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_goakt_v1_remoting_proto_msgTypes[6]
+		mi := &file_goakt_v1_remoting_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -387,7 +312,7 @@ func (x *RemoteLookupResponse) String() string {
 func (*RemoteLookupResponse) ProtoMessage() {}
 
 func (x *RemoteLookupResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_v1_remoting_proto_msgTypes[6]
+	mi := &file_goakt_v1_remoting_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -400,159 +325,81 @@ func (x *RemoteLookupResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RemoteLookupResponse.ProtoReflect.Descriptor instead.
 func (*RemoteLookupResponse) Descriptor() ([]byte, []int) {
-	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{6}
+	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *RemoteLookupResponse) GetAddress() *Address {
+func (x *RemoteLookupResponse) GetAddress() *v1.Address {
 	if x != nil {
 		return x.Address
 	}
 	return nil
 }
 
-// RemoteMessage will be used by Actors to communicate remotely
-type RemoteMessage struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Specifies the sender' address
-	Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"`
-	// Specifies the actor address
-	Receiver *Address `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"`
-	// Specifies the message to send to the actor
-	// Any proto message is allowed to be sent
-	Message *anypb.Any `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
-}
-
-func (x *RemoteMessage) Reset() {
-	*x = RemoteMessage{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_goakt_v1_remoting_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *RemoteMessage) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*RemoteMessage) ProtoMessage() {}
-
-func (x *RemoteMessage) ProtoReflect() protoreflect.Message {
-	mi := &file_goakt_v1_remoting_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use RemoteMessage.ProtoReflect.Descriptor instead.
-func (*RemoteMessage) Descriptor() ([]byte, []int) {
-	return file_goakt_v1_remoting_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *RemoteMessage) GetSender() *Address {
-	if x != nil {
-		return x.Sender
-	}
-	return nil
-}
-
-func (x *RemoteMessage) GetReceiver() *Address {
-	if x != nil {
-		return x.Receiver
-	}
-	return nil
-}
-
-func (x *RemoteMessage) GetMessage() *anypb.Any {
-	if x != nil {
-		return x.Message
-	}
-	return nil
-}
-
 var File_goakt_v1_remoting_proto protoreflect.FileDescriptor
 
 var file_goakt_v1_remoting_proto_rawDesc = []byte{
 	0x0a, 0x17, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74,
 	0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x6f, 0x61, 0x6b, 0x74,
 	0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x71,
-	0x0a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e,
-	0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
-	0x72, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x22, 0x43, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65,
-	0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0e, 0x72,
-	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52,
-	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65,
-	0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x52,
-	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x55, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,
-	0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74,
-	0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,
-	0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f,
-	0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68,
-	0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x14, 0x52,
-	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e,
-	0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
-	0x22, 0x99, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x2d, 0x0a,
-	0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x11, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65,
-	0x73, 0x73, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xf6, 0x01, 0x0a,
-	0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x74,
-	0x65, 0x41, 0x73, 0x6b, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e,
-	0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f,
-	0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a,
-	0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x6f,
-	0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c,
-	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41,
+	0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x65, 0x63,
+	0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x07, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41,
+	0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x43, 0x0a, 0x11, 0x52,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x22, 0x56, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51,
+	0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x22, 0x46, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75,
+	0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x32, 0xf6, 0x01, 0x0a, 0x16, 0x52, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73,
+	0x6b, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x41, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,
+	0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41,
+	0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x52, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74,
 	0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65,
-	0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76,
-	0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31,
-	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x90, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
-	0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x69, 0x6e, 0x67,
-	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67,
-	0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76,
-	0x31, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x58, 0x58, 0xaa,
-	0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x47, 0x6f, 0x61,
-	0x6b, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31,
-	0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x47,
-	0x6f, 0x61, 0x6b, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f,
+	0x6b, 0x75, 0x70, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x42, 0x95, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x2e, 0x76, 0x31, 0x42, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b,
+	0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x58,
+	0x58, 0xaa, 0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x47,
+	0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c,
+	0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,
+	0x09, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
@@ -567,38 +414,35 @@ func file_goakt_v1_remoting_proto_rawDescGZIP() []byte {
 	return file_goakt_v1_remoting_proto_rawDescData
 }
 
-var file_goakt_v1_remoting_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
+var file_goakt_v1_remoting_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
 var file_goakt_v1_remoting_proto_goTypes = []interface{}{
 	(*RemoteAskRequest)(nil),     // 0: goakt.v1.RemoteAskRequest
 	(*RemoteAskResponse)(nil),    // 1: goakt.v1.RemoteAskResponse
 	(*RemoteTellRequest)(nil),    // 2: goakt.v1.RemoteTellRequest
 	(*RemoteTellResponse)(nil),   // 3: goakt.v1.RemoteTellResponse
-	(*Address)(nil),              // 4: goakt.v1.Address
-	(*RemoteLookupRequest)(nil),  // 5: goakt.v1.RemoteLookupRequest
-	(*RemoteLookupResponse)(nil), // 6: goakt.v1.RemoteLookupResponse
-	(*RemoteMessage)(nil),        // 7: goakt.v1.RemoteMessage
-	(*anypb.Any)(nil),            // 8: google.protobuf.Any
+	(*RemoteLookupRequest)(nil),  // 4: goakt.v1.RemoteLookupRequest
+	(*RemoteLookupResponse)(nil), // 5: goakt.v1.RemoteLookupResponse
+	(*v1.Address)(nil),           // 6: messages.v1.Address
+	(*anypb.Any)(nil),            // 7: google.protobuf.Any
+	(*v1.RemoteMessage)(nil),     // 8: messages.v1.RemoteMessage
 }
 var file_goakt_v1_remoting_proto_depIdxs = []int32{
-	4,  // 0: goakt.v1.RemoteAskRequest.receiver:type_name -> goakt.v1.Address
-	8,  // 1: goakt.v1.RemoteAskRequest.message:type_name -> google.protobuf.Any
-	8,  // 2: goakt.v1.RemoteAskResponse.message:type_name -> google.protobuf.Any
-	7,  // 3: goakt.v1.RemoteTellRequest.remote_message:type_name -> goakt.v1.RemoteMessage
-	4,  // 4: goakt.v1.RemoteLookupResponse.address:type_name -> goakt.v1.Address
-	4,  // 5: goakt.v1.RemoteMessage.sender:type_name -> goakt.v1.Address
-	4,  // 6: goakt.v1.RemoteMessage.receiver:type_name -> goakt.v1.Address
-	8,  // 7: goakt.v1.RemoteMessage.message:type_name -> google.protobuf.Any
-	0,  // 8: goakt.v1.RemoteMessagingService.RemoteAsk:input_type -> goakt.v1.RemoteAskRequest
-	2,  // 9: goakt.v1.RemoteMessagingService.RemoteTell:input_type -> goakt.v1.RemoteTellRequest
-	5,  // 10: goakt.v1.RemoteMessagingService.RemoteLookup:input_type -> goakt.v1.RemoteLookupRequest
-	1,  // 11: goakt.v1.RemoteMessagingService.RemoteAsk:output_type -> goakt.v1.RemoteAskResponse
-	3,  // 12: goakt.v1.RemoteMessagingService.RemoteTell:output_type -> goakt.v1.RemoteTellResponse
-	6,  // 13: goakt.v1.RemoteMessagingService.RemoteLookup:output_type -> goakt.v1.RemoteLookupResponse
-	11, // [11:14] is the sub-list for method output_type
-	8,  // [8:11] is the sub-list for method input_type
-	8,  // [8:8] is the sub-list for extension type_name
-	8,  // [8:8] is the sub-list for extension extendee
-	0,  // [0:8] is the sub-list for field type_name
+	6, // 0: goakt.v1.RemoteAskRequest.receiver:type_name -> messages.v1.Address
+	7, // 1: goakt.v1.RemoteAskRequest.message:type_name -> google.protobuf.Any
+	7, // 2: goakt.v1.RemoteAskResponse.message:type_name -> google.protobuf.Any
+	8, // 3: goakt.v1.RemoteTellRequest.remote_message:type_name -> messages.v1.RemoteMessage
+	6, // 4: goakt.v1.RemoteLookupResponse.address:type_name -> messages.v1.Address
+	0, // 5: goakt.v1.RemoteMessagingService.RemoteAsk:input_type -> goakt.v1.RemoteAskRequest
+	2, // 6: goakt.v1.RemoteMessagingService.RemoteTell:input_type -> goakt.v1.RemoteTellRequest
+	4, // 7: goakt.v1.RemoteMessagingService.RemoteLookup:input_type -> goakt.v1.RemoteLookupRequest
+	1, // 8: goakt.v1.RemoteMessagingService.RemoteAsk:output_type -> goakt.v1.RemoteAskResponse
+	3, // 9: goakt.v1.RemoteMessagingService.RemoteTell:output_type -> goakt.v1.RemoteTellResponse
+	5, // 10: goakt.v1.RemoteMessagingService.RemoteLookup:output_type -> goakt.v1.RemoteLookupResponse
+	8, // [8:11] is the sub-list for method output_type
+	5, // [5:8] is the sub-list for method input_type
+	5, // [5:5] is the sub-list for extension type_name
+	5, // [5:5] is the sub-list for extension extendee
+	0, // [0:5] is the sub-list for field type_name
 }
 
 func init() { file_goakt_v1_remoting_proto_init() }
@@ -656,18 +500,6 @@ func file_goakt_v1_remoting_proto_init() {
 			}
 		}
 		file_goakt_v1_remoting_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Address); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_goakt_v1_remoting_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RemoteLookupRequest); i {
 			case 0:
 				return &v.state
@@ -679,7 +511,7 @@ func file_goakt_v1_remoting_proto_init() {
 				return nil
 			}
 		}
-		file_goakt_v1_remoting_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+		file_goakt_v1_remoting_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RemoteLookupResponse); i {
 			case 0:
 				return &v.state
@@ -691,18 +523,6 @@ func file_goakt_v1_remoting_proto_init() {
 				return nil
 			}
 		}
-		file_goakt_v1_remoting_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RemoteMessage); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -710,7 +530,7 @@ func file_goakt_v1_remoting_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_goakt_v1_remoting_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   8,
+			NumMessages:   6,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/pb/goakt/v1/remoting_grpc.pb.go b/internal/goakt/v1/remoting_grpc.pb.go
similarity index 100%
rename from pb/goakt/v1/remoting_grpc.pb.go
rename to internal/goakt/v1/remoting_grpc.pb.go
diff --git a/messages/v1/address.pb.go b/messages/v1/address.pb.go
new file mode 100644
index 0000000..b4096ef
--- /dev/null
+++ b/messages/v1/address.pb.go
@@ -0,0 +1,185 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.1
+// 	protoc        (unknown)
+// source: messages/v1/address.proto
+
+package messagesv1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Address represents an actor address
+type Address struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the remote host address
+	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
+	// Specifies the remote port
+	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
+	// Specifies the actor name
+	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// Specifies the actor unique id on the remote host
+	Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"`
+}
+
+func (x *Address) Reset() {
+	*x = Address{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_messages_v1_address_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Address) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Address) ProtoMessage() {}
+
+func (x *Address) ProtoReflect() protoreflect.Message {
+	mi := &file_messages_v1_address_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LocalAddress.ProtoReflect.Descriptor instead.
+func (*Address) Descriptor() ([]byte, []int) {
+	return file_messages_v1_address_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Address) GetHost() string {
+	if x != nil {
+		return x.Host
+	}
+	return ""
+}
+
+func (x *Address) GetPort() int32 {
+	if x != nil {
+		return x.Port
+	}
+	return 0
+}
+
+func (x *Address) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Address) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+var File_messages_v1_address_proto protoreflect.FileDescriptor
+
+var file_messages_v1_address_proto_rawDesc = []byte{
+	0x0a, 0x19, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x22, 0x55, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x42,
+	0xa0, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
+	0x2e, 0x76, 0x31, 0x42, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74,
+	0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0b,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x3a,
+	0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_messages_v1_address_proto_rawDescOnce sync.Once
+	file_messages_v1_address_proto_rawDescData = file_messages_v1_address_proto_rawDesc
+)
+
+func file_messages_v1_address_proto_rawDescGZIP() []byte {
+	file_messages_v1_address_proto_rawDescOnce.Do(func() {
+		file_messages_v1_address_proto_rawDescData = protoimpl.X.CompressGZIP(file_messages_v1_address_proto_rawDescData)
+	})
+	return file_messages_v1_address_proto_rawDescData
+}
+
+var file_messages_v1_address_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_messages_v1_address_proto_goTypes = []interface{}{
+	(*Address)(nil), // 0: messages.v1.LocalAddress
+}
+var file_messages_v1_address_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_messages_v1_address_proto_init() }
+func file_messages_v1_address_proto_init() {
+	if File_messages_v1_address_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_messages_v1_address_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Address); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_messages_v1_address_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_messages_v1_address_proto_goTypes,
+		DependencyIndexes: file_messages_v1_address_proto_depIdxs,
+		MessageInfos:      file_messages_v1_address_proto_msgTypes,
+	}.Build()
+	File_messages_v1_address_proto = out.File
+	file_messages_v1_address_proto_rawDesc = nil
+	file_messages_v1_address_proto_goTypes = nil
+	file_messages_v1_address_proto_depIdxs = nil
+}
diff --git a/messages/v1/messages.pb.go b/messages/v1/messages.pb.go
new file mode 100644
index 0000000..1c7609e
--- /dev/null
+++ b/messages/v1/messages.pb.go
@@ -0,0 +1,192 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.1
+// 	protoc        (unknown)
+// source: messages/v1/messages.proto
+
+package messagesv1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	anypb "google.golang.org/protobuf/types/known/anypb"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// RemoteMessage will be used by Actors to communicate remotely
+type RemoteMessage struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies the sender' address
+	Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"`
+	// Specifies the actor address
+	Receiver *Address `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"`
+	// Specifies the message to send to the actor
+	// Any proto message is allowed to be sent
+	Message *anypb.Any `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *RemoteMessage) Reset() {
+	*x = RemoteMessage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_messages_v1_messages_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemoteMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemoteMessage) ProtoMessage() {}
+
+func (x *RemoteMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_messages_v1_messages_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RemoteMessage.ProtoReflect.Descriptor instead.
+func (*RemoteMessage) Descriptor() ([]byte, []int) {
+	return file_messages_v1_messages_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *RemoteMessage) GetSender() *Address {
+	if x != nil {
+		return x.Sender
+	}
+	return nil
+}
+
+func (x *RemoteMessage) GetReceiver() *Address {
+	if x != nil {
+		return x.Receiver
+	}
+	return nil
+}
+
+func (x *RemoteMessage) GetMessage() *anypb.Any {
+	if x != nil {
+		return x.Message
+	}
+	return nil
+}
+
+var File_messages_v1_messages_proto protoreflect.FileDescriptor
+
+var file_messages_v1_messages_proto_rawDesc = []byte{
+	0x0a, 0x1a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
+	0x9f, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
+	0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12,
+	0x30, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
+	0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
+	0x72, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x42, 0xa1, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x73, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f,
+	0x61, 0x6b, 0x74, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x3b,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58,
+	0xaa, 0x02, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02,
+	0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_messages_v1_messages_proto_rawDescOnce sync.Once
+	file_messages_v1_messages_proto_rawDescData = file_messages_v1_messages_proto_rawDesc
+)
+
+func file_messages_v1_messages_proto_rawDescGZIP() []byte {
+	file_messages_v1_messages_proto_rawDescOnce.Do(func() {
+		file_messages_v1_messages_proto_rawDescData = protoimpl.X.CompressGZIP(file_messages_v1_messages_proto_rawDescData)
+	})
+	return file_messages_v1_messages_proto_rawDescData
+}
+
+var file_messages_v1_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_messages_v1_messages_proto_goTypes = []interface{}{
+	(*RemoteMessage)(nil), // 0: messages.v1.RemoteMessage
+	(*Address)(nil),       // 1: messages.v1.LocalAddress
+	(*anypb.Any)(nil),     // 2: google.protobuf.Any
+}
+var file_messages_v1_messages_proto_depIdxs = []int32{
+	1, // 0: messages.v1.RemoteMessage.sender:type_name -> messages.v1.LocalAddress
+	1, // 1: messages.v1.RemoteMessage.receiver:type_name -> messages.v1.LocalAddress
+	2, // 2: messages.v1.RemoteMessage.message:type_name -> google.protobuf.Any
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_messages_v1_messages_proto_init() }
+func file_messages_v1_messages_proto_init() {
+	if File_messages_v1_messages_proto != nil {
+		return
+	}
+	file_messages_v1_address_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_messages_v1_messages_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemoteMessage); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_messages_v1_messages_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_messages_v1_messages_proto_goTypes,
+		DependencyIndexes: file_messages_v1_messages_proto_depIdxs,
+		MessageInfos:      file_messages_v1_messages_proto_msgTypes,
+	}.Build()
+	File_messages_v1_messages_proto = out.File
+	file_messages_v1_messages_proto_rawDesc = nil
+	file_messages_v1_messages_proto_goTypes = nil
+	file_messages_v1_messages_proto_depIdxs = nil
+}
diff --git a/pb/goakt/v1/supervisor.pb.go b/pb/goakt/v1/supervisor.pb.go
deleted file mode 100644
index 728a693..0000000
--- a/pb/goakt/v1/supervisor.pb.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        (unknown)
-// source: goakt/v1/supervisor.proto
-
-package goaktv1
-
-import (
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	reflect "reflect"
-	sync "sync"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-// Strategy is used to handle a failed child actor
-type StrategyDirective int32
-
-const (
-	// STOP means stop the child actor in case of error
-	StrategyDirective_STOP_DIRECTIVE StrategyDirective = 0
-	// RESTART means restart the child actor in case of error
-	StrategyDirective_RESTART_DIRECTIVE StrategyDirective = 1
-)
-
-// Enum value maps for StrategyDirective.
-var (
-	StrategyDirective_name = map[int32]string{
-		0: "STOP_DIRECTIVE",
-		1: "RESTART_DIRECTIVE",
-	}
-	StrategyDirective_value = map[string]int32{
-		"STOP_DIRECTIVE":    0,
-		"RESTART_DIRECTIVE": 1,
-	}
-)
-
-func (x StrategyDirective) Enum() *StrategyDirective {
-	p := new(StrategyDirective)
-	*p = x
-	return p
-}
-
-func (x StrategyDirective) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (StrategyDirective) Descriptor() protoreflect.EnumDescriptor {
-	return file_goakt_v1_supervisor_proto_enumTypes[0].Descriptor()
-}
-
-func (StrategyDirective) Type() protoreflect.EnumType {
-	return &file_goakt_v1_supervisor_proto_enumTypes[0]
-}
-
-func (x StrategyDirective) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use StrategyDirective.Descriptor instead.
-func (StrategyDirective) EnumDescriptor() ([]byte, []int) {
-	return file_goakt_v1_supervisor_proto_rawDescGZIP(), []int{0}
-}
-
-var File_goakt_v1_supervisor_proto protoreflect.FileDescriptor
-
-var file_goakt_v1_supervisor_proto_rawDesc = []byte{
-	0x0a, 0x19, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72,
-	0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x6f, 0x61,
-	0x6b, 0x74, 0x2e, 0x76, 0x31, 0x2a, 0x3e, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67,
-	0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54,
-	0x4f, 0x50, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x00, 0x12, 0x15,
-	0x0a, 0x11, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54,
-	0x49, 0x56, 0x45, 0x10, 0x01, 0x42, 0x92, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
-	0x61, 0x6b, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73,
-	0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74,
-	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x79,
-	0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74,
-	0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x47, 0x58,
-	0x58, 0xaa, 0x02, 0x08, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x47,
-	0x6f, 0x61, 0x6b, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x5c,
-	0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,
-	0x09, 0x47, 0x6f, 0x61, 0x6b, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
-}
-
-var (
-	file_goakt_v1_supervisor_proto_rawDescOnce sync.Once
-	file_goakt_v1_supervisor_proto_rawDescData = file_goakt_v1_supervisor_proto_rawDesc
-)
-
-func file_goakt_v1_supervisor_proto_rawDescGZIP() []byte {
-	file_goakt_v1_supervisor_proto_rawDescOnce.Do(func() {
-		file_goakt_v1_supervisor_proto_rawDescData = protoimpl.X.CompressGZIP(file_goakt_v1_supervisor_proto_rawDescData)
-	})
-	return file_goakt_v1_supervisor_proto_rawDescData
-}
-
-var file_goakt_v1_supervisor_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_goakt_v1_supervisor_proto_goTypes = []interface{}{
-	(StrategyDirective)(0), // 0: goakt.v1.StrategyDirective
-}
-var file_goakt_v1_supervisor_proto_depIdxs = []int32{
-	0, // [0:0] is the sub-list for method output_type
-	0, // [0:0] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_goakt_v1_supervisor_proto_init() }
-func file_goakt_v1_supervisor_proto_init() {
-	if File_goakt_v1_supervisor_proto != nil {
-		return
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_goakt_v1_supervisor_proto_rawDesc,
-			NumEnums:      1,
-			NumMessages:   0,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_goakt_v1_supervisor_proto_goTypes,
-		DependencyIndexes: file_goakt_v1_supervisor_proto_depIdxs,
-		EnumInfos:         file_goakt_v1_supervisor_proto_enumTypes,
-	}.Build()
-	File_goakt_v1_supervisor_proto = out.File
-	file_goakt_v1_supervisor_proto_rawDesc = nil
-	file_goakt_v1_supervisor_proto_goTypes = nil
-	file_goakt_v1_supervisor_proto_depIdxs = nil
-}
diff --git a/protos/internal/goakt/v1/cluster.proto b/protos/internal/goakt/v1/cluster.proto
new file mode 100644
index 0000000..00c5558
--- /dev/null
+++ b/protos/internal/goakt/v1/cluster.proto
@@ -0,0 +1,87 @@
+syntax = "proto3";
+
+package goakt.v1;
+
+import "messages/v1/address.proto";
+
+option go_package = "github.com/tochemey/goakt/internal/goakt/v1;goaktv1";
+
+// ClusterService specifies the Go-Akt cluster service
+service ClusterService {
+  // PutActor adds an actor meta to the cluster
+  rpc PutActor(PutActorRequest) returns (PutActorResponse);
+  // GetActor reads an actor meta from the cluster
+  rpc GetActor(GetActorRequest) returns (GetActorResponse);
+  // AddNode adds a new node to the cluster
+  rpc AddNode(AddNodeRequest) returns (AddNodeResponse);
+  // RemoveNode removes a node from the cluster
+  rpc RemoveNode(RemoveNodeRequest) returns (RemoveNodeResponse);
+}
+
+// PutActorRequest is used to put an actor
+// meta information onto the state store
+message PutActorRequest {
+  // Specifies the actor
+  WireActor actor = 1;
+}
+
+message PutActorResponse {}
+
+// GetActorRequest is used to fetch an actor from the cluster
+message GetActorRequest {
+  // Specifies the actor name
+  string actor_name = 1;
+}
+
+message GetActorResponse {
+  // Specifies the actor meta on the wire
+  WireActor actor = 1;
+}
+
+// AddNodeRequest is used to add a node to the cluster
+message AddNodeRequest {
+  // Specifies the node ID
+  uint32 node_id = 1;
+  // Specifies the node host address
+  string host = 2;
+  // Specifies the remote port
+  int32 port = 3;
+}
+
+message AddNodeResponse {}
+
+// RemoveNodeRequest removes a node from the cluster
+message RemoveNodeRequest {
+  // Specifies the node ID
+  uint32 node_id = 1;
+}
+
+message RemoveNodeResponse {}
+
+// WireState specifies the raft Finite State Machine entries
+message WireState {
+  // Specifies raft FSM entries
+  map<string, WireActor> actors = 1;
+}
+
+// WireActor represents the actor information on the
+// wire
+message WireActor {
+  // Specifies the actor name.
+  // The actor name can be either the actor FQN or an alias
+  string actor_name = 1;
+  // Specifies the actor address
+  messages.v1.Address actor_address = 2;
+  // Specifies the actor payload. The payload is used
+  // to recreate this actor in case the node hosting the actor is dead and we want to recreate the given actor
+  // on another node of the cluster
+  bytes actor_payload = 3;
+}
+
+// Peer specifies the node peer settings
+message Peer {
+  // Specifies the peer unique id
+  uint32 node_id = 1;
+  // Specifies the peer host and port
+  string host_and_port = 2;
+}
diff --git a/protos/internal/goakt/v1/persistence.proto b/protos/internal/goakt/v1/persistence.proto
index fc1a827..60ddf44 100644
--- a/protos/internal/goakt/v1/persistence.proto
+++ b/protos/internal/goakt/v1/persistence.proto
@@ -4,6 +4,8 @@ package goakt.v1;
 
 import "google/protobuf/any.proto";
 
+option go_package = "github.com/tochemey/goakt/internal/goakt/v1;goaktv1";
+
 message Event {
   // Specifies the persistence unique identifier
   string persistence_id = 1;
diff --git a/protos/internal/goakt/v1/remoting.proto b/protos/internal/goakt/v1/remoting.proto
index bc930b2..d2a639f 100644
--- a/protos/internal/goakt/v1/remoting.proto
+++ b/protos/internal/goakt/v1/remoting.proto
@@ -3,6 +3,10 @@ syntax = "proto3";
 package goakt.v1;
 
 import "google/protobuf/any.proto";
+import "messages/v1/address.proto";
+import "messages/v1/messages.proto";
+
+option go_package = "github.com/tochemey/goakt/internal/goakt/v1;goaktv1";
 
 service RemoteMessagingService {
   // RemoteAsk is used to send a message to an actor remotely and expect a response
@@ -22,7 +26,7 @@ service RemoteMessagingService {
 // except reply the message with a response. This one-way communication
 message RemoteAskRequest {
   // Specifies the receiver' address
-  Address receiver = 1;
+  messages.v1.Address receiver = 1;
   // Specifies the message to send to the actor
   // Any proto message is allowed to be sent
   google.protobuf.Any message = 2;
@@ -38,23 +42,11 @@ message RemoteAskResponse {
 // This is the only way remote actors can interact with each other. The actor on the
 // other line can reply to the sender by using the Sender in the message
 message RemoteTellRequest {
-  RemoteMessage remote_message = 1;
+  messages.v1.RemoteMessage remote_message = 1;
 }
 
 message RemoteTellResponse {}
 
-// Address represents an actor address
-message Address {
-  // Specifies the remote host address
-  string host = 1;
-  // Specifies the remote port
-  int32 port = 2;
-  // Specifies the actor name
-  string name = 3;
-  // Specifies the actor unique id on the remote host
-  string id = 4;
-}
-
 // RemoteLookupRequest checks whether a given actor exists on a remote host
 message RemoteLookupRequest {
   // Specifies the remote host address
@@ -67,16 +59,5 @@ message RemoteLookupRequest {
 
 message RemoteLookupResponse {
   // Specifies the actor address
-  Address address = 1;
-}
-
-// RemoteMessage will be used by Actors to communicate remotely
-message RemoteMessage {
-  // Specifies the sender' address
-  Address sender = 1;
-  // Specifies the actor address
-  Address receiver = 2;
-  // Specifies the message to send to the actor
-  // Any proto message is allowed to be sent
-  google.protobuf.Any message = 3;
+  messages.v1.Address address = 1;
 }
diff --git a/protos/internal/goakt/v1/supervisor.proto b/protos/internal/goakt/v1/supervisor.proto
deleted file mode 100644
index f263dce..0000000
--- a/protos/internal/goakt/v1/supervisor.proto
+++ /dev/null
@@ -1,11 +0,0 @@
-syntax = "proto3";
-
-package goakt.v1;
-
-// Strategy is used to handle a failed child actor
-enum StrategyDirective {
-  // STOP means stop the child actor in case of error
-  STOP_DIRECTIVE = 0;
-  // RESTART means restart the child actor in case of error
-  RESTART_DIRECTIVE = 1;
-}
diff --git a/protos/public/messages/v1/address.proto b/protos/public/messages/v1/address.proto
new file mode 100644
index 0000000..5cc7bc8
--- /dev/null
+++ b/protos/public/messages/v1/address.proto
@@ -0,0 +1,17 @@
+syntax = "proto3";
+
+package messages.v1;
+
+option go_package = "github.com/tochemey/goakt/messages/v1;messagesv1";
+
+// Address represents an actor address
+message Address {
+  // Specifies the remote host address
+  string host = 1;
+  // Specifies the remote port
+  int32 port = 2;
+  // Specifies the actor name
+  string name = 3;
+  // Specifies the actor unique id on the remote host
+  string id = 4;
+}
diff --git a/protos/public/messages/v1/messages.proto b/protos/public/messages/v1/messages.proto
new file mode 100644
index 0000000..d0cdb27
--- /dev/null
+++ b/protos/public/messages/v1/messages.proto
@@ -0,0 +1,19 @@
+syntax = "proto3";
+
+package messages.v1;
+
+option go_package = "github.com/tochemey/goakt/messages/v1;messagesv1";
+
+import "messages/v1/address.proto";
+import "google/protobuf/any.proto";
+
+// RemoteMessage will be used by Actors to communicate remotely
+message RemoteMessage {
+  // Specifies the sender' address
+  Address sender = 1;
+  // Specifies the actor address
+  Address receiver = 2;
+  // Specifies the message to send to the actor
+  // Any proto message is allowed to be sent
+  google.protobuf.Any message = 3;
+}
diff --git a/readme.md b/readme.md
index 6a47921..19abe72 100644
--- a/readme.md
+++ b/readme.md
@@ -34,7 +34,7 @@ Also, check reference section at the end of the post for more material regarding
 
 ## Installation
 ```bash
-go get github.com/Tochemey/goakt
+go get github.com/Tochemey/messages
 ```
 
 ## Example
@@ -53,8 +53,8 @@ import (
   "syscall"
   "time"
 
-  goakt "github.com/tochemey/goakt/actors"
-  samplepb "github.com/tochemey/goakt/examples/protos/pb/v1"
+  goakt "github.com/tochemey/messages/actors"
+  samplepb "github.com/tochemey/messages/examples/protos/pb/v1"
   "github.com/tochemey/goakt/log"
   "go.uber.org/atomic"
 )
@@ -62,7 +62,7 @@ import (
 func main() {
   ctx := context.Background()
 
-  // use the goakt default logger. real-life implement the logger interface`
+  // use the messages default logger. real-life implement the logger interface`
   logger := log.DefaultLogger
   // create the actor system configuration. kindly in real-life application handle the error
   config, _ := goakt.NewConfig("SampleActorSystem", "127.0.0.1:0",
@@ -81,7 +81,7 @@ func main() {
 
   startTime := time.Now()
 
-  // send some messages to the actor
+  // send some public to the actor
   count := 100
   for i := 0; i < count; i++ {
     _ = goakt.SendAsync(ctx, actor, new(samplepb.Ping))
@@ -93,7 +93,7 @@ func main() {
   <-interruptSignal
 
   // log some stats
-  logger.Infof("Actor=%s has processed %d messages in %s", actor.ActorPath().String(), actor.ReceivedCount(ctx), time.Since(startTime))
+  logger.Infof("Actor=%s has processed %d public in %s", actor.ActorPath().String(), actor.ReceivedCount(ctx), time.Since(startTime))
 
   // stop the actor system
   _ = actorSystem.Stop(ctx)
@@ -136,7 +136,7 @@ func (p *Pinger) Receive(ctx goakt.ReceiveContext) {
 
 func (p *Pinger) PostStop(ctx context.Context) error {
   p.logger.Info("About to stop")
-  p.logger.Infof("Processed=%d messages", p.count.Load())
+  p.logger.Infof("Processed=%d public", p.count.Load())
   return nil
 }
 
diff --git a/telemetry/actor_metrics.go b/telemetry/actor_metrics.go
index 8b7a6ab..7caa5c1 100644
--- a/telemetry/actor_metrics.go
+++ b/telemetry/actor_metrics.go
@@ -33,7 +33,7 @@ func NewMetrics(meter metric.Meter) (*ActorMetrics, error) {
 	if metrics.PanicCount, err = meter.Int64ObservableCounter(
 		failureCounterName,
 		instrument.WithDescription("The total number of failures(panic) by the actor"),
-		instrument.WithUnit(unit.Dimensionless),
+		instrument.WithUnit(string(unit.Dimensionless)),
 	); err != nil {
 		return nil, fmt.Errorf("failed to create failure count instrument, %v", err)
 	}
@@ -47,21 +47,19 @@ func NewMetrics(meter metric.Meter) (*ActorMetrics, error) {
 
 	if metrics.RestartedCount, err = meter.Int64ObservableCounter(
 		restartedCounterName,
-		instrument.WithDescription("The total number of restart"),
-		instrument.WithUnit(unit.Dimensionless)); err != nil {
+		instrument.WithDescription("The total number of restart")); err != nil {
 		return nil, fmt.Errorf("failed to create restart count instrument, %v", err)
 	}
 
 	if metrics.ReceivedCount, err = meter.Int64ObservableCounter(
-		receivedCounterName, instrument.WithDescription("The total number of messages received"),
-		instrument.WithUnit(unit.Dimensionless)); err != nil {
+		receivedCounterName, instrument.WithDescription("The total number of messages received")); err != nil {
 		return nil, fmt.Errorf("failed to create received count instrument, %v", err)
 	}
 
 	if metrics.ReceivedDurationHistogram, err = meter.Float64Histogram(
 		receivedDurationHistogramName,
 		instrument.WithDescription("The latency of received message in milliseconds"),
-		instrument.WithUnit(unit.Milliseconds),
+		instrument.WithUnit("ms"),
 	); err != nil {
 		return nil, fmt.Errorf("failed to create latency instrument, %v", err)
 	}
diff --git a/telemetry/system_metrics.go b/telemetry/system_metrics.go
index d4ac918..9ced152 100644
--- a/telemetry/system_metrics.go
+++ b/telemetry/system_metrics.go
@@ -5,7 +5,6 @@ import (
 
 	"go.opentelemetry.io/otel/metric"
 	"go.opentelemetry.io/otel/metric/instrument"
-	"go.opentelemetry.io/otel/metric/unit"
 )
 
 // SystemMetrics define the type of metrics we are collecting
@@ -22,8 +21,7 @@ func NewSystemMetrics(meter metric.Meter) (*SystemMetrics, error) {
 	var err error
 
 	if metrics.ActorSystemActorsCount, err = meter.Int64ObservableCounter(
-		actorSystemActorsCounterName, instrument.WithDescription("The total number of actors in the Actor System"),
-		instrument.WithUnit(unit.Dimensionless)); err != nil {
+		actorSystemActorsCounterName, instrument.WithDescription("The total number of actors in the Actor System")); err != nil {
 		return nil, fmt.Errorf("failed to create received count instrument, %v", err)
 	}
 


Test patch:
diff --git a/actors/config_test.go b/actors/config_test.go
index 371b459..3e2e67f 100644
--- a/actors/config_test.go
+++ b/actors/config_test.go
@@ -7,7 +7,6 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 )
 
 func TestConfig(t *testing.T) {
@@ -68,8 +67,8 @@ func TestOptions(t *testing.T) {
 		},
 		{
 			name:           "WithSupervisorStrategy",
-			option:         WithSupervisorStrategy(pb.StrategyDirective_RESTART_DIRECTIVE),
-			expectedConfig: Config{supervisorStrategy: pb.StrategyDirective_RESTART_DIRECTIVE},
+			option:         WithSupervisorStrategy(RestartDirective),
+			expectedConfig: Config{supervisorStrategy: RestartDirective},
 		},
 	}
 	for _, tc := range testCases {
diff --git a/actors/helper_test.go b/actors/helper_test.go
index 234cd60..7480a39 100644
--- a/actors/helper_test.go
+++ b/actors/helper_test.go
@@ -45,7 +45,7 @@ func NewTestActor() *TestActor {
 }
 
 // Init initialize the actor. This function can be used to set up some database connections
-// or some sort of initialization before the actor init processing messages
+// or some sort of initialization before the actor init processing public
 func (p *TestActor) PreStart(context.Context) error {
 	return nil
 }
diff --git a/actors/address_test.go b/actors/local_address_test.go
similarity index 58%
rename from actors/address_test.go
rename to actors/local_address_test.go
index 4dea261..d5ecd09 100644
--- a/actors/address_test.go
+++ b/actors/local_address_test.go
@@ -8,48 +8,48 @@ import (
 
 func TestActorAddress(t *testing.T) {
 	t.Run("testCase1", func(t *testing.T) {
-		address := "goakt://sys@host:1234/abc/def/"
-		expected := "goakt://sys@host:1234"
-		addr := new(Address)
+		address := "messages://sys@host:1234/abc/def/"
+		expected := "messages://sys@host:1234"
+		addr := new(LocalAddress)
 		actual := addr.Parse(address)
 		assert.Equal(t, expected, actual.String())
 	})
 
 	t.Run("testCase2", func(t *testing.T) {
-		address := "goakt://sys/abc/def"
-		addr := new(Address)
+		address := "messages://sys/abc/def"
+		addr := new(LocalAddress)
 		assert.Panics(t, func() {
 			addr.Parse(address)
 		})
 	})
 
 	t.Run("testCase3", func(t *testing.T) {
-		address := "goakt://host:1234/abc/def/"
-		expected := "goakt://host:1234"
-		addr := new(Address)
+		address := "messages://host:1234/abc/def/"
+		expected := "messages://host:1234"
+		addr := new(LocalAddress)
 		actual := addr.Parse(address)
 		assert.Equal(t, expected, actual.String())
 	})
 
 	t.Run("testCase4", func(t *testing.T) {
-		address := "goakt://sys@host:1234"
-		expected := "goakt://sys@host:1234"
-		addr := new(Address)
+		address := "messages://sys@host:1234"
+		expected := "messages://sys@host:1234"
+		addr := new(LocalAddress)
 		actual := addr.Parse(address)
 		assert.Equal(t, expected, actual.String())
 	})
 
 	t.Run("testCase5", func(t *testing.T) {
-		address := "goakt://sys@host:1234/"
-		expected := "goakt://sys@host:1234"
-		addr := new(Address)
+		address := "messages://sys@host:1234/"
+		expected := "messages://sys@host:1234"
+		addr := new(LocalAddress)
 		actual := addr.Parse(address)
 		assert.Equal(t, expected, actual.String())
 	})
 
 	t.Run("testCase6", func(t *testing.T) {
-		address := "goakt://sys@host/abc/def/"
-		addr := new(Address)
+		address := "messages://sys@host/abc/def/"
+		addr := new(LocalAddress)
 		assert.Panics(t, func() {
 			addr.Parse(address)
 		})
diff --git a/actors/path_test.go b/actors/path_test.go
index fcb29ae..88f771a 100644
--- a/actors/path_test.go
+++ b/actors/path_test.go
@@ -5,13 +5,13 @@ import (
 
 	comp "github.com/google/go-cmp/cmp"
 	"github.com/stretchr/testify/assert"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
+	pb "github.com/tochemey/goakt/messages/v1"
 	"google.golang.org/protobuf/encoding/prototext"
 )
 
 func TestPath(t *testing.T) {
 	name := "TestActor"
-	addr := &Address{
+	addr := &LocalAddress{
 		host:     "localhost",
 		port:     888,
 		system:   "Sys",
@@ -23,14 +23,22 @@ func TestPath(t *testing.T) {
 	assert.IsType(t, new(Path), path)
 
 	// these are just routine assertions
-	assert.True(t, comp.Equal(addr, path.Address(), comp.AllowUnexported(Address{})))
+	assert.True(t, comp.Equal(addr, path.LocalAddress(), comp.AllowUnexported(LocalAddress{})))
 	assert.Equal(t, name, path.Name())
-	assert.Equal(t, "goakt://Sys@localhost:888/TestActor", path.String())
+	assert.Equal(t, "messages://Sys@localhost:888/TestActor", path.String())
 	remoteAddr := &pb.Address{
 		Host: "localhost",
 		Port: 888,
 		Name: name,
 		Id:   path.ID().String(),
 	}
-	assert.Equal(t, prototext.Format(remoteAddr), prototext.Format(path.RemoteAddress()))
+
+	pathRemoteAddr := &pb.Address{
+		Host: path.LocalAddress().Host(),
+		Port: int32(path.LocalAddress().Port()),
+		Name: path.Name(),
+		Id:   path.ID().String(),
+	}
+
+	assert.Equal(t, prototext.Format(remoteAddr), prototext.Format(pathRemoteAddr))
 }
diff --git a/actors/pid_map_test.go b/actors/pid_map_test.go
index ac98056..b419acb 100644
--- a/actors/pid_map_test.go
+++ b/actors/pid_map_test.go
@@ -8,7 +8,7 @@ import (
 
 func TestPIDMap(t *testing.T) {
 	// create the actor path
-	actorPath := NewPath("Test", NewAddress(protocol, "TestSys", "host", 444))
+	actorPath := NewPath("Test", NewLocalAddress(protocol, "TestSys", "host", 444))
 	// create the PID
 	actorRef := &pid{actorPath: actorPath}
 	// create a new PID map
diff --git a/actors/pid_option_test.go b/actors/pid_option_test.go
index 22297d9..ada82b0 100644
--- a/actors/pid_option_test.go
+++ b/actors/pid_option_test.go
@@ -6,7 +6,6 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 )
 
 func TestPIDOptions(t *testing.T) {
@@ -37,8 +36,8 @@ func TestPIDOptions(t *testing.T) {
 		},
 		{
 			name:           "WithSupervisorStrategy",
-			option:         withSupervisorStrategy(pb.StrategyDirective_RESTART_DIRECTIVE),
-			expectedConfig: &pid{supervisorStrategy: pb.StrategyDirective_RESTART_DIRECTIVE},
+			option:         withSupervisorStrategy(RestartDirective),
+			expectedConfig: &pid{supervisorStrategy: RestartDirective},
 		},
 		{
 			name:           "WithShutdownTimeout",
diff --git a/actors/pid_test.go b/actors/pid_test.go
index 04baa6d..ab8ee18 100644
--- a/actors/pid_test.go
+++ b/actors/pid_test.go
@@ -10,7 +10,6 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"github.com/tochemey/goakt/log"
-	pb "github.com/tochemey/goakt/pb/goakt/v1"
 	testpb "github.com/tochemey/goakt/test/data/pb/v1"
 	"go.uber.org/goleak"
 	"google.golang.org/protobuf/proto"
@@ -27,7 +26,7 @@ func TestActorReceive(t *testing.T) {
 	ctx := context.TODO()
 
 	// create the actor path
-	actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+	actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 
 	// create the actor ref
 	pid := newPID(
@@ -39,7 +38,7 @@ func TestActorReceive(t *testing.T) {
 		withSendReplyTimeout(recvTimeout))
 
 	assert.NotNil(t, pid)
-	// let us send 10 messages to the actor
+	// let us send 10 public to the actor
 	count := 10
 	for i := 0; i < count; i++ {
 		recvContext := &receiveContext{
@@ -70,7 +69,7 @@ func TestActorWithPassivation(t *testing.T) {
 	}
 
 	// create the actor path
-	actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+	actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 	pid := newPID(ctx, actorPath, NewTestActor(), opts...)
 	assert.NotNil(t, pid)
 
@@ -100,7 +99,7 @@ func TestActorWithReply(t *testing.T) {
 		}
 
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, NewTestActor(), opts...)
 		assert.NotNil(t, pid)
 
@@ -123,7 +122,7 @@ func TestActorWithReply(t *testing.T) {
 		}
 
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, NewTestActor(), opts...)
 		assert.NotNil(t, pid)
 
@@ -150,7 +149,7 @@ func TestActorRestart(t *testing.T) {
 		assert.NotNil(t, actor)
 
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		// create the actor ref
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
@@ -174,7 +173,7 @@ func TestActorRestart(t *testing.T) {
 		err = pid.Restart(ctx)
 		assert.NoError(t, err)
 		assert.True(t, pid.IsOnline())
-		// let us send 10 messages to the actor
+		// let us send 10 public to the actor
 		count := 10
 		for i := 0; i < count; i++ {
 			err = SendAsync(ctx, pid, new(testpb.TestSend))
@@ -189,7 +188,7 @@ func TestActorRestart(t *testing.T) {
 	//	defer goleak.VerifyNone(t)
 	//	ctx := context.TODO()
 	//	// create the actor path
-	//	actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+	//	actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 	//
 	//	// create a Ping actor
 	//	pid := newPID(
@@ -217,7 +216,7 @@ func TestActorRestart(t *testing.T) {
 		actor := NewTestActor()
 		assert.NotNil(t, actor)
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 
 		// create the actor ref
 		pid := newPID(ctx, actorPath, actor,
@@ -226,7 +225,7 @@ func TestActorRestart(t *testing.T) {
 			withCustomLogger(log.DiscardLogger),
 			withSendReplyTimeout(recvTimeout))
 		assert.NotNil(t, pid)
-		// let us send 10 messages to the actor
+		// let us send 10 public to the actor
 		count := 10
 		for i := 0; i < count; i++ {
 			err := SendAsync(ctx, pid, new(testpb.TestSend))
@@ -238,7 +237,7 @@ func TestActorRestart(t *testing.T) {
 		err := pid.Restart(ctx)
 		assert.NoError(t, err)
 		assert.True(t, pid.IsOnline())
-		// let us send 10 messages to the actor
+		// let us send 10 public to the actor
 		for i := 0; i < count; i++ {
 			err = SendAsync(ctx, pid, new(testpb.TestSend))
 			assert.NoError(t, err)
@@ -257,7 +256,7 @@ func TestChildActor(t *testing.T) {
 		// create a test context
 		ctx := context.TODO()
 		// create the actor path
-		actorPath := NewPath("Parent", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Parent", NewLocalAddress(protocol, "sys", "host", 1))
 
 		// create the parent actor
 		parent := newPID(ctx, actorPath,
@@ -273,7 +272,7 @@ func TestChildActor(t *testing.T) {
 		assert.NotNil(t, child)
 
 		assert.Len(t, parent.Children(ctx), 1)
-		// let us send 10 messages to the actors
+		// let us send 10 public to the actors
 		count := 10
 		for i := 0; i < count; i++ {
 			assert.NoError(t, SendAsync(ctx, parent, new(testpb.TestSend)))
@@ -291,7 +290,7 @@ func TestChildActor(t *testing.T) {
 		// create a test context
 		ctx := context.TODO()
 		// create the actor path
-		actorPath := NewPath("Parent", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Parent", NewLocalAddress(protocol, "sys", "host", 1))
 
 		// create the parent actor
 		parent := newPID(ctx,
@@ -331,7 +330,7 @@ func TestChildActor(t *testing.T) {
 
 		logger := log.DiscardLogger
 		// create the actor path
-		actorPath := NewPath("Parent", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Parent", NewLocalAddress(protocol, "sys", "host", 1))
 		// create the parent actor
 		parent := newPID(ctx,
 			actorPath,
@@ -339,7 +338,7 @@ func TestChildActor(t *testing.T) {
 			withInitMaxRetries(1),
 			withCustomLogger(logger),
 			withPassivationDisabled(),
-			withSupervisorStrategy(pb.StrategyDirective_RESTART_DIRECTIVE),
+			withSupervisorStrategy(RestartDirective),
 			withSendReplyTimeout(recvTimeout))
 		assert.NotNil(t, parent)
 
@@ -372,7 +371,7 @@ func BenchmarkActor(b *testing.B) {
 
 		// create the actor ref
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
@@ -394,7 +393,7 @@ func BenchmarkActor(b *testing.B) {
 
 		// create the actor ref
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
@@ -413,7 +412,7 @@ func BenchmarkActor(b *testing.B) {
 
 		// create the actor ref
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
@@ -440,7 +439,7 @@ func BenchmarkActor(b *testing.B) {
 
 		// create the actor ref
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
@@ -469,7 +468,7 @@ func BenchmarkActor(b *testing.B) {
 
 		// create the actor ref
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
@@ -491,7 +490,7 @@ func BenchmarkActor(b *testing.B) {
 		actor := &BenchActor{}
 
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		// create the actor ref
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
@@ -510,7 +509,7 @@ func BenchmarkActor(b *testing.B) {
 		ctx := context.TODO()
 		actor := &BenchActor{}
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		// create the actor ref
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),
@@ -537,7 +536,7 @@ func BenchmarkActor(b *testing.B) {
 		ctx := context.TODO()
 		actor := &BenchActor{}
 		// create the actor path
-		actorPath := NewPath("Test", NewAddress(protocol, "sys", "host", 1))
+		actorPath := NewPath("Test", NewLocalAddress(protocol, "sys", "host", 1))
 		// create the actor ref
 		pid := newPID(ctx, actorPath, actor,
 			withInitMaxRetries(1),