diff --git a/CHANGES.md b/CHANGES.md
index 1323296..52fb414 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -4,7 +4,8 @@
 
 ### Changed
 
-- Abstract the trait type constructors (PR, @mbarbin).
+- Upgrade to `provider.0.0.11` with breaking changes (PR, @mbarbin).
+- Abstract the trait type constructors (#42, @mbarbin).
 
 ### Deprecated
 
diff --git a/dune-project b/dune-project
index 969bca9..8dc4a55 100644
--- a/dune-project
+++ b/dune-project
@@ -42,7 +42,7 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))))
+   (>= 0.0.11))))
 
 (package
  (name vcs-base)
@@ -89,7 +89,7 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))
+   (>= 0.0.11))
   (vcs
    (= :version))))
 
@@ -187,7 +187,7 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))
+   (>= 0.0.11))
   (sexplib0
    (and
     (>= v0.17)
@@ -219,7 +219,7 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))
+   (>= 0.0.11))
   (sexplib0
    (and
     (>= v0.17)
@@ -327,7 +327,7 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))
+   (>= 0.0.11))
   (re
    (>= 1.8.0))
   (sexp_pretty
@@ -404,4 +404,4 @@
   (ppxlib
    (>= 0.33))
   (provider
-   (>= 0.0.8))))
+   (>= 0.0.11))))
diff --git a/lib/vcs/src/trait.ml b/lib/vcs/src/trait.ml
index fdbd6a4..607cfdd 100644
--- a/lib/vcs/src/trait.ml
+++ b/lib/vcs/src/trait.ml
@@ -25,10 +25,9 @@ and add_ty
 module Add = struct
   module type S = Trait_add.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Add : ('t, (module S with type t = 't), [> add ]) Provider.Trait.t
-
-  let t = Add
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type branch = [ `Branch of branch_ty ]
@@ -37,10 +36,9 @@ and branch_ty
 module Branch = struct
   module type S = Trait_branch.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Branch : ('t, (module S with type t = 't), [> branch ]) Provider.Trait.t
-
-  let t = Branch
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type commit = [ `Commit of commit_ty ]
@@ -49,10 +47,9 @@ and commit_ty
 module Commit = struct
   module type S = Trait_commit.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Commit : ('t, (module S with type t = 't), [> commit ]) Provider.Trait.t
-
-  let t = Commit
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type config = [ `Config of config_ty ]
@@ -61,10 +58,9 @@ and config_ty
 module Config = struct
   module type S = Trait_config.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Config : ('t, (module S with type t = 't), [> config ]) Provider.Trait.t
-
-  let t = Config
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type file_system = [ `File_system of file_system_ty ]
@@ -73,10 +69,9 @@ and file_system_ty
 module File_system = struct
   module type S = Trait_file_system.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | File_system : ('t, (module S with type t = 't), [> file_system ]) Provider.Trait.t
-
-  let t = File_system
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type git = [ `Git of git_ty ]
@@ -85,10 +80,9 @@ and git_ty
 module Git = struct
   module type S = Trait_git.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Git : ('t, (module S with type t = 't), [> git ]) Provider.Trait.t
-
-  let t = Git
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type init = [ `Init of init_ty ]
@@ -97,10 +91,9 @@ and init_ty
 module Init = struct
   module type S = Trait_init.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Init : ('t, (module S with type t = 't), [> init ]) Provider.Trait.t
-
-  let t = Init
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type log = [ `Log of log_ty ]
@@ -109,10 +102,9 @@ and log_ty
 module Log = struct
   module type S = Trait_log.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Log : ('t, (module S with type t = 't), [> log ]) Provider.Trait.t
-
-  let t = Log
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type ls_files = [ `Ls_files of ls_files_ty ]
@@ -121,10 +113,9 @@ and ls_files_ty
 module Ls_files = struct
   module type S = Trait_ls_files.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Ls_files : ('t, (module S with type t = 't), [> ls_files ]) Provider.Trait.t
-
-  let t = Ls_files
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type name_status = [ `Name_status of name_status_ty ]
@@ -133,10 +124,9 @@ and name_status_ty
 module Name_status = struct
   module type S = Trait_name_status.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Name_status : ('t, (module S with type t = 't), [> name_status ]) Provider.Trait.t
-
-  let t = Name_status
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type num_status = [ `Num_status of num_status_ty ]
@@ -145,10 +135,9 @@ and num_status_ty
 module Num_status = struct
   module type S = Trait_num_status.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Num_status : ('t, (module S with type t = 't), [> num_status ]) Provider.Trait.t
-
-  let t = Num_status
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type refs = [ `Refs of refs_ty ]
@@ -157,10 +146,9 @@ and refs_ty
 module Refs = struct
   module type S = Trait_refs.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Refs : ('t, (module S with type t = 't), [> refs ]) Provider.Trait.t
-
-  let t = Refs
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type rev_parse = [ `Rev_parse of rev_parse_ty ]
@@ -169,10 +157,9 @@ and rev_parse_ty
 module Rev_parse = struct
   module type S = Trait_rev_parse.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Rev_parse : ('t, (module S with type t = 't), [> rev_parse ]) Provider.Trait.t
-
-  let t = Rev_parse
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type show = [ `Show of show_ty ]
@@ -181,10 +168,9 @@ and show_ty
 module Show = struct
   module type S = Trait_show.S
 
-  type (_, _, _) Provider.Trait.t +=
-    | Show : ('t, (module S with type t = 't), [> show ]) Provider.Trait.t
-
-  let t = Show
+  include Provider.Trait.Create (struct
+      type 'a module_type = (module S with type t = 'a)
+    end)
 end
 
 type t =
diff --git a/lib/vcs/src/vcs.mli b/lib/vcs/src/vcs.mli
index 4b1cd06..da709f1 100644
--- a/lib/vcs/src/vcs.mli
+++ b/lib/vcs/src/vcs.mli
@@ -40,7 +40,7 @@ type -'a t = 'a Vcs0.t
 (** [create provider] returns a [vcs] that implements a given set of traits.
     Typical users do not use [create] directly, but rather will rely on an
     actual provider. See for example [Vcs_git_eio.create]. *)
-val create : 'a Provider.t -> 'a t
+val create : 'a Provider.packed -> 'a t
 
 (** {1 Error handling}
 
diff --git a/lib/vcs/src/vcs0.ml b/lib/vcs/src/vcs0.ml
index 0400a94..a567871 100644
--- a/lib/vcs/src/vcs0.ml
+++ b/lib/vcs/src/vcs0.ml
@@ -21,7 +21,7 @@
 
 open! Import
 
-type 'a t = 'a Provider.t
+type 'a t = 'a Provider.packed
 
 let create provider = provider
 
@@ -30,35 +30,35 @@ let of_result ~step = function
   | Error err -> raise (Exn0.E (Err.add_context err ~step:(Lazy.force step)))
 ;;
 
-let load_file (Provider.T { t; handler }) ~path =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.File_system.t) in
+let load_file (Provider.T { t; provider }) ~path =
+  let module M = (val Provider.lookup provider ~trait:Trait.File_system.t) in
   M.load_file t ~path
   |> of_result ~step:(lazy [%sexp "Vcs.load_file", { path : Absolute_path.t }])
 ;;
 
-let save_file ?perms (Provider.T { t; handler }) ~path ~file_contents =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.File_system.t) in
+let save_file ?perms (Provider.T { t; provider }) ~path ~file_contents =
+  let module M = (val Provider.lookup provider ~trait:Trait.File_system.t) in
   M.save_file ?perms t ~path ~file_contents
   |> of_result
        ~step:
          (lazy [%sexp "Vcs.save_file", { perms : int option; path : Absolute_path.t }])
 ;;
 
-let read_dir (Provider.T { t; handler }) ~dir =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.File_system.t) in
+let read_dir (Provider.T { t; provider }) ~dir =
+  let module M = (val Provider.lookup provider ~trait:Trait.File_system.t) in
   M.read_dir t ~dir
   |> of_result ~step:(lazy [%sexp "Vcs.read_dir", { dir : Absolute_path.t }])
 ;;
 
-let add (Provider.T { t; handler }) ~repo_root ~path =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Add.t) in
+let add (Provider.T { t; provider }) ~repo_root ~path =
+  let module M = (val Provider.lookup provider ~trait:Trait.Add.t) in
   M.add t ~repo_root ~path
   |> of_result
        ~step:(lazy [%sexp "Vcs.add", { repo_root : Repo_root.t; path : Path_in_repo.t }])
 ;;
 
-let init (Provider.T { t; handler }) ~path =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Init.t) in
+let init (Provider.T { t; provider }) ~path =
+  let module M = (val Provider.lookup provider ~trait:Trait.Init.t) in
   M.init t ~path |> of_result ~step:(lazy [%sexp "Vcs.init", { path : Absolute_path.t }])
 ;;
 
@@ -91,29 +91,29 @@ let find_enclosing_git_repo_root t ~from =
   | Some (`Git, repo_root) -> Some repo_root
 ;;
 
-let current_branch (Provider.T { t; handler }) ~repo_root =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Rev_parse.t) in
+let current_branch (Provider.T { t; provider }) ~repo_root =
+  let module M = (val Provider.lookup provider ~trait:Trait.Rev_parse.t) in
   M.current_branch t ~repo_root
   |> of_result ~step:(lazy [%sexp "Vcs.current_branch", { repo_root : Repo_root.t }])
 ;;
 
-let current_revision (Provider.T { t; handler }) ~repo_root =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Rev_parse.t) in
+let current_revision (Provider.T { t; provider }) ~repo_root =
+  let module M = (val Provider.lookup provider ~trait:Trait.Rev_parse.t) in
   M.current_revision t ~repo_root
   |> of_result ~step:(lazy [%sexp "Vcs.current_revision", { repo_root : Repo_root.t }])
 ;;
 
-let commit (Provider.T { t; handler }) ~repo_root ~commit_message =
-  let module R = (val Provider.Handler.lookup handler ~trait:Trait.Rev_parse.t) in
-  let module C = (val Provider.Handler.lookup handler ~trait:Trait.Commit.t) in
+let commit (Provider.T { t; provider }) ~repo_root ~commit_message =
+  let module R = (val Provider.lookup provider ~trait:Trait.Rev_parse.t) in
+  let module C = (val Provider.lookup provider ~trait:Trait.Commit.t) in
   (let open Result.Monad_syntax in
    let* () = C.commit t ~repo_root ~commit_message in
    R.current_revision t ~repo_root)
   |> of_result ~step:(lazy [%sexp "Vcs.commit", { repo_root : Repo_root.t }])
 ;;
 
-let ls_files (Provider.T { t; handler }) ~repo_root ~below =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Ls_files.t) in
+let ls_files (Provider.T { t; provider }) ~repo_root ~below =
+  let module M = (val Provider.lookup provider ~trait:Trait.Ls_files.t) in
   M.ls_files t ~repo_root ~below
   |> of_result
        ~step:
@@ -121,8 +121,8 @@ let ls_files (Provider.T { t; handler }) ~repo_root ~below =
            [%sexp "Vcs.ls_files", { repo_root : Repo_root.t; below : Path_in_repo.t }])
 ;;
 
-let rename_current_branch (Provider.T { t; handler }) ~repo_root ~to_ =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Branch.t) in
+let rename_current_branch (Provider.T { t; provider }) ~repo_root ~to_ =
+  let module M = (val Provider.lookup provider ~trait:Trait.Branch.t) in
   M.rename_current_branch t ~repo_root ~to_
   |> of_result
        ~step:
@@ -131,8 +131,8 @@ let rename_current_branch (Provider.T { t; handler }) ~repo_root ~to_ =
              "Vcs.rename_current_branch", { repo_root : Repo_root.t; to_ : Branch_name.t }])
 ;;
 
-let name_status (Provider.T { t; handler }) ~repo_root ~changed =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Name_status.t) in
+let name_status (Provider.T { t; provider }) ~repo_root ~changed =
+  let module M = (val Provider.lookup provider ~trait:Trait.Name_status.t) in
   M.diff t ~repo_root ~changed
   |> of_result
        ~step:
@@ -142,8 +142,8 @@ let name_status (Provider.T { t; handler }) ~repo_root ~changed =
              , { repo_root : Repo_root.t; changed : Name_status.Changed.t }])
 ;;
 
-let num_status (Provider.T { t; handler }) ~repo_root ~changed =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Num_status.t) in
+let num_status (Provider.T { t; provider }) ~repo_root ~changed =
+  let module M = (val Provider.lookup provider ~trait:Trait.Num_status.t) in
   M.diff t ~repo_root ~changed
   |> of_result
        ~step:
@@ -152,21 +152,21 @@ let num_status (Provider.T { t; handler }) ~repo_root ~changed =
              "Vcs.num_status", { repo_root : Repo_root.t; changed : Num_status.Changed.t }])
 ;;
 
-let log (Provider.T { t; handler }) ~repo_root =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Log.t) in
+let log (Provider.T { t; provider }) ~repo_root =
+  let module M = (val Provider.lookup provider ~trait:Trait.Log.t) in
   M.all t ~repo_root
   |> of_result ~step:(lazy [%sexp "Vcs.log", { repo_root : Repo_root.t }])
 ;;
 
-let refs (Provider.T { t; handler }) ~repo_root =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Refs.t) in
+let refs (Provider.T { t; provider }) ~repo_root =
+  let module M = (val Provider.lookup provider ~trait:Trait.Refs.t) in
   M.show_ref t ~repo_root
   |> of_result ~step:(lazy [%sexp "Vcs.refs", { repo_root : Repo_root.t }])
 ;;
 
-let graph (Provider.T { t; handler }) ~repo_root =
-  let module L = (val Provider.Handler.lookup handler ~trait:Trait.Log.t) in
-  let module R = (val Provider.Handler.lookup handler ~trait:Trait.Refs.t) in
+let graph (Provider.T { t; provider }) ~repo_root =
+  let module L = (val Provider.lookup provider ~trait:Trait.Log.t) in
+  let module R = (val Provider.lookup provider ~trait:Trait.Refs.t) in
   let graph = Graph.create () in
   (let open Result.Monad_syntax in
    let* log = L.all t ~repo_root in
@@ -177,8 +177,8 @@ let graph (Provider.T { t; handler }) ~repo_root =
   |> of_result ~step:(lazy [%sexp "Vcs.graph", { repo_root : Repo_root.t }])
 ;;
 
-let set_user_name (Provider.T { t; handler }) ~repo_root ~user_name =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Config.t) in
+let set_user_name (Provider.T { t; provider }) ~repo_root ~user_name =
+  let module M = (val Provider.lookup provider ~trait:Trait.Config.t) in
   M.set_user_name t ~repo_root ~user_name
   |> of_result
        ~step:
@@ -187,8 +187,8 @@ let set_user_name (Provider.T { t; handler }) ~repo_root ~user_name =
              "Vcs.set_user_name", { repo_root : Repo_root.t; user_name : User_name.t }])
 ;;
 
-let set_user_email (Provider.T { t; handler }) ~repo_root ~user_email =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Config.t) in
+let set_user_email (Provider.T { t; provider }) ~repo_root ~user_email =
+  let module M = (val Provider.lookup provider ~trait:Trait.Config.t) in
   M.set_user_email t ~repo_root ~user_email
   |> of_result
        ~step:
@@ -197,8 +197,8 @@ let set_user_email (Provider.T { t; handler }) ~repo_root ~user_email =
              "Vcs.set_user_email", { repo_root : Repo_root.t; user_email : User_email.t }])
 ;;
 
-let show_file_at_rev (Provider.T { t; handler }) ~repo_root ~rev ~path =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Show.t) in
+let show_file_at_rev (Provider.T { t; provider }) ~repo_root ~rev ~path =
+  let module M = (val Provider.lookup provider ~trait:Trait.Show.t) in
   M.show_file_at_rev t ~repo_root ~rev ~path
   |> of_result
        ~step:
@@ -221,12 +221,12 @@ let make_git_err_step ?env ?run_in_subdir ~repo_root ~args () =
 let non_raising_git
   ?env
   ?(run_in_subdir = Path_in_repo.root)
-  (Provider.T { t; handler })
+  (Provider.T { t; provider })
   ~repo_root
   ~args
   ~f
   =
-  let module M = (val Provider.Handler.lookup handler ~trait:Trait.Git.t) in
+  let module M = (val Provider.lookup provider ~trait:Trait.Git.t) in
   let cwd = Repo_root.append repo_root run_in_subdir in
   M.git ?env t ~cwd ~args ~f
 ;;
diff --git a/lib/vcs/src/vcs0.mli b/lib/vcs/src/vcs0.mli
index c17d411..9dc765e 100644
--- a/lib/vcs/src/vcs0.mli
+++ b/lib/vcs/src/vcs0.mli
@@ -21,7 +21,7 @@
 
 type -'a t
 
-val create : 'a Provider.t -> 'a t
+val create : 'a Provider.packed -> 'a t
 
 include Vcs_interface.S with type 'a t := 'a t and type 'a result := 'a
 
diff --git a/lib/vcs_git_blocking/src/vcs_git_blocking.ml b/lib/vcs_git_blocking/src/vcs_git_blocking.ml
index ce6f507..e49d3f1 100644
--- a/lib/vcs_git_blocking/src/vcs_git_blocking.ml
+++ b/lib/vcs_git_blocking/src/vcs_git_blocking.ml
@@ -27,4 +27,6 @@ module Impl = struct
   include Vcs_git_provider.Make (Runtime)
 end
 
-let create () = Vcs.create (Provider.T { t = Impl.create (); handler = Impl.handler () })
+let create () =
+  Vcs.create (Provider.T { t = Impl.create (); provider = Impl.provider () })
+;;
diff --git a/lib/vcs_git_eio/src/vcs_git_eio.ml b/lib/vcs_git_eio/src/vcs_git_eio.ml
index c6d4218..02cfd12 100644
--- a/lib/vcs_git_eio/src/vcs_git_eio.ml
+++ b/lib/vcs_git_eio/src/vcs_git_eio.ml
@@ -28,5 +28,5 @@ module Impl = struct
 end
 
 let create ~env =
-  Vcs.create (Provider.T { t = Impl.create ~env; handler = Impl.handler () })
+  Vcs.create (Provider.T { t = Impl.create ~env; provider = Impl.provider () })
 ;;
diff --git a/lib/vcs_git_provider/src/vcs_git_provider.ml b/lib/vcs_git_provider/src/vcs_git_provider.ml
index 7e842fe..0e25353 100644
--- a/lib/vcs_git_provider/src/vcs_git_provider.ml
+++ b/lib/vcs_git_provider/src/vcs_git_provider.ml
@@ -76,22 +76,22 @@ module Make (Runtime : Runtime.S) = struct
     module Show = Show.Make (Runtime)
   end
 
-  let handler () : (t, [> Trait.t ]) Provider.Handler.t =
-    Provider.Handler.make
-      [ Provider.Trait.implement Vcs.Trait.Add.t ~impl:(module Impl.Add)
-      ; Provider.Trait.implement Vcs.Trait.Branch.t ~impl:(module Impl.Branch)
-      ; Provider.Trait.implement Vcs.Trait.Commit.t ~impl:(module Impl.Commit)
-      ; Provider.Trait.implement Vcs.Trait.Config.t ~impl:(module Impl.Config)
-      ; Provider.Trait.implement Vcs.Trait.File_system.t ~impl:(module Impl.File_system)
-      ; Provider.Trait.implement Vcs.Trait.Git.t ~impl:(module Impl.Git)
-      ; Provider.Trait.implement Vcs.Trait.Init.t ~impl:(module Impl.Init)
-      ; Provider.Trait.implement Vcs.Trait.Log.t ~impl:(module Impl.Log)
-      ; Provider.Trait.implement Vcs.Trait.Ls_files.t ~impl:(module Impl.Ls_files)
-      ; Provider.Trait.implement Vcs.Trait.Name_status.t ~impl:(module Impl.Name_status)
-      ; Provider.Trait.implement Vcs.Trait.Num_status.t ~impl:(module Impl.Num_status)
-      ; Provider.Trait.implement Vcs.Trait.Refs.t ~impl:(module Impl.Refs)
-      ; Provider.Trait.implement Vcs.Trait.Rev_parse.t ~impl:(module Impl.Rev_parse)
-      ; Provider.Trait.implement Vcs.Trait.Show.t ~impl:(module Impl.Show)
+  let provider () : (t, [> Trait.t ]) Provider.t =
+    Provider.make
+      [ Provider.implement Vcs.Trait.Add.t ~impl:(module Impl.Add)
+      ; Provider.implement Vcs.Trait.Branch.t ~impl:(module Impl.Branch)
+      ; Provider.implement Vcs.Trait.Commit.t ~impl:(module Impl.Commit)
+      ; Provider.implement Vcs.Trait.Config.t ~impl:(module Impl.Config)
+      ; Provider.implement Vcs.Trait.File_system.t ~impl:(module Impl.File_system)
+      ; Provider.implement Vcs.Trait.Git.t ~impl:(module Impl.Git)
+      ; Provider.implement Vcs.Trait.Init.t ~impl:(module Impl.Init)
+      ; Provider.implement Vcs.Trait.Log.t ~impl:(module Impl.Log)
+      ; Provider.implement Vcs.Trait.Ls_files.t ~impl:(module Impl.Ls_files)
+      ; Provider.implement Vcs.Trait.Name_status.t ~impl:(module Impl.Name_status)
+      ; Provider.implement Vcs.Trait.Num_status.t ~impl:(module Impl.Num_status)
+      ; Provider.implement Vcs.Trait.Refs.t ~impl:(module Impl.Refs)
+      ; Provider.implement Vcs.Trait.Rev_parse.t ~impl:(module Impl.Rev_parse)
+      ; Provider.implement Vcs.Trait.Show.t ~impl:(module Impl.Show)
       ]
   ;;
 
diff --git a/lib/vcs_git_provider/src/vcs_git_provider.mli b/lib/vcs_git_provider/src/vcs_git_provider.mli
index 96ad891..bbf1c1a 100644
--- a/lib/vcs_git_provider/src/vcs_git_provider.mli
+++ b/lib/vcs_git_provider/src/vcs_git_provider.mli
@@ -70,7 +70,7 @@ end
 module Make (Runtime : Runtime.S) : sig
   type t = Runtime.t
 
-  val handler : unit -> (t, [> Trait.t ]) Provider.Handler.t
+  val provider : unit -> (t, [> Trait.t ]) Provider.t
 
   (** {1 Individual implementations} *)
 
diff --git a/vcs-base.opam b/vcs-base.opam
index 8c96e1a..1241009 100644
--- a/vcs-base.opam
+++ b/vcs-base.opam
@@ -21,7 +21,7 @@ depends: [
   "ppx_sexp_conv" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "vcs" {= version}
   "odoc" {with-doc}
 ]
diff --git a/vcs-git-blocking.opam b/vcs-git-blocking.opam
index b4ce3f1..31cba07 100644
--- a/vcs-git-blocking.opam
+++ b/vcs-git-blocking.opam
@@ -16,7 +16,7 @@ depends: [
   "ppx_sexp_conv" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "sexplib0" {>= "v0.17" & < "v0.18"}
   "vcs" {= version}
   "vcs-git-provider" {= version}
diff --git a/vcs-git-eio.opam b/vcs-git-eio.opam
index 35bcb8e..5293be5 100644
--- a/vcs-git-eio.opam
+++ b/vcs-git-eio.opam
@@ -16,7 +16,7 @@ depends: [
   "ppx_sexp_conv" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "sexplib0" {>= "v0.17" & < "v0.18"}
   "vcs" {= version}
   "vcs-git-provider" {= version}
diff --git a/vcs-test-helpers.opam b/vcs-test-helpers.opam
index ae86e60..789b33e 100644
--- a/vcs-test-helpers.opam
+++ b/vcs-test-helpers.opam
@@ -22,7 +22,7 @@ depends: [
   "ppx_sexp_conv" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "odoc" {with-doc}
 ]
 build: [
diff --git a/vcs-tests.opam b/vcs-tests.opam
index 4bf5cbe..cf12685 100644
--- a/vcs-tests.opam
+++ b/vcs-tests.opam
@@ -38,7 +38,7 @@ depends: [
   "ppx_sexp_message" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "re" {>= "1.8.0"}
   "sexp_pretty" {>= "v0.17" & < "v0.18"}
   "stdio" {>= "v0.17" & < "v0.18"}
diff --git a/vcs.opam b/vcs.opam
index 0a693f4..6ab8828 100644
--- a/vcs.opam
+++ b/vcs.opam
@@ -16,7 +16,7 @@ depends: [
   "ppx_sexp_conv" {>= "v0.17" & < "v0.18"}
   "ppx_sexp_value" {>= "v0.17" & < "v0.18"}
   "ppxlib" {>= "0.33"}
-  "provider" {>= "0.0.8"}
+  "provider" {>= "0.0.11"}
   "odoc" {with-doc}
 ]
 build: [