Просмотр исходного кода

Remove DEFAULT scope to simplify APIs.

Roberto Ostinelli 3 лет назад
Родитель
Сommit
1182d2a966
8 измененных файлов с 1361 добавлено и 2565 удалено
  1. 211 321
      src/syn.erl
  2. 0 3
      src/syn.hrl
  3. 1 1
      src/syn_gen_scope.erl
  4. 11 91
      src/syn_groups.erl
  5. 8 40
      src/syn_registry.erl
  6. 18 13
      src/syn_sup.erl
  7. 601 1225
      test/syn_groups_SUITE.erl
  8. 511 871
      test/syn_registry_SUITE.erl

+ 211 - 321
src/syn.erl

@@ -27,17 +27,101 @@
 %% ===================================================================
 %% @doc `syn' exposes all of the global Process Registry and Process Group APIs.
 %%
-%% Syn implement Scopes. A Scope is a way to create a logical overlay network running on top of the Erlang distribution cluster.
-%% Nodes that belong to the same Scope will form a "sub-cluster", and will synchronize data between themselves and themselves only.
+%% Syn implement Scopes. You may think of Scopes such as database tables, so a set of data elements,
+%% but that's where the analogy ends.
 %%
-%% Every node in an Erlang cluster is automatically added to the Scope `default'. It is therefore not mandatory
-%% to use scopes, but it is advisable to do so when scalability is a concern, as it is possible to divide
-%% an Erlang cluster into sub-clusters which hold specific portions of data.
+%% A Scope is a way to create a namespaced, logical overlay network running on top of the Erlang distribution cluster.
+%% Nodes that belong to the same Scope will form a "sub-cluster": they will synchronize data between themselves,
+%% and themselves only.
 %%
-%% Please note that most of the methods documented here that allow to specify a Scope will raise a
-%% `error({invalid_scope, Scope})' if the local node has not been added to the specified Scope or if the Pids
-%% passed in as variables are running on a node that has not been added to the specified Scope.
+%% For instance, you may have nodes in your Erlang cluster that need to handle connections to users, and other nodes
+%% that need to handle connections to physical devices. One approach is to create two Scopes: `users' and `devices',
+%% where you can register your different types of connections.
 %%
+%% Scopes are therefore a way to properly namespace your logic, but they also allow to build considerably larger
+%% scalable architectures, as it is possible to divide an Erlang cluster into sub-clusters which hold specific portions
+%% of data.
+%%
+%% Please note any of the methods documented here will raise:
+%% <ul>
+%% <li>An `error({invalid_scope, Scope})' if the local node has not been added to the specified Scope.</li>
+%% <li>An `error({invalid_remote_scope, Scope})' if the Pid passed in as variable is running on a node that has not
+%% been added to the specified Scope.</li>
+%% </ul>
+%%
+%% <h2>Quickstart</h2>
+%% <h3>Registry</h3>
+%% <h4>Elixir</h4>
+%% ```
+%% iex> :syn.add_node_to_scopes([:users])
+%% :ok
+%% iex> pid = self().
+%% #PID<0.105.0>
+%% iex> :syn.register(:users, "hedy", pid)
+%% :ok
+%% iex> :syn.lookup(:users, "hedy")
+%% {#PID<0.105.0>,:undefined}
+%% iex> :syn.register(:users, "hedy", pid, [city: "Milan"])
+%% :ok
+%% iex> :syn.lookup(:users, "hedy")
+%% {#PID<0.105.0>,[city: "Milan"]}
+%% iex> :syn.registry_count(:users)
+%% 1
+%% '''
+%% <h4>Erlang</h4>
+%% ```
+%% 1> syn:add_node_to_scopes([users]).
+%% ok
+%% 2> Pid = self().
+%% <0.93.0>
+%% 3> syn:register(users, "hedy", Pid).
+%% ok
+%% 4> syn:lookup(users, "hedy").
+%% {<0.93.0>,undefined}
+%% 5> syn:register(users, "hedy", Pid, [{city, "Milan"}]).
+%% ok
+%% 6> syn:lookup(users, "hedy").
+%% {<0.93.0>,[{city, "Milan"}]}
+%% 7> syn:registry_count(users).
+%% 1
+%% '''
+%% <h3>Process Groups</h3>
+%% <h4>Elixir</h4>
+%% ```
+%% iex> :syn.add_node_to_scopes([:users])
+%% :ok
+%% iex> pid = self().
+%% #PID<0.88.0>
+%% iex> :syn.join(:users, {:italy, :lombardy}, pid)
+%% :ok
+%% iex> :syn.members(:users, {:italy, :lombardy}).
+%% [#PID<0.88.0>,:undefined}]
+%% iex> :syn.is_member(:users, {:italy, :lombardy}, pid)
+%% true
+%% iex> :syn.publish(:users, {:italy, :lombardy}, "hello lombardy!")
+%% {:ok,1}
+%% iex> flush()
+%% Shell got "hello lombardy!"
+%% ok
+%% '''
+%% <h4>Erlang</h4>
+%% ```
+%% 1> syn:add_node_to_scopes([users]).
+%% ok
+%% 2> Pid = self().
+%% <0.88.0>
+%% 3> syn:join(users, {italy, lombardy}, Pid).
+%% ok
+%% 4> syn:members(users, {italy, lombardy}).
+%% [{<0.88.0>,undefined}]
+%% 5> syn:is_member(users, {italy, lombardy}, Pid).
+%% true
+%% 6> syn:publish(users, {italy, lombardy}, "hello lombardy!").
+%% {ok,1}
+%% 7> flush().
+%% Shell got "hello lombardy!"
+%% ok
+%% '''
 %% @end
 %% ===================================================================
 -module(syn).
@@ -45,31 +129,31 @@
 %% API
 -export([start/0, stop/0]).
 %% scopes
--export([node_scopes/0, add_node_to_scope/1, add_node_to_scopes/1]).
+-export([node_scopes/0, add_node_to_scopes/1]).
 -export([set_event_handler/1]).
 %% registry
--export([lookup/1, lookup/2]).
--export([register/2, register/3, register/4]).
--export([unregister/1, unregister/2]).
--export([registry_count/0, registry_count/1, registry_count/2]).
--export([local_registry_count/0, local_registry_count/1]).
+-export([lookup/2]).
+-export([register/3, register/4]).
+-export([unregister/2]).
+-export([registry_count/1, registry_count/2]).
+-export([local_registry_count/1]).
 %% gen_server via interface
 -export([register_name/2, unregister_name/1, whereis_name/1, send/2]).
 %% groups
--export([members/1, members/2]).
--export([is_member/2, is_member/3]).
--export([local_members/1, local_members/2]).
--export([is_local_member/2, is_local_member/3]).
--export([join/2, join/3, join/4]).
--export([leave/2, leave/3]).
--export([group_count/0, group_count/1, group_count/2]).
--export([local_group_count/0, local_group_count/1]).
--export([group_names/0, group_names/1, group_names/2]).
--export([local_group_names/0, local_group_names/1]).
--export([publish/2, publish/3]).
--export([local_publish/2, local_publish/3]).
--export([multi_call/2, multi_call/3, multi_call/4, multi_call_reply/2]).
-
+-export([members/2, is_member/3]).
+-export([local_members/2, is_local_member/3]).
+-export([join/3, join/4]).
+-export([leave/3]).
+-export([group_count/1, group_count/2]).
+-export([local_group_count/1]).
+-export([group_names/1, group_names/2]).
+-export([local_group_names/1]).
+-export([publish/3]).
+-export([local_publish/3]).
+-export([multi_call/3, multi_call/4, multi_call_reply/2]).
+
+%% macros
+-define(DEFAULT_MULTI_CALL_TIMEOUT_MS, 5000).
 
 %% API
 %% ===================================================================
@@ -95,15 +179,35 @@ node_scopes() ->
 
 %% @doc Add the local node to the specified `Scope'.
 %%
+%% There are 2 ways to add a node to Scopes. One is by using this method, the other is to set the environment variable `syn'
+%% with the key `scopes'. In this latter case, you're probably best off using an application configuration file:
+%%
+%% You only need to add a node to a scope once.
+%% <h3>Elixir</h3>
+%% ```
+%% config :syn,
+%%   scopes: [:devices, :users]
+%% '''
+%% <h3>Erlang</h3>
+%% ```
+%% {syn, [
+%%   {scopes, [:devices, :users]}
+%% ]}
+%% '''
+%%
 %% <h2>Examples</h2>
-%% The following adds the local node to the scope "devices" and then register a process handling a device in that scope:
--spec add_node_to_scope(Scope :: atom()) -> ok.
-add_node_to_scope(Scope) ->
-    syn_sup:add_node_to_scope(Scope).
-
-%% @doc Add the local node to the specified `Scope's.
+%% <h3>Elixir</h3>
+%% ```
+%% iex> :syn.add_node_to_scopes([:devices]).
+%% :ok
+%% '''
+%% <h3>Erlang</h3>
+%% ```
+%% 1> syn:add_node_to_scopes([devices]).
+%% ok
+%% '''
 -spec add_node_to_scopes(Scopes :: [atom()]) -> ok.
-add_node_to_scopes(Scopes) ->
+add_node_to_scopes(Scopes) when is_list(Scopes) ->
     lists:foreach(fun(Scope) ->
         syn_sup:add_node_to_scope(Scope)
     end, Scopes).
@@ -112,6 +216,21 @@ add_node_to_scopes(Scopes) ->
 %%
 %% Please see {@link syn_event_handler} for information on callbacks.
 %%
+%% There are 2 ways to set a handler module. One is by using this method, the other is to set the environment variable `syn'
+%% with the key `scopes'. In this latter case, you're probably best off using an application configuration file:
+%%
+%% <h3>Elixir</h3>
+%% ```
+%% config :syn,
+%%   event_handler: MyCustomEventHandler
+%% '''
+%% <h3>Erlang</h3>
+%% ```
+%% {syn, [
+%%   {event_handler, my_custom_event_handler}
+%% ]}
+%% '''
+%%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
@@ -128,66 +247,34 @@ set_event_handler(Module) ->
     application:set_env(syn, event_handler, Module).
 
 %% ----- \/ registry -------------------------------------------------
-%% @doc Looks up a registry entry in the `default' scope.
-%%
-%% @equiv lookup(default, Name)
-%% @end
+%% @doc Looks up a registry entry in the specified `Scope'.
 %%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.register("SN-123-456789", self())
+%% iex> :syn.register(:devices, "SN-123-456789", self())
 %% :ok
-%% iex> :syn.lookup("SN-123-456789")
+%% iex> :syn.lookup(:devices, "SN-123-456789")
 %% {#PID<0.105.0>, undefined}
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:register("SN-123-456789", self()).
+%% 1> syn:register(devices, "SN-123-456789", self()).
 %% ok
 %% 2> syn:lookup(devices, "SN-123-456789").
 %% {<0.79.0>, undefined}
 %% '''
--spec lookup(Name :: any()) -> {pid(), Meta :: any()} | undefined.
-lookup(Name) ->
-    syn_registry:lookup(Name).
-
-%% @doc Looks up a registry entry in the specified `Scope'.
 -spec lookup(Scope :: atom(), Name :: any()) -> {pid(), Meta :: any()} | undefined.
 lookup(Scope, Name) ->
     syn_registry:lookup(Scope, Name).
 
-%% @doc Registers a process in the `default' scope.
+%% @doc Registers a process with undefined metadata in the specified `Scope'.
 %%
-%% @equiv register(default, Name, Pid, undefined)
+%% @equiv register(Scope, Name, Pid, undefined)
 %% @end
-%%
-%% <h2>Examples</h2>
-%% <h3>Elixir</h3>
-%% ```
-%% iex> :syn.register("SN-123-456789", self())
-%% :ok
-%% iex> :syn.lookup("SN-123-456789")
-%% {#PID<0.105.0>, undefined}
-%% '''
-%% <h3>Erlang</h3>
-%% ```
-%% 1> syn:register("SN-123-456789", self()).
-%% ok
-%% 2> syn:lookup(devices, "SN-123-456789").
-%% {<0.79.0>, undefined}
-%% '''
--spec register(Name :: any(), Pid :: pid()) -> ok | {error, Reason :: any()}.
-register(Name, Pid) ->
-    syn_registry:register(Name, Pid).
-
-%% @doc Registers a process with metadata in the `default' scope OR with undefined metadata in the specified `Scope'.
-%%
-%% Equivalent to`register(default, Name, Pid, Meta)' or `register(Scope, Name, Pid, undefined)'
-%% depending on the position of the `pid()' value. See {@link register/4} for more info.
--spec register(NameOrScope :: any(), PidOrName :: any(), MetaOrPid :: any()) -> ok | {error, Reason :: any()}.
-register(NameOrScope, PidOrName, MetaOrPid) ->
-    syn_registry:register(NameOrScope, PidOrName, MetaOrPid).
+-spec register(Scope :: any(), Name :: any(), Pid :: any()) -> ok | {error, Reason :: any()}.
+register(Scope, Name, Pid) ->
+    register(Scope, Name, Pid, undefined).
 
 %% @doc Registers a process with metadata in the specified `Scope'.
 %%
@@ -200,24 +287,24 @@ register(NameOrScope, PidOrName, MetaOrPid) ->
 %% You may re-register a process multiple times, for example if you need to update its metadata.
 %% When a process gets registered, Syn will automatically monitor it. You may also register the same process with different names.
 %%
-%% Processes can also be registered as `gen_server' names, by usage of via-tuples. This way, you can use the `gen_server'
-%% API with these tuples without referring to the Pid directly. If you do so, you MUST use a `gen_server' name
-%% in format `{Scope, Name}', i.e. your via tuple will look like `{via, syn, {my_scope, <<"process name">>}}'.
-%% See here below for examples.
-%%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.add_node_to_scope(:devices).
-%% :ok
 %% iex> :syn.register(:devices, "SN-123-456789", self(), [meta: :one])
 %% :ok
 %% iex> :syn.lookup(:devices, "SN-123-456789")
 %% {#PID<0.105.0>, [meta: :one]}
 %% '''
+%%
+%% Processes can also be registered as `gen_server' names, by usage of via-tuples. This way, you can use the `gen_server'
+%% API with these tuples without referring to the Pid directly. If you do so, you MUST use a `gen_server' name
+%% in format `{Scope, Name}', i.e. your via tuple will look like `{via, syn, {my_scope, <<"process name">>}}'.
+%% See here below for examples.
+%% <h2>Examples</h2>
+%% <h3>Elixir</h3>
 %% ```
-%% iex> tuple = {:via, :syn, {:default, <<"your process name">>}}.
-%% {:via, :syn, {:default, <<"your process name">>}}
+%% iex> tuple = {:via, :syn, {:devices, "SN-123-456789"}}.
+%% {:via, :syn, {:devices, "SN-123-456789"}}
 %% iex> GenServer.start_link(__MODULE__, [], name: tuple)
 %% {ok, #PID<0.105.0>}
 %% iex> GenServer.call(tuple, :your_message).
@@ -225,16 +312,14 @@ register(NameOrScope, PidOrName, MetaOrPid) ->
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:add_node_to_scope(devices).
-%% ok
-%% 2> syn:register(devices, "SN-123-456789", self(), [{meta, one}]).
+%% 1> syn:register(devices, "SN-123-456789", self(), [{meta, one}]).
 %% ok
-%% 3> syn:lookup(devices, "SN-123-456789").
+%% 2> syn:lookup(devices, "SN-123-456789").
 %% {<0.79.0>, [{meta, one}]}
 %% '''
 %% ```
-%% 1> Tuple = {via, syn, {default, <<"your process name">>}}.
-%% {via, syn, {default, <<"your process name">>}}
+%% 1> Tuple = {via, syn, {devices, "SN-123-456789"}}.
+%% {via, syn, {devices, "SN-123-456789"}}
 %% 2> gen_server:start_link(Tuple, your_module, []).
 %% {ok, <0.79.0>}
 %% 3> gen_server:call(Tuple, your_message).
@@ -244,15 +329,7 @@ register(NameOrScope, PidOrName, MetaOrPid) ->
 register(Scope, Name, Pid, Meta) ->
     syn_registry:register(Scope, Name, Pid, Meta).
 
-%% @doc Unregisters a process.
-%%
-%% @equiv unregister(default, Name)
-%% @end
--spec unregister(Name :: any()) -> ok | {error, Reason :: any()}.
-unregister(Name) ->
-    syn_registry:unregister(Name).
-
-%% @doc Unregisters a process.
+%% @doc Unregisters a process from specified `Scope'.
 %%
 %% Possible error reasons:
 %% <ul>
@@ -261,32 +338,25 @@ unregister(Name) ->
 %% </ul>
 %%
 %% You don't need to unregister names of processes that are about to die, since they are monitored by Syn
-%% and they will be removed automatically. If you manually unregister a process before it dies, the Syn callbacks will not be called.
+%% and they will be removed automatically. If you manually unregister a process before it dies, the Syn callbacks
+%% will not be called.
 -spec unregister(Scope :: atom(), Name :: any()) -> ok | {error, Reason :: any()}.
 unregister(Scope, Name) ->
     syn_registry:unregister(Scope, Name).
 
-%% @doc Returns the count of all registered processes for the `default' scope.
-%%
-%% @equiv registry_count(default)
-%% @end
+%% @doc Returns the count of all registered processes for the specified `Scope'.
 %%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.registry_count()
+%% iex> :syn.registry_count(:devices)
 %% 512473
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:registry_count().
+%% 1> syn:registry_count(devices).
 %% 512473
 %% '''
--spec registry_count() -> non_neg_integer().
-registry_count() ->
-    syn_registry:count().
-
-%% @doc Returns the count of all registered processes for the specified `Scope'.
 -spec registry_count(Scope :: atom()) -> non_neg_integer().
 registry_count(Scope) ->
     syn_registry:count(Scope).
@@ -296,40 +366,32 @@ registry_count(Scope) ->
 registry_count(Scope, Node) ->
     syn_registry:count(Scope, Node).
 
-%% @doc Returns the count of all registered processes for the `default' scope running on the local node.
-%%
-%% @equiv registry_count(default, node())
-%% @end
--spec local_registry_count() -> non_neg_integer().
-local_registry_count() ->
-    syn_registry:local_count().
-
 %% @doc Returns the count of all registered processes for the specified `Scope' running on the local node.
 %%
 %% @equiv registry_count(Scope, node())
 %% @end
 -spec local_registry_count(Scope :: atom()) -> non_neg_integer().
 local_registry_count(Scope) ->
-    syn_registry:local_count(Scope).
+    registry_count(Scope, node()).
 
 %% ----- \/ gen_server via module interface --------------------------
 -spec register_name(Name :: any(), Pid :: pid()) -> yes | no.
 register_name({Scope, Name}, Pid) ->
-    case syn_registry:register(Scope, Name, Pid) of
+    case register(Scope, Name, Pid) of
         ok -> yes;
         _ -> no
     end.
 
 -spec unregister_name(Name :: any()) -> any().
 unregister_name({Scope, Name}) ->
-    case syn_registry:unregister(Scope, Name) of
+    case unregister(Scope, Name) of
         ok -> Name;
         _ -> nil
     end.
 
 -spec whereis_name(Name :: any()) -> pid() | undefined.
 whereis_name({Scope, Name}) ->
-    case syn_registry:lookup(Scope, Name) of
+    case lookup(Scope, Name) of
         {Pid, _Meta} -> Pid;
         undefined -> undefined
     end.
@@ -345,37 +407,11 @@ send({Scope, Name}, Message) ->
     end.
 
 %% ----- \/ groups ---------------------------------------------------
-%% @doc Returns the list of all members for GroupName in the `default' Scope.
-%%
-%% @equiv members(default, GroupName)
-%% @end
-%%
-%% <h2>Examples</h2>
-%% <h3>Elixir</h3>
-%% ```
-%% iex> :syn.join("area-1").
-%% :ok
-%% iex> :syn.members("area-1").
-%% [{#PID<0.105.0>, :undefined}]
-%% '''
-%% <h3>Erlang</h3>
-%% ```
-%% 1> syn:join("area-1", self()).
-%% ok
-%% 2> syn:members("area-1").
-%% [{<0.69.0>, undefined}]
-%% '''
--spec members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
-members(GroupName) ->
-    syn_groups:members(GroupName).
-
 %% @doc Returns the list of all members for GroupName in the specified `Scope'.
 %%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.add_node_to_scope(:devices)
-%% :ok
 %% iex> :syn.join(:devices, "area-1").
 %% :ok
 %% iex> :syn.members(:devices, "area-1").
@@ -383,86 +419,37 @@ members(GroupName) ->
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:add_node_to_scope(devices)
-%% ok
-%% 2> syn:join(devices, "area-1", self()).
+%% 1> syn:join(devices, "area-1", self()).
 %% ok
-%% 3> syn:members(devices, "area-1").
+%% 2> syn:members(devices, "area-1").
 %% [{<0.69.0>, undefined}]
 %% '''
 -spec members(Scope :: atom(), GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 members(Scope, GroupName) ->
     syn_groups:members(Scope, GroupName).
 
-%% @doc Returns whether a `pid()' is a member of GroupName in the `default' scope.
-%%
-%% @equiv is_member(default, GroupName, Pid)
-%% @end
--spec is_member(GroupName :: any(), Pid :: pid()) -> boolean().
-is_member(GroupName, Pid) ->
-    syn_groups:is_member(GroupName, Pid).
-
 %% @doc Returns whether a `pid()' is a member of GroupName in the specified `Scope'.
-%%
-%% This method will raise a `error({invalid_scope, Scope})' if the node has not been added to the specified `Scope'.
 -spec is_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
 is_member(Scope, GroupName, Pid) ->
     syn_groups:is_member(Scope, GroupName, Pid).
 
-%% @doc Returns the list of all members for GroupName in the `default' scope running on the local node.
-%%
-%% @equiv local_members(default, GroupName)
-%% @end
--spec local_members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
-local_members(GroupName) ->
-    syn_groups:local_members(GroupName).
-
 %% @doc Returns the list of all members for GroupName in the specified `Scope' running on the local node.
-%%
-%% This method will raise a `error({invalid_scope, Scope})' if the node has not been added to the specified `Scope'.
 -spec local_members(Scope :: atom(), GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 local_members(Scope, GroupName) ->
     syn_groups:local_members(Scope, GroupName).
 
-%% @doc Returns whether a `pid()' is a member of GroupName in the `default' scope running on the local node.
-%%
-%% @equiv is_local_member(default, GroupName, Pid)
-%% @end
--spec is_local_member(GroupName :: any(), Pid :: pid()) -> boolean().
-is_local_member(GroupName, Pid) ->
-    syn_groups:is_local_member(GroupName, Pid).
-
 %% @doc Returns whether a `pid()' is a member of GroupName in the specified `Scope' running on the local node.
-%%
-%% This method will raise a `error({invalid_scope, Scope})' if the node has not been added to the specified `Scope'.
 -spec is_local_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
 is_local_member(Scope, GroupName, Pid) ->
     syn_groups:is_local_member(Scope, GroupName, Pid).
 
-%% @doc Adds a `pid()' to GroupName in the `default' scope.
+%% @doc Adds a `pid()' with undefined metadata in the specified `Scope'.
 %%
-%% @equiv join(default, GroupName, Pid)
+%% @equiv join(Scope, GroupName, Pid, undefined)
 %% @end
-%%
-%% <h2>Examples</h2>
-%% <h3>Elixir</h3>
-%% ```
-%% iex> :syn.join(:"area-1", self()).
-%% :ok
-%% '''
-%% <h3>Erlang</h3>
-%% ```
-%% 1> syn:join("area-1", self()).
-%% ok
-%% '''
--spec join(GroupName :: any(), Pid :: pid()) -> ok | {error, Reason :: any()}.
-join(GroupName, Pid) ->
-    syn_groups:join(GroupName, Pid).
-
-%% @doc Adds a `pid()' with metadata to GroupName in the `default' scope OR with undefined metadata in the specified `Scope'.
--spec join(GroupNameOrScope :: any(), PidOrGroupName :: any(), MetaOrPid :: any()) -> ok | {error, Reason :: any()}.
-join(GroupNameOrScope, PidOrGroupName, MetaOrPid) ->
-    syn_groups:join(GroupNameOrScope, PidOrGroupName, MetaOrPid).
+-spec join(Scope :: any(), Name :: any(), Pid :: any()) -> ok | {error, Reason :: any()}.
+join(Scope, GroupName, Pid) ->
+    join(Scope, GroupName, Pid, undefined).
 
 %% @doc Adds a `pid()' with metadata to GroupName in the specified `Scope'.
 %%
@@ -478,30 +465,18 @@ join(GroupNameOrScope, PidOrGroupName, MetaOrPid) ->
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.add_node_to_scope(:devices)
-%% :ok
 %% iex> :syn.join(:devices, "area-1", self(), [meta: :one]).
 %% :ok
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:add_node_to_scope(devices).
-%% ok
-%% 2> syn:join(devices, "area-1", self(), [{meta, one}]).
+%% 1> syn:join(devices, "area-1", self(), [{meta, one}]).
 %% ok
 %% '''
 -spec join(Scope :: atom(), GroupName :: any(), Pid :: pid(), Meta :: any()) -> ok | {error, Reason :: any()}.
 join(Scope, GroupName, Pid, Meta) ->
     syn_groups:join(Scope, GroupName, Pid, Meta).
 
-%% @doc Removes a `pid()' from GroupName in the `default' Scope.
-%%
-%% @equiv leave(default, GroupName, Pid)
-%% @end
--spec leave(GroupName :: any(), Pid :: pid()) -> ok | {error, Reason :: any()}.
-leave(GroupName, Pid) ->
-    syn_groups:leave(GroupName, Pid).
-
 %% @doc Removes a `pid()' from GroupName in the specified `Scope'.
 %%
 %% Possible error reasons:
@@ -515,27 +490,19 @@ leave(GroupName, Pid) ->
 leave(Scope, GroupName, Pid) ->
     syn_groups:leave(Scope, GroupName, Pid).
 
-%% @doc Returns the count of all the groups for the `default' scope.
-%%
-%% @equiv group_count(default)
-%% @end
+%% @doc Returns the count of all the groups for the specified `Scope'.
 %%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.group_count()
+%% iex> :syn.group_count("area-1")
 %% 321778
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:group_count().
+%% 1> syn:group_count("area-1").
 %% 321778
 %% '''
--spec group_count() -> non_neg_integer().
-group_count() ->
-    syn_groups:count().
-
-%% @doc Returns the count of all the groups for the specified `Scope'.
 -spec group_count(Scope :: atom()) -> non_neg_integer().
 group_count(Scope) ->
     syn_groups:count(Scope).
@@ -545,47 +512,29 @@ group_count(Scope) ->
 group_count(Scope, Node) ->
     syn_groups:count(Scope, Node).
 
-%% @doc Returns the count of all the groups which have at least 1 process running on `Node' for the `default' scope.
-%%
-%% @equiv group_count(default, node())
-%% @end
--spec local_group_count() -> non_neg_integer().
-local_group_count() ->
-    syn_groups:local_count().
-
 %% @doc Returns the count of all the groups which have at least 1 process running on `Node' for the specified `Scope'.
 %%
 %% @equiv group_count(Scope, node())
 %% @end
 -spec local_group_count(Scope :: atom()) -> non_neg_integer().
 local_group_count(Scope) ->
-    syn_groups:local_count(Scope).
+    group_count(Scope, node()).
 
-%% @doc Returns the group names for the `default' scope.
+%% @doc Returns the group names for the specified `Scope'.
 %%
 %% The order of the group names is not guaranteed to be the same on all calls.
 %%
-%% @equiv group_names(default)
-%% @end
-%%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.group_names()
+%% iex> :syn.group_names(:users)
 %% ["area-1", "area-2"]
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:group_names().
+%% 1> syn:group_names(users).
 %% ["area-1", "area-2"]
 %% '''
--spec group_names() -> [GroupName :: term()].
-group_names() ->
-    syn_groups:group_names().
-
-%% @doc Returns the group names for the specified `Scope'.
-%%
-%% The order of the group names is not guaranteed to be the same on all calls.
 -spec group_names(Scope :: atom()) -> [GroupName :: term()].
 group_names(Scope) ->
     syn_groups:group_names(Scope).
@@ -597,64 +546,24 @@ group_names(Scope) ->
 group_names(Scope, Node) ->
     syn_groups:group_names(Scope, Node).
 
-%% @doc Returns the group names which have at least 1 process running on `Node' for the `default' scope.
-%%
-%% @equiv group_names(default, node())
-%% @end
--spec local_group_names() -> [GroupName :: term()].
-local_group_names() ->
-    syn_groups:local_group_names().
-
 %% @doc Returns the group names which have at least 1 process running on `Node' for the specified `Scope'.
 %%
 %% @equiv group_names(Scope, node())
 %% @end
 -spec local_group_names(Scope :: atom()) -> [GroupName :: term()].
 local_group_names(Scope) ->
-    syn_groups:local_group_names(Scope).
-
-%% @doc Publish a message to all group members in the `default' scope.
-%%
-%% @equiv publish(default, GroupName, Message)
-%% @end
-%%
-%% <h2>Examples</h2>
-%% <h3>Elixir</h3>
-%% ```
-%% iex> :syn.join("area-1", self())
-%% :ok
-%% iex> :syn.publish("area-1", :my_message)
-%% {:ok,1}
-%% iex> flush().
-%% Shell got :my_message
-%% :ok
-%% '''
-%% <h3>Erlang</h3>
-%% ```
-%% 1> syn:join("area-1", self()).
-%% ok
-%% 2> syn:publish("area-1", my_message).
-%% {ok,1}
-%% 3> flush().
-%% Shell got my_message
-%% ok
-%% '''
--spec publish(GroupName :: any(), Message :: any()) -> {ok, RecipientCount :: non_neg_integer()}.
-publish(GroupName, Message) ->
-    syn_groups:publish(GroupName, Message).
+    group_names(Scope, node()).
 
-%% @doc Publish a message to all group members in the Specified scope.
+%% @doc Publish a message to all group members in the specified `Scope'.
 %%
 %% `RecipientCount' is the count of the intended recipients.
 %%
 %% <h2>Examples</h2>
 %% <h3>Elixir</h3>
 %% ```
-%% iex> :syn.add_node_to_scope(:devices)
+%% iex> :syn.join(:users, "area-1", self())
 %% :ok
-%% iex> :syn.join(:devices, "area-1", self())
-%% :ok
-%% iex> :syn.publish(:devices, "area-1", :my_message)
+%% iex> :syn.publish(:users, "area-1", :my_message)
 %% {:ok,1}
 %% iex> flush().
 %% Shell got :my_message
@@ -662,13 +571,11 @@ publish(GroupName, Message) ->
 %% '''
 %% <h3>Erlang</h3>
 %% ```
-%% 1> syn:add_node_to_scope(devices).
-%% ok
-%% 2> syn:join(devices, "area-1", self()).
+%% 1> syn:join(users, "area-1", self()).
 %% ok
-%% 3> syn:publish(devices, "area-1", my_message).
+%% 2> syn:publish(users, "area-1", my_message).
 %% {ok,1}
-%% 4> flush().
+%% 3> flush().
 %% Shell got my_message
 %% ok
 %% '''
@@ -676,14 +583,6 @@ publish(GroupName, Message) ->
 publish(Scope, GroupName, Message) ->
     syn_groups:publish(Scope, GroupName, Message).
 
-%% @doc Publish a message to all group members running on the local node in the `default' scope.
-%%
-%% @equiv local_publish(default, GroupName, Message)
-%% @end
--spec local_publish(GroupName :: any(), Message :: any()) -> {ok, RecipientCount :: non_neg_integer()}.
-local_publish(GroupName, Message) ->
-    syn_groups:local_publish(GroupName, Message).
-
 %% @doc Publish a message to all group members running on the local node in the specified `Scope'.
 %%
 %% `RecipientCount' is the count of the intended recipients.
@@ -691,16 +590,7 @@ local_publish(GroupName, Message) ->
 local_publish(Scope, GroupName, Message) ->
     syn_groups:local_publish(Scope, GroupName, Message).
 
-%% @doc Calls all group members node in the `default' scope and collects their replies.
-%%
-%% @equiv multi_call(default, GroupName, Message, 5000)
-%% @end
--spec multi_call(GroupName :: any(), Message :: any()) ->
-    {[{pid(), Reply :: any()}], [BadPid :: pid()]}.
-multi_call(GroupName, Message) ->
-    syn_groups:multi_call(GroupName, Message).
-
-%% @doc Calls all group members running in the specified `Scope' and collects their replies.
+%% @doc Calls all group members in the specified `Scope' and collects their replies.
 %%
 %% @equiv multi_call(Scope, GroupName, Message, 5000)
 %% @end
@@ -710,9 +600,9 @@ multi_call(GroupName, Message) ->
         BadReplies :: [{pid(), Meta :: term()}]
     }.
 multi_call(Scope, GroupName, Message) ->
-    syn_groups:multi_call(Scope, GroupName, Message).
+    multi_call(Scope, GroupName, Message, ?DEFAULT_MULTI_CALL_TIMEOUT_MS).
 
-%% @doc Calls all group members running  in the specified `Scope' and collects their replies.
+%% @doc Calls all group members in the specified `Scope' and collects their replies.
 %%
 %% When this call is issued, all members will receive a tuple in the format:
 %%

+ 0 - 3
src/syn.hrl

@@ -78,6 +78,3 @@
     table_by_name :: atom(),
     table_by_pid :: atom()
 }).
-
-%% macros
--define(DEFAULT_SCOPE, default).

+ 1 - 1
src/syn_gen_scope.erl

@@ -106,7 +106,7 @@ call(Handler, Node, Scope, Message) ->
         undefined -> error({invalid_scope, Scope});
         ProcessName ->
             try gen_server:call({ProcessName, Node}, Message)
-            catch exit:{noproc, {gen_server, call, _}} -> error({invalid_scope, Scope})
+            catch exit:{noproc, {gen_server, call, _}} -> error({invalid_remote_scope, Scope})
             end
     end.
 

+ 11 - 91
src/syn_groups.erl

@@ -29,19 +29,17 @@
 %% API
 -export([start_link/1]).
 -export([get_subcluster_nodes/1]).
--export([join/2, join/3, join/4]).
--export([leave/2, leave/3]).
--export([members/1, members/2]).
--export([is_member/2, is_member/3]).
--export([local_members/1, local_members/2]).
--export([is_local_member/2, is_local_member/3]).
--export([count/0, count/1, count/2]).
--export([local_count/0, local_count/1]).
--export([group_names/0, group_names/1, group_names/2]).
--export([local_group_names/0, local_group_names/1]).
--export([publish/2, publish/3]).
--export([local_publish/2, local_publish/3]).
--export([multi_call/2, multi_call/3, multi_call/4, multi_call_reply/2]).
+-export([join/4]).
+-export([leave/3]).
+-export([members/2]).
+-export([is_member/3]).
+-export([local_members/2]).
+-export([is_local_member/3]).
+-export([count/1, count/2]).
+-export([group_names/1, group_names/2]).
+-export([publish/3]).
+-export([local_publish/3]).
+-export([multi_call/4, multi_call_reply/2]).
 
 %% syn_gen_scope callbacks
 -export([
@@ -56,9 +54,6 @@
 %% internal
 -export([multi_call_and_receive/5]).
 
-%% macros
--define(DEFAULT_MULTI_CALL_TIMEOUT_MS, 5000).
-
 %% includes
 -include("syn.hrl").
 
@@ -74,18 +69,10 @@ start_link(Scope) when is_atom(Scope) ->
 get_subcluster_nodes(Scope) ->
     syn_gen_scope:get_subcluster_nodes(?MODULE, Scope).
 
--spec members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
-members(GroupName) ->
-    members(?DEFAULT_SCOPE, GroupName).
-
 -spec members(Scope :: atom(), GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 members(Scope, GroupName) ->
     do_get_members(Scope, GroupName, '_').
 
--spec is_member(GroupName :: term(), Pid :: pid()) -> boolean().
-is_member(GroupName, Pid) ->
-    is_member(?DEFAULT_SCOPE, GroupName, Pid).
-
 -spec is_member(Scope :: atom(), GroupName :: term(), Pid :: pid()) -> boolean().
 is_member(Scope, GroupName, Pid) ->
     case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
@@ -99,10 +86,6 @@ is_member(Scope, GroupName, Pid) ->
             end
     end.
 
--spec local_members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
-local_members(GroupName) ->
-    local_members(?DEFAULT_SCOPE, GroupName).
-
 -spec local_members(Scope :: atom(), GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 local_members(Scope, GroupName) ->
     do_get_members(Scope, GroupName, node()).
@@ -121,10 +104,6 @@ do_get_members(Scope, GroupName, NodeParam) ->
             }])
     end.
 
--spec is_local_member(GroupName :: term(), Pid :: pid()) -> boolean().
-is_local_member(GroupName, Pid) ->
-    is_local_member(?DEFAULT_SCOPE, GroupName, Pid).
-
 -spec is_local_member(Scope :: atom(), GroupName :: term(), Pid :: pid()) -> boolean().
 is_local_member(Scope, GroupName, Pid) ->
     case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
@@ -138,17 +117,6 @@ is_local_member(Scope, GroupName, Pid) ->
             end
     end.
 
--spec join(GroupName :: term(), Pid :: pid()) -> ok.
-join(GroupName, Pid) ->
-    join(GroupName, Pid, undefined).
-
--spec join(GroupNameOrScope :: term(), PidOrGroupName :: term(), MetaOrPid :: term()) -> ok.
-join(GroupName, Pid, Meta) when is_pid(Pid) ->
-    join(?DEFAULT_SCOPE, GroupName, Pid, Meta);
-
-join(Scope, GroupName, Pid) when is_pid(Pid) ->
-    join(Scope, GroupName, Pid, undefined).
-
 -spec join(Scope :: atom(), GroupName :: term(), Pid :: pid(), Meta :: term()) -> ok.
 join(Scope, GroupName, Pid, Meta) ->
     Node = node(Pid),
@@ -165,10 +133,6 @@ join(Scope, GroupName, Pid, Meta) ->
             Response
     end.
 
--spec leave(GroupName :: term(), Pid :: pid()) -> ok | {error, Reason :: term()}.
-leave(GroupName, Pid) ->
-    leave(?DEFAULT_SCOPE, GroupName, Pid).
-
 -spec leave(Scope :: atom(), GroupName :: term(), Pid :: pid()) -> ok | {error, Reason :: term()}.
 leave(Scope, GroupName, Pid) ->
     case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
@@ -191,10 +155,6 @@ leave(Scope, GroupName, Pid) ->
             end
     end.
 
--spec count() -> non_neg_integer().
-count() ->
-    count(?DEFAULT_SCOPE).
-
 -spec count(Scope :: atom()) -> non_neg_integer().
 count(Scope) ->
     Set = group_names_ordset(Scope, '_'),
@@ -205,18 +165,6 @@ count(Scope, Node) ->
     Set = group_names_ordset(Scope, Node),
     ordsets:size(Set).
 
--spec local_count() -> non_neg_integer().
-local_count() ->
-    count(?DEFAULT_SCOPE, node()).
-
--spec local_count(Scope :: atom()) -> non_neg_integer().
-local_count(Scope) ->
-    count(Scope, node()).
-
--spec group_names() -> [GroupName :: term()].
-group_names() ->
-    group_names(?DEFAULT_SCOPE).
-
 -spec group_names(Scope :: atom()) -> [GroupName :: term()].
 group_names(Scope) ->
     Set = group_names_ordset(Scope, '_'),
@@ -227,14 +175,6 @@ group_names(Scope, Node) ->
     Set = group_names_ordset(Scope, Node),
     ordsets:to_list(Set).
 
--spec local_group_names() -> [GroupName :: term()].
-local_group_names() ->
-    group_names(?DEFAULT_SCOPE, node()).
-
--spec local_group_names(Scope :: atom()) -> [GroupName :: term()].
-local_group_names(Scope) ->
-    group_names(Scope, node()).
-
 -spec group_names_ordset(Scope :: atom(), Node :: node()) -> ordsets:ordset(GroupName :: term()).
 group_names_ordset(Scope, NodeParam) ->
     case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
@@ -250,19 +190,11 @@ group_names_ordset(Scope, NodeParam) ->
             ordsets:from_list(Groups)
     end.
 
--spec publish(GroupName :: term(), Message :: term()) -> {ok, RecipientCount :: non_neg_integer()}.
-publish(GroupName, Message) ->
-    publish(?DEFAULT_SCOPE, GroupName, Message).
-
 -spec publish(Scope :: atom(), GroupName :: term(), Message :: term()) -> {ok, RecipientCount :: non_neg_integer()}.
 publish(Scope, GroupName, Message) ->
     Members = members(Scope, GroupName),
     do_publish(Members, Message).
 
--spec local_publish(GroupName :: term(), Message :: term()) -> {ok, RecipientCount :: non_neg_integer()}.
-local_publish(GroupName, Message) ->
-    local_publish(?DEFAULT_SCOPE, GroupName, Message).
-
 -spec local_publish(Scope :: atom(), GroupName :: term(), Message :: term()) -> {ok, RecipientCount :: non_neg_integer()}.
 local_publish(Scope, GroupName, Message) ->
     Members = local_members(Scope, GroupName),
@@ -276,18 +208,6 @@ do_publish(Members, Message) ->
     end, Members),
     {ok, length(Members)}.
 
--spec multi_call(GroupName :: term(), Message :: term()) -> {[{pid(), Reply :: term()}], [BadPid :: pid()]}.
-multi_call(GroupName, Message) ->
-    multi_call(?DEFAULT_SCOPE, GroupName, Message).
-
--spec multi_call(Scope :: atom(), GroupName :: term(), Message :: term()) ->
-    {
-        Replies :: [{{pid(), Meta :: term()}, Reply :: term()}],
-        BadReplies :: [{pid(), Meta :: term()}]
-    }.
-multi_call(Scope, GroupName, Message) ->
-    multi_call(Scope, GroupName, Message, ?DEFAULT_MULTI_CALL_TIMEOUT_MS).
-
 -spec multi_call(Scope :: atom(), GroupName :: term(), Message :: term(), Timeout :: non_neg_integer()) ->
     {
         Replies :: [{{pid(), Meta :: term()}, Reply :: term()}],

+ 8 - 40
src/syn_registry.erl

@@ -29,11 +29,10 @@
 %% API
 -export([start_link/1]).
 -export([get_subcluster_nodes/1]).
--export([lookup/1, lookup/2]).
--export([register/2, register/3, register/4]).
--export([unregister/1, unregister/2]).
--export([count/0, count/1, count/2]).
--export([local_count/0, local_count/1]).
+-export([lookup/2]).
+-export([register/4]).
+-export([unregister/2]).
+-export([count/1, count/2]).
 
 %% syn_gen_scope callbacks
 -export([
@@ -65,10 +64,6 @@ start_link(Scope) when is_atom(Scope) ->
 get_subcluster_nodes(Scope) ->
     syn_gen_scope:get_subcluster_nodes(?MODULE, Scope).
 
--spec lookup(Name :: term()) -> {pid(), Meta :: term()} | undefined.
-lookup(Name) ->
-    lookup(?DEFAULT_SCOPE, Name).
-
 -spec lookup(Scope :: atom(), Name :: term()) -> {pid(), Meta :: term()} | undefined.
 lookup(Scope, Name) ->
     case syn_backbone:get_table_name(syn_registry_by_name, Scope) of
@@ -82,17 +77,6 @@ lookup(Scope, Name) ->
             end
     end.
 
--spec register(Name :: term(), Pid :: pid()) -> ok | {error, Reason :: term()}.
-register(Name, Pid) ->
-    register(?DEFAULT_SCOPE, Name, Pid, undefined).
-
--spec register(NameOrScope :: term(), PidOrName :: term(), MetaOrPid :: term()) -> ok | {error, Reason :: term()}.
-register(Name, Pid, Meta) when is_pid(Pid) ->
-    register(?DEFAULT_SCOPE, Name, Pid, Meta);
-
-register(Scope, Name, Pid) when is_pid(Pid) ->
-    register(Scope, Name, Pid, undefined).
-
 -spec register(Scope :: atom(), Name :: term(), Pid :: pid(), Meta :: term()) -> ok | {error, Reason :: term()}.
 register(Scope, Name, Pid, Meta) ->
     Node = node(Pid),
@@ -109,10 +93,6 @@ register(Scope, Name, Pid, Meta) ->
             Response
     end.
 
--spec unregister(Name :: term()) -> ok | {error, Reason :: term()}.
-unregister(Name) ->
-    unregister(?DEFAULT_SCOPE, Name).
-
 -spec unregister(Scope :: atom(), Name :: term()) -> ok | {error, Reason :: term()}.
 unregister(Scope, Name) ->
     case syn_backbone:get_table_name(syn_registry_by_name, Scope) of
@@ -142,10 +122,6 @@ unregister(Scope, Name) ->
             end
     end.
 
--spec count() -> non_neg_integer().
-count() ->
-    count(?DEFAULT_SCOPE).
-
 -spec count(Scope :: atom()) -> non_neg_integer().
 count(Scope) ->
     TableByName = syn_backbone:get_table_name(syn_registry_by_name, Scope),
@@ -168,14 +144,6 @@ count(Scope, Node) ->
             }])
     end.
 
--spec local_count() -> non_neg_integer().
-local_count() ->
-    count(?DEFAULT_SCOPE, node()).
-
--spec local_count(Scope :: atom()) -> non_neg_integer().
-local_count(Scope) ->
-    count(Scope, node()).
-
 %% ===================================================================
 %% Callbacks
 %% ===================================================================
@@ -283,9 +251,9 @@ handle_info({'3.0', sync_unregister, Name, Pid, Meta, Reason}, #state{
             %% callback
             syn_event_handler:call_event_handler(on_process_unregistered, [Scope, Name, Pid, Meta, Reason]);
 
-         _ ->
-             %% not in table, nothing to do
-             ok
+        _ ->
+            %% not in table, nothing to do
+            ok
     end,
     %% return
     {noreply, State};
@@ -395,7 +363,7 @@ do_rebuild_monitors([{Name, Pid, Meta, Time} | T], NewMonitorRefs, #state{
         }},
         #state{}
     }.
-do_register_on_node(Name, Pid, Meta,  MRef, Reason,RequesterNode, CallbackMethod, #state{
+do_register_on_node(Name, Pid, Meta, MRef, Reason, RequesterNode, CallbackMethod, #state{
     scope = Scope,
     table_by_name = TableByName,
     table_by_pid = TableByPid

+ 18 - 13
src/syn_sup.erl

@@ -46,24 +46,29 @@ start_link() ->
 -spec node_scopes() -> [atom()].
 node_scopes() ->
     %% always have a default scope for all nodes
-    case application:get_env(syn, custom_scopes) of
-        undefined -> [?DEFAULT_SCOPE];
-        {ok, Scopes} -> [?DEFAULT_SCOPE] ++ maps:keys(Scopes)
+    case application:get_env(syn, scopes) of
+        undefined -> [];
+        {ok, Scopes} -> Scopes
     end.
 
 -spec add_node_to_scope(Scope :: atom()) -> ok.
 add_node_to_scope(Scope) when is_atom(Scope) ->
     error_logger:info_msg("SYN[~s] Adding node to scope", [Scope]),
-    %% save to ENV (failsafe if sup is restarted)
-    CustomScopes0 = case application:get_env(syn, custom_scopes) of
-        undefined -> #{};
-        {ok, Scopes} -> Scopes
-    end,
-    CustomScopes = CustomScopes0#{Scope => #{}},
-    application:set_env(syn, custom_scopes, CustomScopes),
-    %% start child
-    supervisor:start_child(?MODULE, child_spec(Scope)),
-    ok.
+    Scopes0 = application:get_env(syn, scopes, []),
+    case lists:member(Scope, Scopes0) of
+        true ->
+            %% nothing to do
+            ok;
+
+        false ->
+            %% add scope
+            Scopes = [Scope | Scopes0],
+            %% save to ENV (failsafe if sup is restarted)
+            application:set_env(syn, scopes, Scopes),
+            %% start child
+            supervisor:start_child(?MODULE, child_spec(Scope)),
+            ok
+    end.
 
 %% ===================================================================
 %% Callbacks

+ 601 - 1225
test/syn_groups_SUITE.erl

@@ -33,18 +33,13 @@
 
 %% tests
 -export([
-    three_nodes_discover_default_scope/1,
-    three_nodes_discover_custom_scope/1,
-    three_nodes_join_leave_and_monitor_default_scope/1,
-    three_nodes_join_leave_and_monitor_custom_scope/1,
+    three_nodes_discover/1,
+    three_nodes_join_leave_and_monitor/1,
     three_nodes_cluster_changes/1,
     three_nodes_custom_event_handler_joined_left/1,
-    three_nodes_publish_default_scope/1,
-    three_nodes_publish_custom_scope/1,
-    three_nodes_multi_call_default_scope/1,
-    three_nodes_multi_call_custom_scope/1,
-    three_nodes_group_names_default_scope/1,
-    three_nodes_group_names_custom_scope/1
+    three_nodes_publish/1,
+    three_nodes_multi_call/1,
+    three_nodes_group_names/1
 ]).
 
 %% internals
@@ -88,18 +83,13 @@ all() ->
 groups() ->
     [
         {three_nodes_groups, [shuffle], [
-            three_nodes_discover_default_scope,
-            three_nodes_discover_custom_scope,
-            three_nodes_join_leave_and_monitor_default_scope,
-            three_nodes_join_leave_and_monitor_custom_scope,
+            three_nodes_discover,
+            three_nodes_join_leave_and_monitor,
             three_nodes_cluster_changes,
             three_nodes_custom_event_handler_joined_left,
-            three_nodes_publish_default_scope,
-            three_nodes_publish_custom_scope,
-            three_nodes_multi_call_default_scope,
-            three_nodes_multi_call_custom_scope,
-            three_nodes_group_names_default_scope,
-            three_nodes_group_names_custom_scope
+            three_nodes_publish,
+            three_nodes_multi_call,
+            three_nodes_group_names
         ]}
     ].
 %% -------------------------------------------------------------------
@@ -191,7 +181,7 @@ end_per_testcase(_, _Config) ->
 %% ===================================================================
 %% Tests
 %% ===================================================================
-three_nodes_discover_default_scope(Config) ->
+three_nodes_discover(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -201,112 +191,24 @@ three_nodes_discover_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% simulate full netsplit
-    rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
-    syn_test_suite_helper:disconnect_node(SlaveNode1),
-    syn_test_suite_helper:disconnect_node(SlaveNode2),
-    syn_test_suite_helper:assert_cluster(node(), []),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, []),
-
-    %% reconnect slave 1
-    syn_test_suite_helper:connect_node(SlaveNode1),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node()]),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node()]),
-
-    %% reconnect all
-    syn_test_suite_helper:connect_node(SlaveNode2),
-    rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% simulate full netsplit, again
-    rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
-    syn_test_suite_helper:disconnect_node(SlaveNode1),
-    syn_test_suite_helper:disconnect_node(SlaveNode2),
-    syn_test_suite_helper:assert_cluster(node(), []),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, []),
-    %% reconnect all, again
-    syn_test_suite_helper:connect_node(SlaveNode2),
-    rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% crash the scope process on local
-    syn_test_suite_helper:kill_process(syn_registry_default),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
-
-    %% check, it should have rebuilt after supervisor restarts it
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% crash scopes supervisor on local
-    syn_test_suite_helper:kill_process(syn_scopes_sup),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
-
-    %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]).
-
-three_nodes_discover_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = syn:add_node_to_scope(custom_scope_all),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc, custom_scope_all]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc, custom_scope_c, custom_scope_all]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc, scope_all]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc, scope_c, scope_all]]),
 
     %% get_subcluster_nodes should return invalid errors
     {'EXIT', {{invalid_scope, custom_abcdef}, _}} = catch syn_registry:get_subcluster_nodes(custom_abcdef),
 
     %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
-
-    %% check default
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
 
     %% disconnect node 2 (node 1 can still see node 2)
     syn_test_suite_helper:disconnect_node(SlaveNode2),
@@ -314,11 +216,11 @@ three_nodes_discover_custom_scope(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
 
     %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_all, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_all, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
 
     %% reconnect node 2
     syn_test_suite_helper:connect_node(SlaveNode2),
@@ -327,44 +229,44 @@ three_nodes_discover_custom_scope(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
 
     %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
-
-    %% crash a scope process on 2
-    rpc:call(SlaveNode2, syn_test_suite_helper, kill_process, [syn_registry_custom_scope_bc]),
-    rpc:call(SlaveNode2, syn_test_suite_helper, wait_process_name_ready, [syn_registry_default]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
+
+    %% crash scope processes
+    rpc:call(SlaveNode2, syn_test_suite_helper, kill_process, [syn_registry_scope_bc]),
+    rpc:call(SlaveNode2, syn_test_suite_helper, wait_process_name_ready, [syn_registry_scope_bc]),
 
     %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
 
     %% crash scopes supervisor on local
     syn_test_suite_helper:kill_process(syn_scopes_sup),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
+    syn_test_suite_helper:wait_process_name_ready(syn_registry_scope_all),
 
     %% check
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]).
-
-three_nodes_join_leave_and_monitor_default_scope(Config) ->
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_groups_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]).
+
+three_nodes_join_leave_and_monitor(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -374,357 +276,10 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% start processes
-    Pid = syn_test_suite_helper:start_process(),
-    PidWithMeta = syn_test_suite_helper:start_process(),
-    PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
-
-    %% check
-    [] = syn:members({group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, members, [{group, "one"}]),
-    [] = rpc:call(SlaveNode2, syn, members, [{group, "one"}]),
-    false = syn:is_member({group, "one"}, Pid),
-    false = syn:is_member({group, "one"}, PidWithMeta),
-    false = syn:is_member({group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-
-    [] = syn:members({group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, members, [{group, "two"}]),
-    [] = rpc:call(SlaveNode2, syn, members, [{group, "two"}]),
-    false = syn:is_member({group, "two"}, Pid),
-    false = syn:is_member({group, "two"}, PidWithMeta),
-    false = syn:is_member({group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-
-    [] = syn:local_members({group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [{group, "one"}]),
-    [] = rpc:call(SlaveNode2, syn, local_members, [{group, "one"}]),
-    false = syn:is_local_member({group, "one"}, Pid),
-    false = syn:is_local_member({group, "one"}, PidWithMeta),
-    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-
-    [] = syn:local_members({group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [{group, "two"}]),
-    [] = rpc:call(SlaveNode2, syn, local_members, [{group, "two"}]),
-    false = syn:is_local_member({group, "two"}, Pid),
-    false = syn:is_local_member({group, "two"}, PidWithMeta),
-    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-
-    0 = syn:group_count(),
-    0 = syn:group_count(default, node()),
-    0 = syn:group_count(default, SlaveNode1),
-    0 = syn:group_count(default, SlaveNode2),
-
-    %% join
-    ok = syn:join({group, "one"}, Pid),
-    ok = syn:join({group, "one"}, PidWithMeta, <<"with meta">>),
-    ok = syn:join({group, "one"}, PidRemoteOn1),
-    ok = syn:join({group, "two"}, Pid),
-    ok = syn:join({group, "two"}, PidWithMeta, "with-meta-2"),
-
-    %% errors
-    {error, not_alive} = syn:join({"pid not alive"}, list_to_pid("<0.9999.0>")),
-    {error, not_in_group} = syn:leave({group, "three"}, Pid),
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}, {PidRemoteOn1, undefined}]),
-        fun() -> lists:sort(syn:members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}, {PidRemoteOn1, undefined}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}, {PidRemoteOn1, undefined}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "one"}])) end
-    ),
-    true = syn:is_member({group, "one"}, Pid),
-    true = syn:is_member({group, "one"}, PidWithMeta),
-    true = syn:is_member({group, "one"}, PidRemoteOn1),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
-        fun() -> lists:sort(syn:local_members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [{PidRemoteOn1, undefined}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "one"}])) end
-    ),
-    true = syn:is_local_member({group, "one"}, Pid),
-    true = syn:is_local_member({group, "one"}, PidWithMeta),
-    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    true = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "two"}])) end
-    ),
-    true = syn:is_member({group, "two"}, Pid),
-    true = syn:is_member({group, "two"}, PidWithMeta),
-    false = syn:is_member({group, "two"}, PidRemoteOn1),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:local_members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "two"}])) end
-    ),
-    true = syn:is_local_member({group, "two"}, Pid),
-    true = syn:is_local_member({group, "two"}, PidWithMeta),
-    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-
-    2 = syn:group_count(),
-    2 = syn:group_count(default, node()),
-    1 = syn:group_count(default, SlaveNode1),
-    0 = syn:group_count(default, SlaveNode2),
-
-    %% re-join to edit meta
-    ok = syn:join({group, "one"}, PidWithMeta, <<"with updated meta">>),
-    ok = rpc:call(SlaveNode2, syn, join, [{group, "one"}, PidRemoteOn1, added_meta]), %% updated on slave 2
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}, {PidRemoteOn1, added_meta}]),
-        fun() -> lists:sort(syn:members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}, {PidRemoteOn1, added_meta}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}, {PidRemoteOn1, added_meta}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "one"}])) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}]),
-        fun() -> lists:sort(syn:local_members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [{PidRemoteOn1, added_meta}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "one"}])) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "two"}])) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:local_members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "two"}])) end
-    ),
-
-    2 = syn:group_count(),
-    2 = syn:group_count(default, node()),
-    1 = syn:group_count(default, SlaveNode1),
-    0 = syn:group_count(default, SlaveNode2),
-
-    %% crash scope process to ensure that monitors get recreated
-    exit(whereis(syn_groups_default), kill),
-    syn_test_suite_helper:wait_process_name_ready(syn_groups_default),
-
-    %% kill process
-    syn_test_suite_helper:kill_process(Pid),
-    syn_test_suite_helper:kill_process(PidRemoteOn1),
-    %% leave
-    ok = syn:leave({group, "one"}, PidWithMeta),
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(syn:members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "one"}])) end
-    ),
-    false = syn:is_member({group, "one"}, Pid),
-    false = syn:is_member({group, "one"}, PidWithMeta),
-    false = syn:is_member({group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(syn:local_members({group, "one"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "one"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "one"}])) end
-    ),
-    false = syn:is_local_member({group, "one"}, Pid),
-    false = syn:is_local_member({group, "one"}, PidWithMeta),
-    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(syn:members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [{group, "two"}])) end
-    ),
-    false = syn:is_member({group, "two"}, Pid),
-    true = syn:is_member({group, "two"}, PidWithMeta),
-    false = syn:is_member({group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
-    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
-
-    syn_test_suite_helper:assert_wait(
-        [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(syn:local_members({group, "two"})) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [{group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [{group, "two"}])) end
-    ),
-    false = syn:is_local_member({group, "two"}, Pid),
-    true = syn:is_local_member({group, "two"}, PidWithMeta),
-    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
-
-    1 = syn:group_count(),
-    1 = syn:group_count(default, node()),
-    0 = syn:group_count(default, SlaveNode1),
-    0 = syn:group_count(default, SlaveNode2),
-
-    %% errors
-    {error, not_in_group} = syn:leave({group, "one"}, PidWithMeta).
-
-three_nodes_join_leave_and_monitor_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
 
     %% start processes
     Pid = syn_test_suite_helper:start_process(),
@@ -733,406 +288,406 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% check
-    [] = syn:members(custom_scope_ab, {group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "one"}]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "one"}]),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
-
-    [] = syn:local_members(custom_scope_ab, {group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "one"}]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "one"}]),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, {group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, members, [custom_scope_bc, {group, "one"}]),
-    [] = rpc:call(SlaveNode2, syn, members, [custom_scope_bc, {group, "one"}]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, {group, "one"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, {group, "one"}]),
-    [] = rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, {group, "one"}]),
-
-    [] = syn:members(custom_scope_ab, {group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "two"}]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "two"}]),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
-
-    [] = syn:local_members(custom_scope_ab, {group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "two"}]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "two"}]),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, {group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, members, [custom_scope_bc, {group, "two"}]),
-    [] = rpc:call(SlaveNode2, syn, members, [custom_scope_bc, {group, "two"}]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, {group, "two"}),
-    [] = rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, {group, "two"}]),
-    [] = rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, {group, "two"}]),
+    [] = syn:members(scope_ab, {group, "one"}),
+    [] = rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "one"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "one"}]),
+    false = syn:is_member(scope_ab, {group, "one"}, Pid),
+    false = syn:is_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "one"}, Pid]),
+
+    [] = syn:local_members(scope_ab, {group, "one"}),
+    [] = rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "one"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "one"}]),
+    false = syn:is_local_member(scope_ab, {group, "one"}, Pid),
+    false = syn:is_local_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, {group, "one"}),
+    [] = rpc:call(SlaveNode1, syn, members, [scope_bc, {group, "one"}]),
+    [] = rpc:call(SlaveNode2, syn, members, [scope_bc, {group, "one"}]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, {group, "one"}),
+    [] = rpc:call(SlaveNode1, syn, local_members, [scope_bc, {group, "one"}]),
+    [] = rpc:call(SlaveNode2, syn, local_members, [scope_bc, {group, "one"}]),
+
+    [] = syn:members(scope_ab, {group, "two"}),
+    [] = rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "two"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "two"}]),
+    false = syn:is_member(scope_ab, {group, "two"}, Pid),
+    false = syn:is_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "two"}, Pid]),
+
+    [] = syn:local_members(scope_ab, {group, "two"}),
+    [] = rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "two"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "two"}]),
+    false = syn:is_local_member(scope_ab, {group, "two"}, Pid),
+    false = syn:is_local_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, {group, "two"}),
+    [] = rpc:call(SlaveNode1, syn, members, [scope_bc, {group, "two"}]),
+    [] = rpc:call(SlaveNode2, syn, members, [scope_bc, {group, "two"}]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, {group, "two"}),
+    [] = rpc:call(SlaveNode1, syn, local_members, [scope_bc, {group, "two"}]),
+    [] = rpc:call(SlaveNode2, syn, local_members, [scope_bc, {group, "two"}]),
 
     %% join
-    ok = syn:join(custom_scope_ab, {group, "one"}, Pid),
-    ok = syn:join(custom_scope_ab, {group, "one"}, PidWithMeta, <<"with meta">>),
-    ok = rpc:call(SlaveNode1, syn, join, [custom_scope_bc, {group, "two"}, PidRemoteOn1]),
-    ok = syn:join(custom_scope_ab, {group, "two"}, Pid),
-    ok = syn:join(custom_scope_ab, {group, "two"}, PidWithMeta, "with-meta-2"),
+    ok = syn:join(scope_ab, {group, "one"}, Pid),
+    ok = syn:join(scope_ab, {group, "one"}, PidWithMeta, <<"with meta">>),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_bc, {group, "two"}, PidRemoteOn1]),
+    ok = syn:join(scope_ab, {group, "two"}, Pid),
+    ok = syn:join(scope_ab, {group, "two"}, PidWithMeta, "with-meta-2"),
 
     %% errors
-    {error, not_alive} = syn:join({"pid not alive"}, list_to_pid("<0.9999.0>")),
-    {error, not_in_group} = syn:leave({group, "three"}, Pid),
-    {'EXIT', {{invalid_scope, custom_scope_ab}, _}} = catch syn:join(custom_scope_ab, {group, "one"}, PidRemoteOn2),
+    {error, not_alive} = syn:join(scope_ab, {"pid not alive"}, list_to_pid("<0.9999.0>")),
+    {error, not_in_group} = syn:leave(scope_ab, {group, "three"}, Pid),
+    {'EXIT', {{invalid_remote_scope, scope_ab}, _}} = catch syn:join(scope_ab, {group, "one"}, PidRemoteOn2),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "one"}]),
-    true = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
-    true = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "one"}]),
+    true = syn:is_member(scope_ab, {group, "one"}, Pid),
+    true = syn:is_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "one"}]),
-    true = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
-    true = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "one"}]),
+    true = syn:is_local_member(scope_ab, {group, "one"}, Pid),
+    true = syn:is_local_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "two"}]),
-    true = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
-    true = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "two"}]),
+    true = syn:is_member(scope_ab, {group, "two"}, Pid),
+    true = syn:is_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "two"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "two"}]),
-    true = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
-    true = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "two"}]),
+    true = syn:is_local_member(scope_ab, {group, "two"}, Pid),
+    true = syn:is_local_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, undefined}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, {group, "two"}])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, undefined}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, {group, "two"}])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, undefined}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, {group, "two"}])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, {group, "two"}])) end
-    ),
-
-    2 = syn:group_count(custom_scope_ab),
-    2 = syn:group_count(custom_scope_ab, node()),
-    0 = syn:group_count(custom_scope_ab, SlaveNode1),
-    0 = syn:group_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab]),
-    2 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, {group, "two"}])) end
+    ),
+
+    2 = syn:group_count(scope_ab),
+    2 = syn:group_count(scope_ab, node()),
+    0 = syn:group_count(scope_ab, SlaveNode1),
+    0 = syn:group_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_ab]),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]),
 
     %% re-join to edit meta
-    ok = syn:join(custom_scope_ab, {group, "one"}, PidWithMeta, <<"with updated meta">>),
-    ok = rpc:call(SlaveNode2, syn, join, [custom_scope_bc, {group, "two"}, PidRemoteOn1, added_meta]), %% updated on slave 2
+    ok = syn:join(scope_ab, {group, "one"}, PidWithMeta, <<"with updated meta">>),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_bc, {group, "two"}, PidRemoteOn1, added_meta]), %% updated on slave 2
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}]),
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "one"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "one"}]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with updated meta">>}]),
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "one"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "one"}]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "two"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "two"}]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "two"}]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "two"}]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, added_meta}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, {group, "two"}])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, added_meta}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, {group, "two"}])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, added_meta}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, {group, "two"}])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, {group, "two"}])) end
-    ),
-
-    2 = syn:group_count(custom_scope_ab),
-    2 = syn:group_count(custom_scope_ab, node()),
-    0 = syn:group_count(custom_scope_ab, SlaveNode1),
-    0 = syn:group_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab]),
-    2 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, {group, "two"}])) end
+    ),
+
+    2 = syn:group_count(scope_ab),
+    2 = syn:group_count(scope_ab, node()),
+    0 = syn:group_count(scope_ab, SlaveNode1),
+    0 = syn:group_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_ab]),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]),
 
     %% crash scope process to ensure that monitors get recreated
-    exit(whereis(syn_groups_custom_scope_ab), kill),
-    syn_test_suite_helper:wait_process_name_ready(syn_groups_custom_scope_ab),
+    exit(whereis(syn_groups_scope_ab), kill),
+    syn_test_suite_helper:wait_process_name_ready(syn_groups_scope_ab),
 
     %% kill process
     syn_test_suite_helper:kill_process(Pid),
     syn_test_suite_helper:kill_process(PidRemoteOn1),
     %% leave
-    ok = syn:leave(custom_scope_ab, {group, "one"}, PidWithMeta),
+    ok = syn:leave(scope_ab, {group, "one"}, PidWithMeta),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "one"}]),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "one"}]),
+    false = syn:is_member(scope_ab, {group, "one"}, Pid),
+    false = syn:is_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "one"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "one"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "one"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "one"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "one"}]),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "one"}]),
+    false = syn:is_local_member(scope_ab, {group, "one"}, Pid),
+    false = syn:is_local_member(scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(syn:members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [custom_scope_ab, {group, "two"}]),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
-    true = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
-    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, members, [scope_ab, {group, "two"}]),
+    false = syn:is_member(scope_ab, {group, "two"}, Pid),
+    true = syn:is_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [scope_ab, {group, "two"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
-        fun() -> lists:sort(syn:local_members(custom_scope_ab, {group, "two"})) end
+        fun() -> lists:sort(syn:local_members(scope_ab, {group, "two"})) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_ab, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_ab, {group, "two"}])) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [custom_scope_ab, {group, "two"}]),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
-    true = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
-    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
-    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, local_members, [scope_ab, {group, "two"}]),
+    false = syn:is_local_member(scope_ab, {group, "two"}, Pid),
+    true = syn:is_local_member(scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [scope_ab, {group, "two"}, Pid]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, {group, "two"}])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, {group, "two"}])) end
     ),
     syn_test_suite_helper:assert_wait(
-        [], fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, {group, "two"}])) end
+        [], fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, {group, "two"}])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, {group, "two"}),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, {group, "two"}])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [], fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, {group, "two"}])) end
-    ),
-
-    1 = syn:group_count(custom_scope_ab),
-    1 = syn:group_count(custom_scope_ab, node()),
-    0 = syn:group_count(custom_scope_ab, SlaveNode1),
-    0 = syn:group_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, {group, "two"}])) end
+    ),
+    syn_test_suite_helper:assert_wait(
+        [], fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, {group, "two"}])) end
+    ),
+
+    1 = syn:group_count(scope_ab),
+    1 = syn:group_count(scope_ab, node()),
+    0 = syn:group_count(scope_ab, SlaveNode1),
+    0 = syn:group_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_ab]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, group_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]),
 
     %% errors
-    {error, not_in_group} = syn:leave(custom_scope_ab, {group, "one"}, PidWithMeta).
+    {error, not_in_group} = syn:leave(scope_ab, {group, "one"}, PidWithMeta).
 
 three_nodes_cluster_changes(Config) ->
     %% get slaves
@@ -1149,127 +704,129 @@ three_nodes_cluster_changes(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% add custom scopes
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
 
     %% start processes
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% join
-    ok = rpc:call(SlaveNode1, syn, join, [<<"common-group">>, PidRemoteOn1, "meta-1"]),
-    ok = rpc:call(SlaveNode2, syn, join, [<<"common-group">>, PidRemoteOn2, "meta-2"]),
-    ok = rpc:call(SlaveNode2, syn, join, [<<"group-2">>, PidRemoteOn2, "other-meta"]),
-    ok = rpc:call(SlaveNode1, syn, join, [custom_scope_bc, <<"scoped-on-bc">>, PidRemoteOn1, "scoped-meta-1"]),
-    ok = rpc:call(SlaveNode2, syn, join, [custom_scope_bc, <<"scoped-on-bc">>, PidRemoteOn2, "scoped-meta-2"]),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_all, <<"common-group">>, PidRemoteOn1, "meta-1"]),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_all, <<"common-group">>, PidRemoteOn2, "meta-2"]),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_all, <<"group-2">>, PidRemoteOn2, "other-meta"]),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_bc, <<"scoped-on-bc">>, PidRemoteOn1, "scoped-meta-1"]),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_bc, <<"scoped-on-bc">>, PidRemoteOn2, "scoped-meta-2"]),
 
     %% form full cluster
     ok = syn:start(),
+    ok = syn:add_node_to_scopes([scope_all]),
+
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
     syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
     syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-    syn_test_suite_helper:wait_process_name_ready(syn_groups_default),
+    syn_test_suite_helper:wait_process_name_ready(syn_groups_scope_all),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(syn:members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(syn:members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"group-2">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
 
-    2 = syn:group_count(),
-    0 = syn:group_count(default, node()),
-    1 = syn:group_count(default, SlaveNode1),
-    2 = syn:group_count(default, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, group_count, []),
-    0 = rpc:call(SlaveNode1, syn, group_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode1]),
-    2 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, group_count, []),
-    0 = rpc:call(SlaveNode2, syn, group_count, [default, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode1]),
-    2 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode2]),
+    2 = syn:group_count(scope_all),
+    0 = syn:group_count(scope_all, node()),
+    1 = syn:group_count(scope_all, SlaveNode1),
+    2 = syn:group_count(scope_all, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode1]),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode1]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode2]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "scoped-meta-1"}, {PidRemoteOn2, "scoped-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "scoped-meta-1"}, {PidRemoteOn2, "scoped-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "scoped-meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "scoped-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
-    ),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
+    ),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]),
 
     %% partial netsplit (1 cannot see 2)
     rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
@@ -1280,101 +837,101 @@ three_nodes_cluster_changes(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(syn:members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(syn:members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"group-2">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
 
-    2 = syn:group_count(),
-    0 = syn:group_count(default, node()),
-    1 = syn:group_count(default, SlaveNode1),
-    2 = syn:group_count(default, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, group_count, []),
-    0 = rpc:call(SlaveNode1, syn, group_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, group_count, []),
-    0 = rpc:call(SlaveNode2, syn, group_count, [default, node()]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode1]),
-    2 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode2]),
+    2 = syn:group_count(scope_all),
+    0 = syn:group_count(scope_all, node()),
+    1 = syn:group_count(scope_all, SlaveNode1),
+    2 = syn:group_count(scope_all, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode1]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode2]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "scoped-meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "scoped-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "scoped-meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "scoped-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
-    ),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
+    ),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1385,101 +942,101 @@ three_nodes_cluster_changes(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(syn:members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "meta-1"}, {PidRemoteOn2, "meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"common-group">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"common-group">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"common-group">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"common-group">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(syn:members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_all, <<"group-2">>])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:local_members(<<"group-2">>)) end
+        fun() -> lists:sort(syn:local_members(scope_all, <<"group-2">>)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "other-meta"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [<<"group-2">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_all, <<"group-2">>])) end
     ),
 
-    2 = syn:group_count(),
-    0 = syn:group_count(default, node()),
-    1 = syn:group_count(default, SlaveNode1),
-    2 = syn:group_count(default, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, group_count, []),
-    0 = rpc:call(SlaveNode1, syn, group_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode1]),
-    2 = rpc:call(SlaveNode1, syn, group_count, [default, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, group_count, []),
-    0 = rpc:call(SlaveNode2, syn, group_count, [default, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode1]),
-    2 = rpc:call(SlaveNode2, syn, group_count, [default, SlaveNode2]),
+    2 = syn:group_count(scope_all),
+    0 = syn:group_count(scope_all, node()),
+    1 = syn:group_count(scope_all, SlaveNode1),
+    2 = syn:group_count(scope_all, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode1]),
+    2 = rpc:call(SlaveNode1, syn, group_count, [scope_all, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode1]),
+    2 = rpc:call(SlaveNode2, syn, group_count, [scope_all, SlaveNode2]),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "scoped-meta-1"}, {PidRemoteOn2, "scoped-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([{PidRemoteOn1, "scoped-meta-1"}, {PidRemoteOn2, "scoped-meta-2"}]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
 
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:local_members(custom_scope_bc, <<"scoped-on-bc">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:local_members(scope_bc, <<"scoped-on-bc">>),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn1, "scoped-meta-1"}],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
     ),
     syn_test_suite_helper:assert_wait(
         [{PidRemoteOn2, "scoped-meta-2"}],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [custom_scope_bc, <<"scoped-on-bc">>])) end
-    ),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_count(custom_scope_bc, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, group_count, [custom_scope_bc, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, group_count, [custom_scope_bc, SlaveNode2]).
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, local_members, [scope_bc, <<"scoped-on-bc">>])) end
+    ),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:group_count(scope_bc, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, group_count, [scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, group_count, [scope_bc, SlaveNode2]).
 
 three_nodes_custom_event_handler_joined_left(Config) ->
     %% get slaves
@@ -1496,6 +1053,11 @@ three_nodes_custom_event_handler_joined_left(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all]]),
+
     %% init
     TestPid = self(),
     CurrentNode = node(),
@@ -1505,68 +1067,68 @@ three_nodes_custom_event_handler_joined_left(Config) ->
     Pid2 = syn_test_suite_helper:start_process(),
 
     %% ---> on join
-    ok = syn:join("my-group", Pid, {recipient, TestPid, <<"meta">>}),
+    ok = syn:join(scope_all, "my-group", Pid, {recipient, TestPid, <<"meta">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_joined, CurrentNode, default, "my-group", Pid, <<"meta">>, normal},
-        {on_process_joined, SlaveNode1, default, "my-group", Pid, <<"meta">>, normal},
-        {on_process_joined, SlaveNode2, default, "my-group", Pid, <<"meta">>, normal}
+        {on_process_joined, CurrentNode, scope_all, "my-group", Pid, <<"meta">>, normal},
+        {on_process_joined, SlaveNode1, scope_all, "my-group", Pid, <<"meta">>, normal},
+        {on_process_joined, SlaveNode2, scope_all, "my-group", Pid, <<"meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% join from another node
-    ok = rpc:call(SlaveNode1, syn, join, ["my-group", Pid2, {recipient, self(), <<"meta-for-2">>}]),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_all, "my-group", Pid2, {recipient, self(), <<"meta-for-2">>}]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_joined, CurrentNode, default, "my-group", Pid2, <<"meta-for-2">>, normal},
-        {on_process_joined, SlaveNode1, default, "my-group", Pid2, <<"meta-for-2">>, normal},
-        {on_process_joined, SlaveNode2, default, "my-group", Pid2, <<"meta-for-2">>, normal}
+        {on_process_joined, CurrentNode, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
+        {on_process_joined, SlaveNode1, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
+        {on_process_joined, SlaveNode2, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on meta update
-    ok = syn:join("my-group", Pid, {recipient, self(), <<"new-meta-0">>}),
+    ok = syn:join(scope_all, "my-group", Pid, {recipient, self(), <<"new-meta-0">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_group_process_updated, CurrentNode, default, "my-group", Pid, <<"new-meta-0">>, normal},
-        {on_group_process_updated, SlaveNode1, default, "my-group", Pid, <<"new-meta-0">>, normal},
-        {on_group_process_updated, SlaveNode2, default, "my-group", Pid, <<"new-meta-0">>, normal}
+        {on_group_process_updated, CurrentNode, scope_all, "my-group", Pid, <<"new-meta-0">>, normal},
+        {on_group_process_updated, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta-0">>, normal},
+        {on_group_process_updated, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta-0">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% update meta from another node
-    ok = rpc:call(SlaveNode1, syn, join, ["my-group", Pid, {recipient, self(), <<"new-meta">>}]),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_all, "my-group", Pid, {recipient, self(), <<"new-meta">>}]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_group_process_updated, CurrentNode, default, "my-group", Pid, <<"new-meta">>, normal},
-        {on_group_process_updated, SlaveNode1, default, "my-group", Pid, <<"new-meta">>, normal},
-        {on_group_process_updated, SlaveNode2, default, "my-group", Pid, <<"new-meta">>, normal}
+        {on_group_process_updated, CurrentNode, scope_all, "my-group", Pid, <<"new-meta">>, normal},
+        {on_group_process_updated, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta">>, normal},
+        {on_group_process_updated, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on left
-    ok = syn:leave("my-group", Pid),
+    ok = syn:leave(scope_all, "my-group", Pid),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_left, CurrentNode, default, "my-group", Pid, <<"new-meta">>, normal},
-        {on_process_left, SlaveNode1, default, "my-group", Pid, <<"new-meta">>, normal},
-        {on_process_left, SlaveNode2, default, "my-group", Pid, <<"new-meta">>, normal}
+        {on_process_left, CurrentNode, scope_all, "my-group", Pid, <<"new-meta">>, normal},
+        {on_process_left, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta">>, normal},
+        {on_process_left, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% leave from another node
-    ok = rpc:call(SlaveNode1, syn, leave, ["my-group", Pid2]),
+    ok = rpc:call(SlaveNode1, syn, leave, [scope_all, "my-group", Pid2]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_left, CurrentNode, default, "my-group", Pid2, <<"meta-for-2">>, normal},
-        {on_process_left, SlaveNode1, default, "my-group", Pid2, <<"meta-for-2">>, normal},
-        {on_process_left, SlaveNode2, default, "my-group", Pid2, <<"meta-for-2">>, normal}
+        {on_process_left, CurrentNode, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
+        {on_process_left, SlaveNode1, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
+        {on_process_left, SlaveNode2, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1576,13 +1138,13 @@ three_nodes_custom_event_handler_joined_left(Config) ->
 
     %% ---> after a netsplit
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
-    syn:join(remote_on_1, PidRemoteOn1, {recipient, self(), <<"netsplit">>}),
+    syn:join(scope_all, remote_on_1, PidRemoteOn1, {recipient, self(), <<"netsplit">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_joined, CurrentNode, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
-        {on_process_joined, SlaveNode1, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
-        {on_process_joined, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
+        {on_process_joined, CurrentNode, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
+        {on_process_joined, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
+        {on_process_joined, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1594,7 +1156,7 @@ three_nodes_custom_event_handler_joined_left(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_left, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, default, SlaveNode1}}
+        {on_process_left, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, scope_all, SlaveNode1}}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1607,7 +1169,7 @@ three_nodes_custom_event_handler_joined_left(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_joined, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, default, SlaveNode1}}
+        {on_process_joined, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, scope_all, SlaveNode1}}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1616,15 +1178,15 @@ three_nodes_custom_event_handler_joined_left(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_left, CurrentNode, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
-        {on_process_left, SlaveNode1, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
-        {on_process_left, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
+        {on_process_left, CurrentNode, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
+        {on_process_left, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
+        {on_process_left, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> don't call on monitor rebuild
     %% crash the scope process on local
-    syn_test_suite_helper:kill_process(syn_groups_default),
+    syn_test_suite_helper:kill_process(syn_groups_scope_all),
 
     %% no messages
     syn_test_suite_helper:assert_wait(
@@ -1632,7 +1194,7 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         fun() -> syn_test_suite_helper:assert_empty_queue(self()) end
     ).
 
-three_nodes_publish_default_scope(Config) ->
+three_nodes_publish(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -1642,62 +1204,10 @@ three_nodes_publish_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% start processes
-    TestMessage = test_message,
-    TestPid = self(),
-    SubscriberLoop = fun() -> subscriber_loop(TestPid, TestMessage) end,
-
-    Pid = syn_test_suite_helper:start_process(SubscriberLoop),
-    OtherPid = syn_test_suite_helper:start_process(SubscriberLoop),
-    PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1, SubscriberLoop),
-    PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2, SubscriberLoop),
-
-    %% join
-    ok = syn:join(<<"subscribers">>, Pid),
-    ok = syn:join(<<"ignore">>, OtherPid),
-    ok = syn:join(<<"subscribers">>, PidRemoteOn1),
-    ok = syn:join(<<"subscribers">>, PidRemoteOn2),
-
-    %% ---> publish
-    {ok, 3} = syn:publish(<<"subscribers">>, TestMessage),
-
-    syn_test_suite_helper:assert_received_messages([
-        {done, Pid},
-        {done, PidRemoteOn1},
-        {done, PidRemoteOn2}
-    ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
-
-    %% non-existant
-    {ok, 0} = syn:publish(<<"non-existant">>, TestMessage),
-    syn_test_suite_helper:assert_empty_queue(self()),
-
-    %% ---> publish local
-    {ok, 1} = syn:local_publish(<<"subscribers">>, test_message),
-
-    syn_test_suite_helper:assert_received_messages([
-        {done, Pid}
-    ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
-
-    %% non-existant
-    {ok, 0} = syn:local_publish(<<"non-existant">>, TestMessage),
-    syn_test_suite_helper:assert_empty_queue(self()).
-
-three_nodes_publish_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
 
     %% start processes
     TestMessage = test_message,
@@ -1710,14 +1220,14 @@ three_nodes_publish_custom_scope(Config) ->
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2, SubscriberLoop),
 
     %% join
-    ok = syn:join(custom_scope_ab, <<"subscribers">>, Pid),
-    ok = syn:join(custom_scope_ab, <<"subscribers-2">>, Pid2),
-    ok = syn:join(custom_scope_ab, <<"subscribers">>, PidRemoteOn1),
-    ok = rpc:call(SlaveNode1, syn, join, [custom_scope_bc, <<"subscribers">>, PidRemoteOn1]),
-    ok = rpc:call(SlaveNode2, syn, join, [custom_scope_bc, <<"subscribers">>, PidRemoteOn2]),
+    ok = syn:join(scope_ab, <<"subscribers">>, Pid),
+    ok = syn:join(scope_ab, <<"subscribers-2">>, Pid2),
+    ok = syn:join(scope_ab, <<"subscribers">>, PidRemoteOn1),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_bc, <<"subscribers">>, PidRemoteOn1]),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_bc, <<"subscribers">>, PidRemoteOn2]),
 
     %% ---> publish
-    {ok, 2} = syn:publish(custom_scope_ab, <<"subscribers">>, TestMessage),
+    {ok, 2} = syn:publish(scope_ab, <<"subscribers">>, TestMessage),
 
     syn_test_suite_helper:assert_received_messages([
         {done, Pid},
@@ -1726,10 +1236,10 @@ three_nodes_publish_custom_scope(Config) ->
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% errors
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:publish(custom_scope_bc, <<"subscribers">>, TestMessage),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:publish(scope_bc, <<"subscribers">>, TestMessage),
 
     %% on other scope
-    {ok, 2} = rpc:call(SlaveNode1, syn, publish, [custom_scope_bc, <<"subscribers">>, TestMessage]),
+    {ok, 2} = rpc:call(SlaveNode1, syn, publish, [scope_bc, <<"subscribers">>, TestMessage]),
 
     syn_test_suite_helper:assert_received_messages([
         {done, PidRemoteOn1},
@@ -1738,11 +1248,11 @@ three_nodes_publish_custom_scope(Config) ->
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% non-existant
-    {ok, 0} = syn:publish(custom_scope_ab, <<"non-existant">>, TestMessage),
+    {ok, 0} = syn:publish(scope_ab, <<"non-existant">>, TestMessage),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> publish local
-    {ok, 1} = syn:local_publish(custom_scope_ab, <<"subscribers">>, test_message),
+    {ok, 1} = syn:local_publish(scope_ab, <<"subscribers">>, test_message),
 
     syn_test_suite_helper:assert_received_messages([
         {done, Pid}
@@ -1750,10 +1260,10 @@ three_nodes_publish_custom_scope(Config) ->
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% non-existant
-    {ok, 0} = syn:local_publish(custom_scope_ab, <<"non-existant">>, TestMessage),
+    {ok, 0} = syn:local_publish(scope_ab, <<"non-existant">>, TestMessage),
     syn_test_suite_helper:assert_empty_queue(self()).
 
-three_nodes_multi_call_default_scope(Config) ->
+three_nodes_multi_call(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -1763,48 +1273,10 @@ three_nodes_multi_call_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% start processes
-    RecipientLoopLate = fun() -> timer:sleep(200), recipient_loop() end,
-
-    Pid = syn_test_suite_helper:start_process(fun recipient_loop/0),
-    Pid2 = syn_test_suite_helper:start_process(RecipientLoopLate),
-    PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1, fun recipient_loop/0),
-    PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2, fun recipient_loop/0),
-
-    %% join
-    ok = syn:join(<<"recipients">>, Pid, "meta-1"),
-    ok = syn:join(<<"recipients">>, Pid2),
-    ok = syn:join(<<"recipients">>, PidRemoteOn1, "meta-on-1"),
-    ok = syn:join(<<"recipients">>, PidRemoteOn2, "meta-on-2"),
-
-    %% ---> multi_call
-    {Replies, BadReplies} = syn:multi_call(default, <<"recipients">>, test_message, 100),
-
-    RepliesSorted = lists:sort(Replies),
-    RepliesSorted = lists:sort([
-        {{Pid, "meta-1"}, {reply, test_message, Pid, "meta-1"}},
-        {{PidRemoteOn1, "meta-on-1"}, {reply, test_message, PidRemoteOn1, "meta-on-1"}},
-        {{PidRemoteOn2, "meta-on-2"}, {reply, test_message, PidRemoteOn2, "meta-on-2"}}
-    ]),
-    BadReplies = [{Pid2, undefined}],
-
-    %% empty
-    {[], []} = syn:multi_call(default, <<"non-existant">>, test_message, 100).
-
-three_nodes_multi_call_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
 
     %% start processes
     RecipientLoopLate = fun() -> timer:sleep(200), recipient_loop() end,
@@ -1815,17 +1287,17 @@ three_nodes_multi_call_custom_scope(Config) ->
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2, fun recipient_loop/0),
 
     %% join
-    ok = syn:join(custom_scope_ab, <<"recipients">>, Pid, "meta-1"),
-    ok = syn:join(custom_scope_ab, <<"recipients">>, Pid2),
-    ok = syn:join(custom_scope_ab, <<"recipients">>, PidRemoteOn1, "meta-on-ab-1"),
-    ok = rpc:call(SlaveNode1, syn, join, [custom_scope_bc, <<"recipients">>, PidRemoteOn1, "meta-on-bc-1"]),
-    ok = rpc:call(SlaveNode2, syn, join, [custom_scope_bc, <<"recipients">>, PidRemoteOn2, "meta-on-bc-2"]),
+    ok = syn:join(scope_ab, <<"recipients">>, Pid, "meta-1"),
+    ok = syn:join(scope_ab, <<"recipients">>, Pid2),
+    ok = syn:join(scope_ab, <<"recipients">>, PidRemoteOn1, "meta-on-ab-1"),
+    ok = rpc:call(SlaveNode1, syn, join, [scope_bc, <<"recipients">>, PidRemoteOn1, "meta-on-bc-1"]),
+    ok = rpc:call(SlaveNode2, syn, join, [scope_bc, <<"recipients">>, PidRemoteOn2, "meta-on-bc-2"]),
 
     %% errors
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:multi_call(custom_scope_bc, <<"recipients">>, test_message, 100),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:multi_call(scope_bc, <<"recipients">>, test_message, 100),
 
     %% ---> multi_call
-    {RepliesAB, BadRepliesAB} = syn:multi_call(custom_scope_ab, <<"recipients">>, test_message_ab, 100),
+    {RepliesAB, BadRepliesAB} = syn:multi_call(scope_ab, <<"recipients">>, test_message_ab, 100),
 
     RepliesABSorted = lists:sort(RepliesAB),
     RepliesABSorted = lists:sort([
@@ -1835,7 +1307,7 @@ three_nodes_multi_call_custom_scope(Config) ->
     BadRepliesAB = [{Pid2, undefined}],
 
     %% different scope
-    {RepliesBC, BadRepliesBC} = rpc:call(SlaveNode1, syn, multi_call, [custom_scope_bc, <<"recipients">>, test_message_bc, 100]),
+    {RepliesBC, BadRepliesBC} = rpc:call(SlaveNode1, syn, multi_call, [scope_bc, <<"recipients">>, test_message_bc, 100]),
 
     RepliesBCSorted = lists:sort(RepliesBC),
     RepliesBCSorted = lists:sort([
@@ -1844,7 +1316,7 @@ three_nodes_multi_call_custom_scope(Config) ->
     ]),
     BadRepliesBC = [].
 
-three_nodes_group_names_default_scope(Config) ->
+three_nodes_group_names(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -1854,6 +1326,11 @@ three_nodes_group_names_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all]]),
+
     %% start processes
     Pid = syn_test_suite_helper:start_process(),
     Pid2 = syn_test_suite_helper:start_process(),
@@ -1861,120 +1338,120 @@ three_nodes_group_names_default_scope(Config) ->
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% join
-    ok = syn:join(<<"subscribers">>, Pid),
-    ok = syn:join(<<"subscribers">>, Pid2),
-    ok = syn:join(<<"subscribers-2">>, Pid),
-    ok = syn:join(<<"subscribers-2">>, PidRemoteOn1),
-    ok = syn:join(<<"subscribers-2">>, PidRemoteOn2),
-    ok = syn:join(<<"subscribers-3">>, PidRemoteOn1),
+    ok = syn:join(scope_all, <<"subscribers">>, Pid),
+    ok = syn:join(scope_all, <<"subscribers">>, Pid2),
+    ok = syn:join(scope_all, <<"subscribers-2">>, Pid),
+    ok = syn:join(scope_all, <<"subscribers-2">>, PidRemoteOn1),
+    ok = syn:join(scope_all, <<"subscribers-2">>, PidRemoteOn2),
+    ok = syn:join(scope_all, <<"subscribers-3">>, PidRemoteOn1),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(syn:group_names()) end
+        fun() -> lists:sort(syn:group_names(scope_all)) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(syn:group_names(default, node())) end
+        fun() -> lists:sort(syn:group_names(scope_all, node())) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(syn:group_names(default, SlaveNode1)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode1)) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-2">>],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode2)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode2)) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-2">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers-2">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-2">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     %% leave
-    ok = syn:leave(<<"subscribers-2">>, Pid),
-    ok = syn:leave(<<"subscribers-2">>, PidRemoteOn1),
-    ok = syn:leave(<<"subscribers-2">>, PidRemoteOn2),
+    ok = syn:leave(scope_all, <<"subscribers-2">>, Pid),
+    ok = syn:leave(scope_all, <<"subscribers-2">>, PidRemoteOn1),
+    ok = syn:leave(scope_all, <<"subscribers-2">>, PidRemoteOn2),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(syn:group_names()) end
+        fun() -> lists:sort(syn:group_names(scope_all)) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(syn:group_names(default, node())) end
+        fun() -> lists:sort(syn:group_names(scope_all, node())) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode1)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode1)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode2)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode2)) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     %% partial netsplit (1 cannot see 2)
@@ -1986,53 +1463,53 @@ three_nodes_group_names_default_scope(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(syn:group_names()) end
+        fun() -> lists:sort(syn:group_names(scope_all)) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(syn:group_names(default, node())) end
+        fun() -> lists:sort(syn:group_names(scope_all, node())) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode1)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode1)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode2)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode2)) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     %% re-join
@@ -2044,154 +1521,53 @@ three_nodes_group_names_default_scope(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(syn:group_names()) end
+        fun() -> lists:sort(syn:group_names(scope_all)) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(syn:group_names(default, node())) end
+        fun() -> lists:sort(syn:group_names(scope_all, node())) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode1)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode1)) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(syn:group_names(default, SlaveNode2)) end
+        fun() -> lists:sort(syn:group_names(scope_all, SlaveNode2)) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode1])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [default, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [scope_all, SlaveNode2])) end
     ),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([<<"subscribers">>, <<"subscribers-3">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, node()])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, node()])) end
     ),
     syn_test_suite_helper:assert_wait(
         [<<"subscribers-3">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode1])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [default, SlaveNode2])) end
-    ).
-
-three_nodes_group_names_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
-
-    %% start processes
-    Pid = syn_test_suite_helper:start_process(),
-    Pid2 = syn_test_suite_helper:start_process(),
-    PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
-    PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
-
-    %% join
-    ok = syn:join(custom_scope_ab, <<"subscribers">>, Pid),
-    ok = syn:join(custom_scope_ab, <<"subscribers">>, Pid2),
-    ok = syn:join(custom_scope_ab, <<"subscribers">>, PidRemoteOn1),
-    ok = syn:join(custom_scope_ab, <<"subscribers-2">>, Pid),
-    ok = rpc:call(SlaveNode1, syn, join, [custom_scope_bc, <<"subscribers">>, PidRemoteOn1]),
-    ok = rpc:call(SlaveNode2, syn, join, [custom_scope_bc, <<"subscribers-2">>, PidRemoteOn2]),
-
-    %% errors
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:group_names(custom_scope_bc),
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(syn:group_names(custom_scope_ab)) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(syn:group_names(custom_scope_ab, node())) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers">>],
-        fun() -> lists:sort(syn:group_names(custom_scope_ab, SlaveNode1)) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(syn:group_names(custom_scope_ab, SlaveNode2)) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_ab])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_ab, node()])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_ab, SlaveNode1])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_ab, SlaveNode2])) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_bc])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode1])) end
     ),
     syn_test_suite_helper:assert_wait(
         [],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_bc, node()])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_bc, SlaveNode1])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers-2">>],
-        fun() -> lists:sort(rpc:call(SlaveNode1, syn, group_names, [custom_scope_bc, SlaveNode2])) end
-    ),
-
-    syn_test_suite_helper:assert_wait(
-        lists:sort([<<"subscribers">>, <<"subscribers-2">>]),
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [custom_scope_bc])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [custom_scope_bc, node()])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [custom_scope_bc, SlaveNode1])) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        [<<"subscribers-2">>],
-        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [custom_scope_bc, SlaveNode2])) end
+        fun() -> lists:sort(rpc:call(SlaveNode2, syn, group_names, [scope_all, SlaveNode2])) end
     ).
 
 %% ===================================================================

+ 511 - 871
test/syn_registry_SUITE.erl

@@ -36,10 +36,8 @@
     one_node_via_register_unregister/1
 ]).
 -export([
-    three_nodes_discover_default_scope/1,
-    three_nodes_discover_custom_scope/1,
-    three_nodes_register_unregister_and_monitor_default_scope/1,
-    three_nodes_register_unregister_and_monitor_custom_scope/1,
+    three_nodes_discover/1,
+    three_nodes_register_unregister_and_monitor/1,
     three_nodes_cluster_changes/1,
     three_nodes_cluster_conflicts/1,
     three_nodes_custom_event_handler_reg_unreg/1,
@@ -85,10 +83,8 @@ groups() ->
             one_node_via_register_unregister
         ]},
         {three_nodes_process_registration, [shuffle], [
-            three_nodes_discover_default_scope,
-            three_nodes_discover_custom_scope,
-            three_nodes_register_unregister_and_monitor_default_scope,
-            three_nodes_register_unregister_and_monitor_custom_scope,
+            three_nodes_discover,
+            three_nodes_register_unregister_and_monitor,
             three_nodes_cluster_changes,
             three_nodes_cluster_conflicts,
             three_nodes_custom_event_handler_reg_unreg,
@@ -188,39 +184,15 @@ one_node_via_register_unregister(_Config) ->
     %% start syn
     ok = syn:start(),
 
-    %% ---> default scope
-    %% start gen server via syn
-    GenServerName = {default, <<"my proc">>},
-    Tuple = {via, syn, GenServerName},
-    {ok, Pid} = syn_test_gen_server:start_link(Tuple),
-    %% retrieve
-    {Pid, undefined} = syn:lookup(<<"my proc">>),
-    %% call
-    pong = syn_test_gen_server:ping(Tuple),
-    %% send via syn
-    syn:send(GenServerName, {self(), send_ping}),
-    syn_test_suite_helper:assert_received_messages([
-        reply_pong
-    ]),
-    %% stop server
-    syn_test_gen_server:stop(Tuple),
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup(<<"my proc">>) end
-    ),
-    %% send via syn
-    {badarg, {GenServerName, anything}} = catch syn:send(GenServerName, anything),
-
-    %% ---> custom scope
-    syn:add_node_to_scope(custom_scope),
+    %% --->  scope
+    syn:add_node_to_scopes([scope]),
 
     %% start gen server via syn
-    GenServerNameCustom = {custom_scope, <<"my proc">>},
+    GenServerNameCustom = {scope, <<"my proc">>},
     TupleCustom = {via, syn, GenServerNameCustom},
     {ok, PidCustom} = syn_test_gen_server:start_link(TupleCustom),
     %% retrieve
-    {PidCustom, undefined} = syn:lookup(custom_scope, <<"my proc">>),
+    {PidCustom, undefined} = syn:lookup(scope, <<"my proc">>),
     %% call
     pong = syn_test_gen_server:ping(TupleCustom),
     %% send via syn
@@ -233,95 +205,12 @@ one_node_via_register_unregister(_Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup(custom_scope, <<"my proc">>) end
+        fun() -> syn:lookup(scope, <<"my proc">>) end
     ),
     %% send via syn
     {badarg, {GenServerNameCustom, anything}} = catch syn:send(GenServerNameCustom, anything).
 
-three_nodes_discover_default_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% simulate full netsplit
-    rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
-    syn_test_suite_helper:disconnect_node(SlaveNode1),
-    syn_test_suite_helper:disconnect_node(SlaveNode2),
-    syn_test_suite_helper:assert_cluster(node(), []),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, []),
-
-    %% reconnect slave 1
-    syn_test_suite_helper:connect_node(SlaveNode1),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node()]),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node()]),
-
-    %% reconnect all
-    syn_test_suite_helper:connect_node(SlaveNode2),
-    rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% simulate full netsplit, again
-    rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
-    syn_test_suite_helper:disconnect_node(SlaveNode1),
-    syn_test_suite_helper:disconnect_node(SlaveNode2),
-    syn_test_suite_helper:assert_cluster(node(), []),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, []),
-    %% reconnect all, again
-    syn_test_suite_helper:connect_node(SlaveNode2),
-    rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% crash the scope process on local
-    syn_test_suite_helper:kill_process(syn_registry_default),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
-
-    %% check, it should have rebuilt after supervisor restarts it
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
-
-    %% crash scopes supervisor on local
-    syn_test_suite_helper:kill_process(syn_scopes_sup),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
-
-    %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]).
-
-three_nodes_discover_custom_scope(Config) ->
+three_nodes_discover(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -331,29 +220,24 @@ three_nodes_discover_custom_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = syn:add_node_to_scope(custom_scope_all),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc, custom_scope_all]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc, custom_scope_c, custom_scope_all]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc, scope_all]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc, scope_c, scope_all]]),
 
     %% get_subcluster_nodes should return invalid errors
     {'EXIT', {{invalid_scope, custom_abcdef}, _}} = catch syn_registry:get_subcluster_nodes(custom_abcdef),
 
     %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
-
-    %% check default
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), default, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, default, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, default, [node(), SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
 
     %% disconnect node 2 (node 1 can still see node 2)
     syn_test_suite_helper:disconnect_node(SlaveNode2),
@@ -361,11 +245,11 @@ three_nodes_discover_custom_scope(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
 
     %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_all, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_all, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
 
     %% reconnect node 2
     syn_test_suite_helper:connect_node(SlaveNode2),
@@ -374,44 +258,45 @@ three_nodes_discover_custom_scope(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
 
     %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
 
     %% crash a scope process on 2
-    rpc:call(SlaveNode2, syn_test_suite_helper, kill_process, [syn_registry_custom_scope_bc]),
+    rpc:call(SlaveNode2, syn_test_suite_helper, kill_process, [syn_registry_scope_bc]),
     rpc:call(SlaveNode2, syn_test_suite_helper, wait_process_name_ready, [syn_registry_default]),
 
     %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]),
 
     %% crash scopes supervisor on local
     syn_test_suite_helper:kill_process(syn_scopes_sup),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
+    syn_test_suite_helper:wait_process_name_ready(syn_registry_scope_ab),
+    syn_test_suite_helper:wait_process_name_ready(syn_registry_scope_all),
 
     %% check
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_ab, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(node(), custom_scope_all, [SlaveNode1, SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_ab, [node()]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_bc, [SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, custom_scope_all, [node(), SlaveNode2]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_bc, [SlaveNode1]),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_c, []),
-    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, custom_scope_all, [node(), SlaveNode1]).
-
-three_nodes_register_unregister_and_monitor_default_scope(Config) ->
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_ab, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(node(), scope_all, [SlaveNode1, SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_ab, [node()]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_bc, [SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode1, scope_all, [node(), SlaveNode2]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_bc, [SlaveNode1]),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_c, []),
+    syn_test_suite_helper:assert_registry_scope_subcluster(SlaveNode2, scope_all, [node(), SlaveNode1]).
+
+three_nodes_register_unregister_and_monitor(Config) ->
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode2 = proplists:get_value(slave_node_2, Config),
@@ -421,220 +306,10 @@ three_nodes_register_unregister_and_monitor_default_scope(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% start processes
-    Pid = syn_test_suite_helper:start_process(),
-    PidWithMeta = syn_test_suite_helper:start_process(),
-    PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
-
-    %% retrieve
-    undefined = syn:lookup(<<"my proc">>),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [<<"my proc">>]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, [<<"my proc">>]),
-    undefined = syn:lookup({"my proc alias"}),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [{"my proc alias"}]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, [{"my proc alias"}]),
-    undefined = syn:lookup(<<"my proc with meta">>),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [<<"my proc with meta">>]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, [<<"my proc with meta">>]),
-    undefined = syn:lookup({remote_pid_on, slave_1}),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]),
-    0 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    0 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-
-    %% register
-    ok = syn:register(<<"my proc">>, Pid),
-    ok = syn:register({"my proc alias"}, Pid), %% same pid, different name
-    ok = syn:register(<<"my proc with meta">>, PidWithMeta, {meta, <<"meta">>}), %% pid with meta
-    ok = syn:register({remote_pid_on, slave_1}, PidRemoteOn1), %% remote on slave 1
-
-    %% errors
-    {error, taken} = syn:register(<<"my proc">>, PidRemoteOn1),
-    {error, not_alive} = syn:register({"pid not alive"}, list_to_pid("<0.9999.0>")),
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> syn:lookup(<<"my proc">>) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> syn:lookup({"my proc alias"}) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [{"my proc alias"}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {Pid, undefined},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [{"my proc alias"}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta, <<"meta">>}},
-        fun() -> syn:lookup(<<"my proc with meta">>) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta, <<"meta">>}},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta, <<"meta">>}},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, undefined},
-        fun() -> syn:lookup({remote_pid_on, slave_1}) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, undefined},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    4 = syn:registry_count(),
-    3 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-
-    %% re-register to edit meta
-    ok = syn:register(<<"my proc with meta">>, PidWithMeta, {meta2, <<"meta2">>}),
-    ok = rpc:call(SlaveNode2, syn, register, [{remote_pid_on, slave_1}, PidRemoteOn1, added_meta]), %% updated on slave 2
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta2, <<"meta2">>}},
-        fun() -> syn:lookup(<<"my proc with meta">>) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta2, <<"meta2">>}},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidWithMeta, {meta2, <<"meta2">>}},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, added_meta},
-        fun() -> syn:lookup({remote_pid_on, slave_1}) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, added_meta},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidRemoteOn1, added_meta},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    4 = syn:registry_count(),
-    3 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-
-    %% crash scope process to ensure that monitors get recreated
-    exit(whereis(syn_registry_default), kill),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
-
-    %% kill process
-    syn_test_suite_helper:kill_process(Pid),
-    syn_test_suite_helper:kill_process(PidRemoteOn1),
-    %% unregister process
-    ok = syn:unregister(<<"my proc with meta">>),
-
-    %% retrieve
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup(<<"my proc">>) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup({"my proc alias"}) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [{"my proc alias"}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [{"my proc alias"}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup(<<"my proc with meta">>) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc with meta">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup({remote_pid_on, slave_1}) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]) end
-    ),
-    0 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    0 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-
-    %% errors
-    {error, undefined} = syn:unregister({invalid_name}),
-
-    %% (simulate race condition)
-    Pid1 = syn_test_suite_helper:start_process(),
-    Pid2 = syn_test_suite_helper:start_process(),
-    ok = syn:register(<<"my proc">>, Pid1),
-    syn_test_suite_helper:assert_wait(
-        {Pid1, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc">>]) end
-    ),
-    remove_from_local_table(default, <<"my proc">>, Pid1),
-    add_to_local_table(default, <<"my proc">>, Pid2, undefined, 0, undefined),
-    {error, race_condition} = rpc:call(SlaveNode1, syn, unregister, [<<"my proc">>]).
-
-three_nodes_register_unregister_and_monitor_custom_scope(Config) ->
-    %% get slaves
-    SlaveNode1 = proplists:get_value(slave_node_1, Config),
-    SlaveNode2 = proplists:get_value(slave_node_2, Config),
-
-    %% start syn on nodes
-    ok = syn:start(),
-    ok = rpc:call(SlaveNode1, syn, start, []),
-    ok = rpc:call(SlaveNode2, syn, start, []),
-
-    %% add custom scopes
-    ok = syn:add_node_to_scope(custom_scope_ab),
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_ab, custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_ab]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_ab, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
 
     %% start processes
     Pid = syn_test_suite_helper:start_process(),
@@ -642,225 +317,198 @@ three_nodes_register_unregister_and_monitor_custom_scope(Config) ->
     PidRemoteWithMetaOn1 = syn_test_suite_helper:start_process(SlaveNode1),
 
     %% retrieve
-    undefined = syn:lookup("scope_a"),
-    undefined = rpc:call(SlaveNode1, syn, lookup, ["scope_a"]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, ["scope_a"]),
-    undefined = syn:lookup(custom_scope_ab, "scope_a"),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a"]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a"]),
-    undefined = syn:lookup(custom_scope_ab, "scope_a_alias"),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a_alias"]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a_alias"]),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, {remote_scoped_bc}),
-    undefined = rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]),
-    undefined = rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]),
-    0 = syn:registry_count(custom_scope_ab),
-    0 = syn:registry_count(custom_scope_ab, node()),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode1),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode2),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+    undefined = syn:lookup(scope_ab, "scope_a"),
+    undefined = rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a"]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a"]),
+    undefined = syn:lookup(scope_ab, "scope_a_alias"),
+    undefined = rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a_alias"]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a_alias"]),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, {remote_scoped_bc}),
+    undefined = rpc:call(SlaveNode1, syn, lookup, [scope_bc, {remote_scoped_bc}]),
+    undefined = rpc:call(SlaveNode2, syn, lookup, [scope_bc, {remote_scoped_bc}]),
+    0 = syn:registry_count(scope_ab),
+    0 = syn:registry_count(scope_ab, node()),
+    0 = syn:registry_count(scope_ab, SlaveNode1),
+    0 = syn:registry_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode2),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% register
-    ok = syn:register(custom_scope_ab, "scope_a", Pid),
-    ok = syn:register(custom_scope_ab, "scope_a_alias", PidWithMeta, <<"with_meta">>),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:register(custom_scope_bc, "scope_a", Pid),
+    ok = syn:register(scope_ab, "scope_a", Pid),
+    ok = syn:register(scope_ab, "scope_a_alias", PidWithMeta, <<"with_meta">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:register(scope_bc, "scope_a", Pid),
     {'EXIT', {{invalid_scope, non_existent_scope}, _}} = catch syn:register(non_existent_scope, "scope_a", Pid),
-    ok = rpc:call(SlaveNode2, syn, register, [custom_scope_bc, {remote_scoped_bc}, PidRemoteWithMetaOn1, <<"with_meta 1">>]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_bc, {remote_scoped_bc}, PidRemoteWithMetaOn1, <<"with_meta 1">>]),
 
     %% errors
-    {error, taken} = syn:register(custom_scope_ab, "scope_a", PidWithMeta),
-    {error, not_alive} = syn:register(custom_scope_ab, {"pid not alive"}, list_to_pid("<0.9999.0>")),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:register(custom_scope_bc, "scope_a_noscope", Pid),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:unregister(custom_scope_bc, "scope_a_noscope"),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_bc}, _}}} = catch rpc:call(SlaveNode1, syn, register, [custom_scope_bc, "pid-outside", Pid]),
+    {error, taken} = syn:register(scope_ab, "scope_a", PidWithMeta),
+    {error, not_alive} = syn:register(scope_ab, {"pid not alive"}, list_to_pid("<0.9999.0>")),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:register(scope_bc, "scope_a_noscope", Pid),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:unregister(scope_bc, "scope_a_noscope"),
+    {badrpc, {'EXIT', {{invalid_remote_scope, scope_bc}, _}}} = catch rpc:call(SlaveNode1, syn, register, [scope_bc, "pid-outside", Pid]),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup("scope_a") end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["scope_a"]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["scope_a"]) end
-    ),
-    syn_test_suite_helper:assert_wait(
         {Pid, undefined},
-        fun() -> syn:lookup(custom_scope_ab, "scope_a") end
+        fun() -> syn:lookup(scope_ab, "scope_a") end
     ),
     syn_test_suite_helper:assert_wait(
         {Pid, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a"]) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a"]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a"]),
     syn_test_suite_helper:assert_wait(
         {PidWithMeta, <<"with_meta">>},
-        fun() -> syn:lookup(custom_scope_ab, "scope_a_alias") end
+        fun() -> syn:lookup(scope_ab, "scope_a_alias") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidWithMeta, <<"with_meta">>},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a_alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a_alias"]) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a_alias"]),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, {remote_scoped_bc}),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a_alias"]),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, {remote_scoped_bc}),
     syn_test_suite_helper:assert_wait(
         {PidRemoteWithMetaOn1, <<"with_meta 1">>},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, {remote_scoped_bc}]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteWithMetaOn1, <<"with_meta 1">>},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]) end
-    ),
-    2 = syn:registry_count(custom_scope_ab),
-    2 = syn:registry_count(custom_scope_ab, node()),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode1),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab]),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, {remote_scoped_bc}]) end
+    ),
+    2 = syn:registry_count(scope_ab),
+    2 = syn:registry_count(scope_ab, node()),
+    0 = syn:registry_count(scope_ab, SlaveNode1),
+    0 = syn:registry_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab]),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% re-register to edit meta
-    ok = syn:register(custom_scope_ab, "scope_a_alias", PidWithMeta, <<"with_meta_updated">>),
+    ok = syn:register(scope_ab, "scope_a_alias", PidWithMeta, <<"with_meta_updated">>),
     syn_test_suite_helper:assert_wait(
         {PidWithMeta, <<"with_meta_updated">>},
-        fun() -> syn:lookup(custom_scope_ab, "scope_a_alias") end
+        fun() -> syn:lookup(scope_ab, "scope_a_alias") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidWithMeta, <<"with_meta_updated">>},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a_alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a_alias"]) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a_alias"]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a_alias"]),
 
     %% crash scope process to ensure that monitors get recreated
-    syn_test_suite_helper:kill_process(syn_registry_custom_scope_ab),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
+    syn_test_suite_helper:kill_process(syn_registry_scope_ab),
+    syn_test_suite_helper:wait_process_name_ready(syn_registry_scope_ab),
 
     %% kill process
     syn_test_suite_helper:kill_process(Pid),
     syn_test_suite_helper:kill_process(PidWithMeta),
     %% unregister processes
-    {error, undefined} = catch syn:unregister(<<"my proc with meta">>),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:unregister(custom_scope_bc, <<"my proc with meta">>),
-    ok = rpc:call(SlaveNode1, syn, unregister, [custom_scope_bc, {remote_scoped_bc}]),
+    {error, undefined} = catch syn:unregister(scope_ab, <<"my proc with meta">>),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:unregister(scope_bc, <<"my proc with meta">>),
+    ok = rpc:call(SlaveNode1, syn, unregister, [scope_bc, {remote_scoped_bc}]),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup("scope_a") end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["scope_a"]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["scope_a"]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        undefined,
-        fun() -> syn:lookup(custom_scope_ab, "scope_a") end
+        fun() -> syn:lookup(scope_ab, "scope_a") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a"]) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a"]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a"]),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup(custom_scope_ab, "scope_a_alias") end
+        fun() -> syn:lookup(scope_ab, "scope_a_alias") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, "scope_a_alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, "scope_a_alias"]) end
     ),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [custom_scope_ab, "scope_a_alias"]),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, {remote_scoped_bc}),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, lookup, [scope_ab, "scope_a_alias"]),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, {remote_scoped_bc}),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, {remote_scoped_bc}]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, {remote_scoped_bc}]) end
-    ),
-    0 = syn:registry_count(custom_scope_ab),
-    0 = syn:registry_count(custom_scope_ab, node()),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode1),
-    0 = syn:registry_count(custom_scope_ab, SlaveNode2),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode2),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, node()]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode1]),
-    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [custom_scope_ab, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, {remote_scoped_bc}]) end
+    ),
+    0 = syn:registry_count(scope_ab),
+    0 = syn:registry_count(scope_ab, node()),
+    0 = syn:registry_count(scope_ab, SlaveNode1),
+    0 = syn:registry_count(scope_ab, SlaveNode2),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode2),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, node()]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode1]),
+    {badrpc, {'EXIT', {{invalid_scope, scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, registry_count, [scope_ab, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% errors
-    {error, undefined} = syn:unregister(custom_scope_ab, {invalid_name}),
+    {error, undefined} = syn:unregister(scope_ab, {invalid_name}),
 
     %% (simulate race condition)
     Pid1 = syn_test_suite_helper:start_process(),
     Pid2 = syn_test_suite_helper:start_process(),
-    ok = syn:register(custom_scope_ab, <<"my proc">>, Pid1),
+    ok = syn:register(scope_ab, <<"my proc">>, Pid1),
     syn_test_suite_helper:assert_wait(
         {Pid1, undefined},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_ab, <<"my proc">>]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_ab, <<"my proc">>]) end
     ),
-    remove_from_local_table(custom_scope_ab, <<"my proc">>, Pid1),
-    add_to_local_table(custom_scope_ab, <<"my proc">>, Pid2, undefined, 0, undefined),
-    {error, race_condition} = rpc:call(SlaveNode1, syn, unregister, [custom_scope_ab, <<"my proc">>]).
+    remove_from_local_table(scope_ab, <<"my proc">>, Pid1),
+    add_to_local_table(scope_ab, <<"my proc">>, Pid2, undefined, 0, undefined),
+    {error, race_condition} = rpc:call(SlaveNode1, syn, unregister, [scope_ab, <<"my proc">>]).
 
 three_nodes_cluster_changes(Config) ->
     %% get slaves
@@ -877,94 +525,97 @@ three_nodes_cluster_changes(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% add custom scopes
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
 
     %% start processes
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
     PidRemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% register
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-1", PidRemoteOn1, "meta-1"]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-2", PidRemoteOn2, "meta-2"]),
-    ok = rpc:call(SlaveNode1, syn, register, [custom_scope_bc, "BC-proc-1", PidRemoteOn1, "meta-1"]),
-    ok = rpc:call(SlaveNode1, syn, register, [custom_scope_bc, "BC-proc-1 alias", PidRemoteOn1, "meta-1 alias"]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-1", PidRemoteOn1, "meta-1"]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-2", PidRemoteOn2, "meta-2"]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_bc, "BC-proc-1", PidRemoteOn1, "meta-1"]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_bc, "BC-proc-1 alias", PidRemoteOn1, "meta-1 alias"]),
 
     %% form full cluster
     ok = syn:start(),
+    ok = syn:add_node_to_scopes([scope_all]),
+
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
     syn_test_suite_helper:assert_cluster(node(), [SlaveNode1, SlaveNode2]),
     syn_test_suite_helper:assert_cluster(SlaveNode1, [node(), SlaveNode2]),
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node(), SlaveNode1]),
-    syn_test_suite_helper:wait_process_name_ready(syn_registry_default),
+
+    %% retrieve
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> syn:lookup("proc-1") end
+        fun() -> syn:lookup(scope_all, "proc-1") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> syn:lookup("proc-2") end
+        fun() -> syn:lookup(scope_all, "proc-2") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-2"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-2"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-2"]) end
-    ),
-    2 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    1 = syn:registry_count(default, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1"),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-2"]) end
+    ),
+    2 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    1 = syn:registry_count(scope_all, SlaveNode1),
+    1 = syn:registry_count(scope_all, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1 alias"),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1 alias"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1 alias"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1 alias"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
-    ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, node()),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode1),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
+    ),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, node()),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode1),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% partial netsplit (1 cannot see 2)
     rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
@@ -975,68 +626,68 @@ three_nodes_cluster_changes(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> syn:lookup("proc-1") end
+        fun() -> syn:lookup(scope_all, "proc-1") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> syn:lookup("proc-2") end
+        fun() -> syn:lookup(scope_all, "proc-2") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-2"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-2"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-2"]) end
-    ),
-    2 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    1 = syn:registry_count(default, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1"),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-2"]) end
+    ),
+    2 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    1 = syn:registry_count(scope_all, SlaveNode1),
+    1 = syn:registry_count(scope_all, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1 alias"),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1 alias"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1 alias"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
-    ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
+    ),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1047,68 +698,68 @@ three_nodes_cluster_changes(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> syn:lookup("proc-1") end
+        fun() -> syn:lookup(scope_all, "proc-1") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> syn:lookup("proc-2") end
+        fun() -> syn:lookup(scope_all, "proc-2") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-2"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-2"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-2"]) end
-    ),
-    2 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    1 = syn:registry_count(default, SlaveNode2),
-    2 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
-
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1"),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-2"]) end
+    ),
+    2 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    1 = syn:registry_count(scope_all, SlaveNode1),
+    1 = syn:registry_count(scope_all, SlaveNode2),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
+
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1"]) end
     ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:lookup(custom_scope_bc, "BC-proc-1 alias"),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:lookup(scope_bc, "BC-proc-1 alias"),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1 alias"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidRemoteOn1, "meta-1 alias"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "BC-proc-1 alias"]) end
-    ),
-    {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:registry_count(custom_scope_bc),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    2 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    2 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]).
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "BC-proc-1 alias"]) end
+    ),
+    {'EXIT', {{invalid_scope, scope_bc}, _}} = catch syn:registry_count(scope_bc),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    2 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    2 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]).
 
 three_nodes_cluster_conflicts(Config) ->
     %% get slaves
@@ -1120,9 +771,10 @@ three_nodes_cluster_conflicts(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% add custom scopes
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
 
     %% partial netsplit (1 cannot see 2)
     rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
@@ -1135,10 +787,10 @@ three_nodes_cluster_conflicts(Config) ->
     Pid2RemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% --> conflict by netsplit
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-confict-by-netsplit", Pid2RemoteOn1, "meta-1"]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-confict-by-netsplit", Pid2RemoteOn2, "meta-2"]),
-    ok = rpc:call(SlaveNode1, syn, register, [custom_scope_bc, "proc-confict-by-netsplit-scoped", Pid2RemoteOn1, "meta-1"]),
-    ok = rpc:call(SlaveNode2, syn, register, [custom_scope_bc, "proc-confict-by-netsplit-scoped", Pid2RemoteOn2, "meta-2"]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-confict-by-netsplit", Pid2RemoteOn1, "meta-1"]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-confict-by-netsplit", Pid2RemoteOn2, "meta-2"]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_bc, "proc-confict-by-netsplit-scoped", Pid2RemoteOn1, "meta-1"]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_bc, "proc-confict-by-netsplit-scoped", Pid2RemoteOn2, "meta-2"]),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1149,44 +801,44 @@ three_nodes_cluster_conflicts(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         {Pid2RemoteOn2, "meta-2"},
-        fun() -> syn:lookup("proc-confict-by-netsplit") end
+        fun() -> syn:lookup(scope_all, "proc-confict-by-netsplit") end
     ),
     syn_test_suite_helper:assert_wait(
         {Pid2RemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-confict-by-netsplit"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-confict-by-netsplit"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {Pid2RemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-confict-by-netsplit"]) end
-    ),
-    1 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    0 = syn:registry_count(default, SlaveNode1),
-    1 = syn:registry_count(default, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-confict-by-netsplit"]) end
+    ),
+    1 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    0 = syn:registry_count(scope_all, SlaveNode1),
+    1 = syn:registry_count(scope_all, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
     syn_test_suite_helper:assert_wait(
         {Pid2RemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {Pid2RemoteOn2, "meta-2"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped"]) end
     ),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     %% process alive
     syn_test_suite_helper:assert_wait(
@@ -1204,41 +856,23 @@ three_nodes_cluster_conflicts(Config) ->
     rpc:call(SlaveNode1, syn_registry, add_to_local_table,
         [default, <<"my proc">>, PidOn1, "meta-2", erlang:system_time(), undefined]
     ),
-    ok = syn:register(<<"my proc">>, PidOnMaster, "meta-1"),
+    ok = syn:register(scope_all, <<"my proc">>, PidOnMaster, "meta-1"),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         {PidOnMaster, "meta-1"},
-        fun() -> syn:lookup(<<"my proc">>) end
+        fun() -> syn:lookup(scope_all, <<"my proc">>) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidOnMaster, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [<<"my proc">>]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, <<"my proc">>]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidOnMaster, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [<<"my proc">>]) end
-    ),
-
-    %% NB: we can't check for process alive here because we injected the conflictinf process in the DB
-    %% -> it's not actually monitored
-
-    %% same, but custom scope
-    PidCustom1 = syn_test_suite_helper:start_process(SlaveNode1),
-    PidCustom2 = syn_test_suite_helper:start_process(SlaveNode2),
-    rpc:call(SlaveNode2, syn_registry, add_to_local_table,
-        [custom_scope_bc, <<"my proc">>, PidCustom2, "meta-2", erlang:system_time(), undefined]
-    ),
-    ok = rpc:call(SlaveNode1, syn, register, [custom_scope_bc, <<"my proc">>, PidCustom1, "meta-1"]),
-
-    syn_test_suite_helper:assert_wait(
-        {PidCustom1, "meta-1"},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, <<"my proc">>]) end
-    ),
-    syn_test_suite_helper:assert_wait(
-        {PidCustom1, "meta-1"},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, <<"my proc">>]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, <<"my proc">>]) end
     ).
+%% NB: we can't check for process alive here because we injected the conflicting process in the DB
+%% -> it's not actually monitored
 
 three_nodes_custom_event_handler_reg_unreg(Config) ->
     %% get slaves
@@ -1255,6 +889,11 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all]]),
+
     %% init
     CurrentNode = node(),
 
@@ -1263,68 +902,68 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     Pid2 = syn_test_suite_helper:start_process(),
 
     %% ---> on registration
-    ok = syn:register("proc-handler", Pid, {recipient, self(), <<"meta">>}),
+    ok = syn:register(scope_all, "proc-handler", Pid, {recipient, self(), <<"meta">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-handler", Pid, <<"meta">>, normal},
-        {on_process_registered, SlaveNode1, default, "proc-handler", Pid, <<"meta">>, normal},
-        {on_process_registered, SlaveNode2, default, "proc-handler", Pid, <<"meta">>, normal}
+        {on_process_registered, CurrentNode, scope_all, "proc-handler", Pid, <<"meta">>, normal},
+        {on_process_registered, SlaveNode1, scope_all, "proc-handler", Pid, <<"meta">>, normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-handler", Pid, <<"meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% registration from another node
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2">>}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2">>}]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-handler-2", Pid2, <<"meta-for-2">>, normal},
-        {on_process_registered, SlaveNode1, default, "proc-handler-2", Pid2, <<"meta-for-2">>, normal},
-        {on_process_registered, SlaveNode2, default, "proc-handler-2", Pid2, <<"meta-for-2">>, normal}
+        {on_process_registered, CurrentNode, scope_all, "proc-handler-2", Pid2, <<"meta-for-2">>, normal},
+        {on_process_registered, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2">>, normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on meta update
-    ok = syn:register("proc-handler", Pid, {recipient, self(), <<"new-meta">>}),
+    ok = syn:register(scope_all, "proc-handler", Pid, {recipient, self(), <<"new-meta">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_registry_process_updated, CurrentNode, default, "proc-handler", Pid, <<"new-meta">>, normal},
-        {on_registry_process_updated, SlaveNode1, default, "proc-handler", Pid, <<"new-meta">>, normal},
-        {on_registry_process_updated, SlaveNode2, default, "proc-handler", Pid, <<"new-meta">>, normal}
+        {on_registry_process_updated, CurrentNode, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
+        {on_registry_process_updated, SlaveNode1, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
+        {on_registry_process_updated, SlaveNode2, scope_all, "proc-handler", Pid, <<"new-meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% meta update from another node
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2-update">>}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2-update">>}]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_registry_process_updated, CurrentNode, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
-        {on_registry_process_updated, SlaveNode1, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
-        {on_registry_process_updated, SlaveNode2, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
+        {on_registry_process_updated, CurrentNode, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
+        {on_registry_process_updated, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
+        {on_registry_process_updated, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on unregister
-    ok = syn:unregister("proc-handler"),
+    ok = syn:unregister(scope_all, "proc-handler"),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-handler", Pid, <<"new-meta">>, normal},
-        {on_process_unregistered, SlaveNode1, default, "proc-handler", Pid, <<"new-meta">>, normal},
-        {on_process_unregistered, SlaveNode2, default, "proc-handler", Pid, <<"new-meta">>, normal}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-handler", Pid, <<"new-meta">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% unregister from another node
-    ok = rpc:call(SlaveNode1, syn, unregister, ["proc-handler-2"]),
+    ok = rpc:call(SlaveNode1, syn, unregister, [scope_all, "proc-handler-2"]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
-        {on_process_unregistered, SlaveNode1, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
-        {on_process_unregistered, SlaveNode2, default, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1334,13 +973,13 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% ---> after a netsplit
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
-    syn:register(remote_on_1, PidRemoteOn1, {recipient, self(), <<"netsplit">>}),
+    syn:register(scope_all, remote_on_1, PidRemoteOn1, {recipient, self(), <<"netsplit">>}),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
-        {on_process_registered, SlaveNode1, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
-        {on_process_registered, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
+        {on_process_registered, CurrentNode, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
+        {on_process_registered, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
+        {on_process_registered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1352,7 +991,7 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, default, SlaveNode1}}
+        {on_process_unregistered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, scope_all, SlaveNode1}}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1365,7 +1004,7 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, default, SlaveNode1}}
+        {on_process_registered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, scope_all, SlaveNode1}}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1374,9 +1013,9 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
-        {on_process_unregistered, SlaveNode1, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
-        {on_process_unregistered, SlaveNode2, default, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
+        {on_process_unregistered, CurrentNode, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
+        {on_process_unregistered, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
+        {on_process_unregistered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1391,16 +1030,16 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     Pid2RemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
     Pid2RemoteOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-confict", Pid2RemoteOn1, {recipient, self(), <<"meta-1">>}]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-confict", Pid2RemoteOn2, {recipient, self(), <<"meta-2">>}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-confict", Pid2RemoteOn1, {recipient, self(), <<"meta-1">>}]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-confict", Pid2RemoteOn2, {recipient, self(), <<"meta-2">>}]),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
-        {on_process_unregistered, CurrentNode, default, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
-        {on_process_registered, CurrentNode, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, normal},
-        {on_process_registered, SlaveNode1, default, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
-        {on_process_registered, SlaveNode2, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, normal}
+        {on_process_registered, CurrentNode, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, normal},
+        {on_process_registered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1412,8 +1051,8 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, SlaveNode1, default, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, syn_conflict_resolution},
-        {on_process_registered, SlaveNode1, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, syn_conflict_resolution}
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, syn_conflict_resolution},
+        {on_process_registered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, syn_conflict_resolution}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1423,15 +1062,15 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed},
-        {on_process_unregistered, SlaveNode1, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed},
-        {on_process_unregistered, SlaveNode2, default, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> don't call on monitor rebuild
     %% crash the scope process on local
-    syn_test_suite_helper:kill_process(syn_registry_default),
+    syn_test_suite_helper:kill_process(syn_registry_scope_all),
 
     %% no messages
     syn_test_suite_helper:assert_wait(
@@ -1454,9 +1093,10 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     ok = rpc:call(SlaveNode1, syn, start, []),
     ok = rpc:call(SlaveNode2, syn, start, []),
 
-    %% add custom scopes
-    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[custom_scope_bc]]),
-    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[custom_scope_bc]]),
+    %% add scopes
+    ok = syn:add_node_to_scopes([scope_all]),
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_all, scope_bc]]),
 
     %% current node
     TestPid = self(),
@@ -1473,21 +1113,21 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     PidOn2 = syn_test_suite_helper:start_process(SlaveNode2),
 
     %% --> conflict by netsplit
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-confict-by-netsplit-custom", PidOn1, {recipient, TestPid, keepthis}]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-confict-by-netsplit-custom", PidOn2, {recipient, TestPid, "meta-2"}]),
-    ok = rpc:call(SlaveNode1, syn, register, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, {recipient, TestPid, keepthis}]),
-    ok = rpc:call(SlaveNode2, syn, register, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, {recipient, TestPid, "meta-2"}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-confict-by-netsplit-custom", PidOn1, {recipient, TestPid, keepthis}]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-confict-by-netsplit-custom", PidOn2, {recipient, TestPid, "meta-2"}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, {recipient, TestPid, keepthis}]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, {recipient, TestPid, "meta-2"}]),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", normal},
-
-        {on_process_registered, SlaveNode1, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_registered, SlaveNode2, default, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", normal},
-        {on_process_registered, SlaveNode1, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
-        {on_process_registered, SlaveNode2, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", normal}
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", normal},
+
+        {on_process_registered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", normal},
+        {on_process_registered, SlaveNode1, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
+        {on_process_registered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1500,53 +1140,53 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     %% retrieve
     syn_test_suite_helper:assert_wait(
         {PidOn1, {recipient, TestPid, keepthis}},
-        fun() -> syn:lookup("proc-confict-by-netsplit-custom") end
+        fun() -> syn:lookup(scope_all, "proc-confict-by-netsplit-custom") end
     ),
     syn_test_suite_helper:assert_wait(
         {PidOn1, {recipient, TestPid, keepthis}},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-confict-by-netsplit-custom"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidOn1, {recipient, TestPid, keepthis}},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-confict-by-netsplit-custom"]) end
-    ),
-    1 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    1 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-    1 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom"]) end
+    ),
+    1 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    1 = syn:registry_count(scope_all, SlaveNode1),
+    0 = syn:registry_count(scope_all, SlaveNode2),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
     syn_test_suite_helper:assert_wait(
         {PidOn1, {recipient, TestPid, keepthis}},
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
     ),
     syn_test_suite_helper:assert_wait(
         {PidOn1, {recipient, TestPid, keepthis}},
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
     ),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [custom_scope_bc, SlaveNode2]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, node()]),
-    1 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [custom_scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_bc, SlaveNode2]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, node()]),
+    1 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_bc, SlaveNode2]),
 
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", syn_conflict_resolution},
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, syn_conflict_resolution},
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", syn_conflict_resolution},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, syn_conflict_resolution},
 
-        {on_process_unregistered, SlaveNode2, default, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", syn_conflict_resolution},
-        {on_process_registered, SlaveNode2, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, syn_conflict_resolution},
-        {on_process_unregistered, SlaveNode2, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", syn_conflict_resolution},
-        {on_process_registered, SlaveNode2, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, syn_conflict_resolution}
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom", PidOn2, "meta-2", syn_conflict_resolution},
+        {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, syn_conflict_resolution},
+        {on_process_unregistered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", syn_conflict_resolution},
+        {on_process_registered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, syn_conflict_resolution}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1561,38 +1201,38 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     ),
 
     %% clean up default scope
-    syn:unregister("proc-confict-by-netsplit-custom"),
-    ok = rpc:call(SlaveNode1, syn, unregister, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom"]),
+    syn:unregister(scope_all, "proc-confict-by-netsplit-custom"),
+    ok = rpc:call(SlaveNode1, syn, unregister, [scope_bc, "proc-confict-by-netsplit-scoped-custom"]),
 
     %% retrieve
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup("proc-confict-by-netsplit-custom") end
+        fun() -> syn:lookup(scope_all, "proc-confict-by-netsplit-custom") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-confict-by-netsplit-custom"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-confict-by-netsplit-custom"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, [custom_scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_bc, "proc-confict-by-netsplit-scoped-custom"]) end
     ),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_unregistered, SlaveNode1, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_unregistered, SlaveNode2, default, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
-        {on_process_unregistered, SlaveNode1, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
-        {on_process_unregistered, SlaveNode2, custom_scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom", PidOn1, keepthis, normal},
+        {on_process_unregistered, SlaveNode1, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
+        {on_process_unregistered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1604,17 +1244,17 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node()]),
 
     %% register with meta with no 'keepthis' element
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-confict-by-netsplit-custom-other-pid", PidOn1, {recipient, TestPid, "meta-1"}]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-confict-by-netsplit-custom-other-pid", PidOn2, {recipient, TestPid, "meta-2"}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, {recipient, TestPid, "meta-1"}]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, {recipient, TestPid, "meta-2"}]),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", normal},
 
-        {on_process_registered, SlaveNode1, default, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
-        {on_process_registered, SlaveNode2, default, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", normal}
+        {on_process_registered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1627,34 +1267,34 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     %% retrieve (names get freed)
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup("proc-confict-by-netsplit-custom-other-pid") end
+        fun() -> syn:lookup(scope_all, "proc-confict-by-netsplit-custom-other-pid") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-confict-by-netsplit-custom-other-pid"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom-other-pid"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-confict-by-netsplit-custom-other-pid"]) end
-    ),
-    0 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    0 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-    0 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom-other-pid"]) end
+    ),
+    0 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    0 = syn:registry_count(scope_all, SlaveNode1),
+    0 = syn:registry_count(scope_all, SlaveNode2),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", syn_conflict_resolution},
-        {on_process_unregistered, SlaveNode1, default, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", syn_conflict_resolution},
-        {on_process_unregistered, SlaveNode2, default, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", syn_conflict_resolution}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", syn_conflict_resolution},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", syn_conflict_resolution},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", syn_conflict_resolution}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1677,17 +1317,17 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     syn_test_suite_helper:assert_cluster(SlaveNode2, [node()]),
 
     %% register with meta with no 'crash' element
-    ok = rpc:call(SlaveNode1, syn, register, ["proc-confict-by-netsplit-custom-crash", PidOn1, {recipient, TestPid, crash}]),
-    ok = rpc:call(SlaveNode2, syn, register, ["proc-confict-by-netsplit-custom-crash", PidOn2, {recipient, TestPid, crash}]),
+    ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, {recipient, TestPid, crash}]),
+    ok = rpc:call(SlaveNode2, syn, register, [scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, {recipient, TestPid, crash}]),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
-        {on_process_registered, CurrentNode, default, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
+        {on_process_registered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, normal},
 
-        {on_process_registered, SlaveNode1, default, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
-        {on_process_registered, SlaveNode2, default, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, normal}
+        {on_process_registered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
+        {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, normal}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),
 
@@ -1700,34 +1340,34 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
     %% retrieve (names get freed)
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> syn:lookup("proc-confict-by-netsplit-custom-crash") end
+        fun() -> syn:lookup(scope_all, "proc-confict-by-netsplit-custom-crash") end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode1, syn, lookup, ["proc-confict-by-netsplit-custom-crash"]) end
+        fun() -> rpc:call(SlaveNode1, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom-crash"]) end
     ),
     syn_test_suite_helper:assert_wait(
         undefined,
-        fun() -> rpc:call(SlaveNode2, syn, lookup, ["proc-confict-by-netsplit-custom-crash"]) end
-    ),
-    0 = syn:registry_count(),
-    0 = syn:registry_count(default, node()),
-    0 = syn:registry_count(default, SlaveNode1),
-    0 = syn:registry_count(default, SlaveNode2),
-    0 = rpc:call(SlaveNode1, syn, registry_count, []),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode1, syn, registry_count, [default, SlaveNode2]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, []),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, node()]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode1]),
-    0 = rpc:call(SlaveNode2, syn, registry_count, [default, SlaveNode2]),
+        fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, "proc-confict-by-netsplit-custom-crash"]) end
+    ),
+    0 = syn:registry_count(scope_all),
+    0 = syn:registry_count(scope_all, node()),
+    0 = syn:registry_count(scope_all, SlaveNode1),
+    0 = syn:registry_count(scope_all, SlaveNode2),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode1, syn, registry_count, [scope_all, SlaveNode2]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, node()]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode1]),
+    0 = rpc:call(SlaveNode2, syn, registry_count, [scope_all, SlaveNode2]),
 
     %% check callbacks
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, CurrentNode, default, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, syn_conflict_resolution},
-        {on_process_unregistered, SlaveNode1, default, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, syn_conflict_resolution},
-        {on_process_unregistered, SlaveNode2, default, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, syn_conflict_resolution}
+        {on_process_unregistered, CurrentNode, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, syn_conflict_resolution},
+        {on_process_unregistered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, syn_conflict_resolution},
+        {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, syn_conflict_resolution}
     ]),
     syn_test_suite_helper:assert_empty_queue(self()),