diff --git a/lib/server/connection.ml b/lib/server/connection.ml
index c5c77ae..f6cafe5 100644
--- a/lib/server/connection.ml
+++ b/lib/server/connection.ml
@@ -1,6 +1,6 @@
 open! Import
 open Result_syntax
-type membership = Router.membership
+open Router_types
 
 include (val Logging.sublogs logger "Connection")
 
@@ -12,7 +12,7 @@ type t = {
   addr : sockaddr;
   outbox : Outbox.t;
   mutable activity : activity_state;
-  mutable user : User.t option;
+  mutable user : user option;
   mutable pending_nick : name option;
   mutable pending_userinfo : userinfo option;
 }
@@ -94,23 +94,23 @@ let usersdontmatch_get    = "502", ["Can't view mode for other users"]
 
 (* permission checking *)
 
-let require_registered t : User.t result =
+let require_registered t : user result =
   match t.user with
   | Some me -> Ok me
   | None -> Error notregistered
 
 let require_same_user user me =
-  if (user : User.t) == me then Ok () else Error usersdontmatch_get
+  if (user : user) == me then Ok () else Error usersdontmatch_get
 
 let require_membership chan me =
   match Router.membership chan me with
   | mem -> Ok mem
   | exception Not_found -> Error (notonchannel (Chan.name chan))
 
-let require_chan_op (m : membership) =
-  match m.mem_priv with
+let require_chan_op mem =
+  match mem.mem_priv with
   | Operator -> Ok ()
-  | _ -> Error (chanoprivsneeded (Chan.name m.mem_chan))
+  | _ -> Error (chanoprivsneeded (Chan.name mem.mem_chan))
 
 
 (* modes *)
@@ -162,7 +162,7 @@ let set_chan_limit chan ~from chg =
     Router.relay msg ~from [`to_chan chan; `to_self];
     Chan.set_limit chan limit
 
-let set_member_priv ~from (mem : membership) (priv : Router.priv) =
+let set_member_priv ~from mem priv =
   let user = mem.mem_user in
   let chan = mem.mem_chan in
   let modestr = match mem.mem_priv, priv with
@@ -339,9 +339,16 @@ let on_msg_away t status =
   set_away t me status;
   Ok ()
 
+let membership_prefix = function
+  | Normal -> ""
+  | Voice -> "+"
+  | Operator -> "@"
+
+let is_invisible user =
+  Mode.Set.mem `i (User.mode user)
+
 let list_names t me chan =
   let is_secret = Mode.Set.mem `s (Chan.mode chan) in
-  let is_invisible user = Mode.Set.mem `i (User.mode user) in
 
   let members =
     match Router.membership chan me with
@@ -351,15 +358,14 @@ let list_names t me chan =
         []
       else
         Chan.membership_when
-          (fun (m : membership) ->
-             not (is_invisible m.mem_user))
+          (fun mem -> not (is_invisible mem.mem_user))
           chan
   in
 
   let nicks =
     List.map
-      (fun (m : membership) ->
-         Router.membership_prefix m.mem_priv ^ User.nick m.mem_user)
+      (fun mem ->
+         membership_prefix mem.mem_priv ^ User.nick mem.mem_user)
       members
   in
 
@@ -461,7 +467,7 @@ let on_msg_join t name =
       Ok ()
     end
 
-let leave t (mem : membership) ~from ~why =
+let leave t mem ~from ~why =
   let user = mem.mem_user in
   let chan = mem.mem_chan in
   begin match why with
@@ -547,7 +553,7 @@ let user_who_flags user =
   end ^
   (* Optionally, the highest channel membership prefix that the client has in <channel>,
      if the client has one. *)
-  Router.membership_prefix (User.highest_membership_priv user)
+  membership_prefix (User.highest_membership_priv user)
 
 let list_who t chan users =
   let chan_str = match chan with
@@ -597,8 +603,8 @@ let list_whois t user =
 
     (* TODO: concat channel names until message becomes too long *)
     List.iter
-      (fun (m : membership) ->
-         let chan_str = Router.membership_prefix m.mem_priv ^ Chan.name m.mem_chan in
+      (fun mem ->
+         let chan_str = membership_prefix mem.mem_priv ^ Chan.name mem.mem_chan in
          reply t ("319", [nick; chan_str]))
       (User.membership user);
 
diff --git a/lib/server/router.ml b/lib/server/router.ml
index 2fd4a9e..a0ff8ac 100644
--- a/lib/server/router.ml
+++ b/lib/server/router.ml
@@ -55,11 +55,6 @@ let membership chan user =
   Dllist.find_node_l (fun mem -> mem.mem_chan == chan)
     user.membership |> Dllist.get
 
-let membership_prefix = function
-  | Normal -> ""
-  | Voice -> "+"
-  | Operator -> "@"
-
 let part mem =
   try
     Dllist.remove (Option.get mem.mem_in_user);