Add modules
diff --git a/src/passage_mailbox_sup.erl b/src/passage_mailbox_sup.erl
index 61bc041..b0bbbe0 100644
--- a/src/passage_mailbox_sup.erl
+++ b/src/passage_mailbox_sup.erl
@@ -10,15 +10,20 @@
 
 -spec start_child(passage:tracer()) -> {ok, pid()} | {error, Reason :: term()}.
 start_child(Tracer) ->
-    Child = #{
-      id      => Tracer,
-      start   => {passage_mailbox, start_link, [Tracer]},
-      restart => permanent
-     },
+    Child = make_child_spec(Tracer),
     supervisor:start_child(?MODULE, Child).
 
 start_link() ->
     supervisor:start_link({local, ?MODULE}, ?MODULE, []).
 
 init([]) ->
-    {ok, {#{}, []}}.
+    Default = make_child_spec(passage_tracer:default_tracer()),
+    {ok, {#{}, [Default]}}.
+
+-spec make_child_spec(passage:tracer_id()) -> supervisor:child_spec().
+make_child_spec(Tracer) ->
+    #{
+       id      => Tracer,
+       start   => {passage_mailbox, start_link, [Tracer]},
+       restart => permanent
+     }.
diff --git a/src/passage_registry.erl b/src/passage_registry.erl
index 4ba0423..5e710e5 100644
--- a/src/passage_registry.erl
+++ b/src/passage_registry.erl
@@ -4,9 +4,9 @@
 
 -export([start_link/0]).
 
--export([get_default_tracer/0]).
 -export([get_sampler/1]).
 -export([get_tracer_module/1]). % TODO: get_tracer(?)
+-export([register_tracer/4]).
 
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
 
@@ -21,17 +21,28 @@
 start_link() ->
     gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
 
--spec get_default_tracer() -> passage:tracer().
-get_default_tracer() ->
-    error(unimplemented).
-
 -spec get_sampler(passage:tracer()) -> passage_sampler:sampler().
 get_sampler(Tracer) ->
-    error(unimplemented, [Tracer]).
+    try ets:lookup(?MODULE, {sampler, Tracer}) of
+        [{_, Sampler}] -> Sampler;
+        _              -> passage_sampler_null:new()
+    catch
+        error:badarg -> passage_sampler_null:new()
+    end.
 
 -spec get_tracer_module(passage:tracer()) -> module().
 get_tracer_module(Tracer) ->
-    error(unimplemented, [Tracer]).
+    try ets:lookup(?MODULE, {tracer, Tracer}) of
+        [{_, Tracer}] -> Tracer;
+        _             -> passage_tracer_null % TODO
+    catch
+        error:badarg -> passage_tracer_null
+    end.
+
+-spec register_tracer(passage:tracer_id(), module(), passage_sampler:sampler(), [passage_reporter:reporter()]) ->
+                             ok | {error, Reason :: term()}.
+register_tracer(TracerId, Module, Sampler, Reporters) ->
+    error(unimplemented, [TracerId, Module, Sampler, Reporters]).
 
 init([]) ->
     Table = ets:new(?MODULE, [named_table, protected, {read_concurrency, true}]),
diff --git a/src/passage_reporter.erl b/src/passage_reporter.erl
new file mode 100644
index 0000000..c1df8ae
--- /dev/null
+++ b/src/passage_reporter.erl
@@ -0,0 +1 @@
+-module(passage_reporter).
diff --git a/src/passage_sampler.erl b/src/passage_sampler.erl
index 4ff6665..aee9db4 100644
--- a/src/passage_sampler.erl
+++ b/src/passage_sampler.erl
@@ -1,11 +1,12 @@
 -module(passage_sampler).
 
+-export([new/2]).
 -export([is_sampled/4]).
 
 -export_type([sampler/0]).
 
 -callback is_sampled(term(), passage:tracer(), passage:operation_name(), passage:tags()) ->
-    bool.
+    boolean().
 
 -opaque sampler() :: {?MODULE, module(), term()}.
 
@@ -13,3 +14,7 @@
                         bool.
 is_sampled({?MODULE, Module, State}, Tracer, Name, Tags) ->
     Module:is_sampled(State, Tracer, Name, Tags).
+
+-spec new(module(), term()) -> sampler().
+new(Module, State) ->
+    {?MODULE, Module, State}.
diff --git a/src/passage_sampler_all.erl b/src/passage_sampler_all.erl
new file mode 100644
index 0000000..f4a5e52
--- /dev/null
+++ b/src/passage_sampler_all.erl
@@ -0,0 +1,14 @@
+-module(passage_sampler_all).
+
+-behaviour(passage_sampler).
+
+-export([new/0]).
+
+-export([is_sampled/4]).
+
+-spec new() -> passage_sampler:sampler().
+new() ->
+    passage_sampler:new(?MODULE, undefined).
+
+is_sampled(_State, _Tracer, _OperationName, _Tags) ->
+    true.
diff --git a/src/passage_sampler_null.erl b/src/passage_sampler_null.erl
new file mode 100644
index 0000000..57ab102
--- /dev/null
+++ b/src/passage_sampler_null.erl
@@ -0,0 +1,14 @@
+-module(passage_sampler_null).
+
+-behaviour(passage_sampler).
+
+-export([new/0]).
+
+-export([is_sampled/4]).
+
+-spec new() -> passage_sampler:sampler().
+new() ->
+    passage_sampler:new(?MODULE, undefined).
+
+is_sampled(_State, _Tracer, _OperationName, _Tags) ->
+    false.
diff --git a/src/passage_tracer.erl b/src/passage_tracer.erl
index 1d77266..400c354 100644
--- a/src/passage_tracer.erl
+++ b/src/passage_tracer.erl
@@ -1,13 +1,19 @@
 -module(passage_tracer).
 
+-export([start/2, start/3]).
 -export([default_tracer/0]).
 -export([get_sampler/1]).
 -export([make_span_context_state/2]).
 
+-export_type([start_option/0]).
+
+-type start_option() :: {sampler, passage_sampler:sampler()}
+                      | {reporters, [passage_reporter:reporter()]}.
+
 -callback make_span_context_state(passage_span:span(), passage:baggage_items()) ->
     passage_span_context:state().
 
-%% -callback inject_span_context(passage_span_context:context()) ->
+% -callback inject_span_context(passage_span_context:context()) ->
 %%     ok.
 %% -callback extract_span_context() ->
 %%     {ok, passage_span_context:context()} | error.
@@ -21,8 +27,21 @@
 
 -spec default_tracer() -> passage:tracer_id().
 default_tracer() ->
-    passage_registry:get_default_tracer().
+    default_tracer.
 
 -spec get_sampler(passage:tracer_id()) -> passage_sampler:sampler().
 get_sampler(Tracer) ->
     passage_registry:get_sampler(Tracer).
+
+-spec start(passage:tracer_id(), module()) -> ok | {error, Reason :: term()}.
+start(TracerId, Module) ->
+    start(TracerId, Module, []).
+
+-spec start(passage:tracer_id(), module(), [start_option()]) ->
+                   ok | {error, Reason :: term()}.
+start(TracerId, Module, Options) ->
+    Sampler = proplists:get_value(sampler, Options, passage_sampler_all:new()),
+    Reporters = proplists:get_value(reporters, Options, []),
+
+    %% TODO: s/passage_registry/passage_tracer_registry/
+    passage_registry:register_tracer(TracerId, Module, Sampler, Reporters).