diff --git a/LICENSE.md b/LICENSE.md
index 7652f8c..36fd70c 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
 The MIT License
 
-Copyright (c) 2016--2020 Jane Street Group, LLC <opensource@janestreet.com>
+Copyright (c) 2016--2022 Jane Street Group, LLC <opensource@janestreet.com>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..fafdcae
--- /dev/null
+++ b/README.md
@@ -0,0 +1,8 @@
+# Standard IO Library for OCaml
+
+Stdio provides input/output functions for OCaml.  It re-exports the
+buffered channels of the stdlib distributed with OCaml but with some
+improvements.
+
+API documentation for the latest release can be found
+[here](https://ocaml.janestreet.com/ocaml-core/latest/doc/stdio/index.html).
diff --git a/README.org b/README.org
deleted file mode 100644
index ac492b3..0000000
--- a/README.org
+++ /dev/null
@@ -1,6 +0,0 @@
-
-* Standard IO Library for OCaml
-
-Stdio provides input/output functions for OCaml.  It re-exports the
-buffered channels of the stdlib distributed with OCaml but with some
-improvements.
diff --git a/debian/changelog b/debian/changelog
index ad9dd6d..bd42fd7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+ocaml-stdio (0.14.0+git20220708.0.cfacf67+ds-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sat, 27 Aug 2022 00:46:12 -0000
+
 ocaml-stdio (0.14.0-1) unstable; urgency=medium
 
   * New upstream release
diff --git a/src/dune b/src/dune
index dc5a9e2..5cb7e83 100644
--- a/src/dune
+++ b/src/dune
@@ -2,4 +2,6 @@
  (preprocess no_preprocessing)
  (lint
   (pps ppx_base -check-doc-comments -type-conv-keep-w32=impl
-   -apply=js_style,type_conv)))
\ No newline at end of file
+   -apply=js_style,type_conv)))
+
+(documentation)
\ No newline at end of file
diff --git a/src/import.ml b/src/import.ml
deleted file mode 100644
index fd58e39..0000000
--- a/src/import.ml
+++ /dev/null
@@ -1,4 +0,0 @@
-open! Base
-
-module Sexplib = Base.Exported_for_specific_uses.Sexplib
-module Ppx_sexp_conv_lib = Base.Exported_for_specific_uses.Ppx_sexp_conv_lib
diff --git a/src/in_channel.ml b/src/in_channel.ml
index a18c13b..2c1fd12 100644
--- a/src/in_channel.ml
+++ b/src/in_channel.ml
@@ -1,39 +1,35 @@
 open! Base
-open! Import
 
 type t = Caml.in_channel
 
 let equal (t1 : t) t2 = phys_equal t1 t2
-
-let seek   = Caml.LargeFile.seek_in
-let pos    = Caml.LargeFile.pos_in
+let seek = Caml.LargeFile.seek_in
+let pos = Caml.LargeFile.pos_in
 let length = Caml.LargeFile.in_channel_length
-
 let stdin = Caml.stdin
 
 let create ?(binary = true) file =
-  let flags = [Open_rdonly] in
+  let flags = [ Open_rdonly ] in
   let flags = if binary then Open_binary :: flags else flags in
   Caml.open_in_gen flags 0o000 file
 ;;
 
 let close = Caml.close_in
-
 let with_file ?binary file ~f = Exn.protectx (create ?binary file) ~f ~finally:close
 
-let may_eof f = try Some (f ()) with End_of_file -> None
+let may_eof f =
+  try Some (f ()) with
+  | End_of_file -> None
+;;
 
 let input t ~buf ~pos ~len = Caml.input t buf pos len
-let really_input t ~buf ~pos ~len =
-  may_eof (fun () -> Caml.really_input t buf pos len)
-let really_input_exn t ~buf ~pos ~len =
-  Caml.really_input t buf pos len
+let really_input t ~buf ~pos ~len = may_eof (fun () -> Caml.really_input t buf pos len)
+let really_input_exn t ~buf ~pos ~len = Caml.really_input t buf pos len
 let input_byte t = may_eof (fun () -> Caml.input_byte t)
 let input_char t = may_eof (fun () -> Caml.input_char t)
 let input_binary_int t = may_eof (fun () -> Caml.input_binary_int t)
 let unsafe_input_value t = may_eof (fun () -> Caml.input_value t)
 let input_buffer t buf ~len = may_eof (fun () -> Caml.Buffer.add_channel buf t len)
-
 let set_binary_mode = Caml.set_binary_mode_in
 
 let input_all t =
@@ -49,14 +45,14 @@ let input_all t =
 ;;
 
 let trim ~fix_win_eol line =
-  if fix_win_eol then begin
+  if fix_win_eol
+  then (
     let len = String.length line in
-    if len > 0
-    && Char.equal (String.get line (len - 1)) '\r'
+    if len > 0 && Char.equal (String.get line (len - 1)) '\r'
     then String.sub line ~pos:0 ~len:(len - 1)
-    else line
-  end
+    else line)
   else line
+;;
 
 let input_line ?(fix_win_eol = true) t =
   match may_eof (fun () -> Caml.input_line t) with
@@ -67,6 +63,7 @@ let input_line ?(fix_win_eol = true) t =
 let input_line_exn ?(fix_win_eol = true) t =
   let line = Caml.input_line t in
   trim ~fix_win_eol line
+;;
 
 let fold_lines ?fix_win_eol t ~init ~f =
   let rec loop ac =
@@ -78,8 +75,7 @@ let fold_lines ?fix_win_eol t ~init ~f =
 ;;
 
 let input_lines ?fix_win_eol t =
-  List.rev
-    (fold_lines ?fix_win_eol t ~init:[] ~f:(fun lines line -> line :: lines))
+  List.rev (fold_lines ?fix_win_eol t ~init:[] ~f:(fun lines line -> line :: lines))
 ;;
 
 let iter_lines ?fix_win_eol t ~f =
@@ -87,5 +83,4 @@ let iter_lines ?fix_win_eol t ~f =
 ;;
 
 let read_lines ?fix_win_eol fname = with_file fname ~f:(input_lines ?fix_win_eol)
-
 let read_all fname = with_file fname ~f:input_all
diff --git a/src/in_channel.mli b/src/in_channel.mli
index c7a7603..8254353 100644
--- a/src/in_channel.mli
+++ b/src/in_channel.mli
@@ -9,7 +9,6 @@
 *)
 
 open! Base
-open! Import
 
 type t = Caml.in_channel
 
@@ -27,16 +26,19 @@ val create : ?binary:bool (** defaults to [true] *) -> string -> t
     [fname], and closes it afterwards. *)
 val with_file : ?binary:bool (** defaults to [true] *) -> string -> f:(t -> 'a) -> 'a
 
+
 (** [close t] closes [t], or does nothing if [t] is already closed, and may raise an
     exception. *)
 val close : t -> unit
 
 val input : t -> buf:bytes -> pos:int -> len:int -> int
-val really_input     : t -> buf:bytes -> pos:int -> len:int -> unit option
+
+val really_input : t -> buf:bytes -> pos:int -> len:int -> unit option
 
 (** Same as [Pervasives.really_input], for backwards compatibility *)
 val really_input_exn : t -> buf:bytes -> pos:int -> len:int -> unit
 
+
 (** Read one character from the given input channel.  Return [None] if there are no more
     characters to read. *)
 val input_char : t -> char option
@@ -53,6 +55,7 @@ val input_binary_int : t -> int option
 (** Ocaml's built-in marshal format *)
 val unsafe_input_value : t -> _ option
 
+
 (** [input_buffer t buf ~len] reads at most [len] characters from the input channel [t]
     and stores them at the end of buffer [buf].  Return [None] if the channel contains
     fewer than [len] characters. In this case, the characters are still added to the
@@ -65,7 +68,8 @@ val input_all : t -> string
     the newline ("\n") character at the end, and, if [fix_win_eol] the trailing
     "\r\n" is dropped.
 *)
-val input_line     : ?fix_win_eol:bool (** defaults to [true] *) -> t -> string option
+val input_line : ?fix_win_eol:bool (** defaults to [true] *) -> t -> string option
+
 val input_line_exn : ?fix_win_eol:bool (** defaults to [true] *) -> t -> string
 
 (** [fold_lines ?fix_win_eol t ~init ~f] folds over the lines read from [t]
diff --git a/src/out_channel.ml b/src/out_channel.ml
index c1f3a55..c544c98 100644
--- a/src/out_channel.ml
+++ b/src/out_channel.ml
@@ -1,14 +1,11 @@
 open! Base
-open! Import
 
 type t = Caml.out_channel
 
 let equal (t1 : t) t2 = phys_equal t1 t2
-
-let seek   = Caml.LargeFile.seek_out
-let pos    = Caml.LargeFile.pos_out
+let seek = Caml.LargeFile.seek_out
+let pos = Caml.LargeFile.pos_out
 let length = Caml.LargeFile.out_channel_length
-
 let stdout = Caml.stdout
 let stderr = Caml.stderr
 
@@ -21,27 +18,26 @@ let sexp_of_t t =
 ;;
 
 type 'a with_create_args =
-  ?binary:bool
-  -> ?append:bool
-  -> ?fail_if_exists:bool
-  -> ?perm:int
-  -> 'a
-
-let create ?(binary = true) ?(append = false) ?(fail_if_exists = false) ?(perm = 0o666) file =
-  let flags = [Open_wronly; Open_creat] in
+  ?binary:bool -> ?append:bool -> ?fail_if_exists:bool -> ?perm:int -> 'a
+
+let create
+      ?(binary = true)
+      ?(append = false)
+      ?(fail_if_exists = false)
+      ?(perm = 0o666)
+      file
+  =
+  let flags = [ Open_wronly; Open_creat ] in
   let flags = (if binary then Open_binary else Open_text) :: flags in
   let flags = (if append then Open_append else Open_trunc) :: flags in
-  let flags = (if fail_if_exists then Open_excl :: flags else flags) in
+  let flags = if fail_if_exists then Open_excl :: flags else flags in
   Caml.open_out_gen flags perm file
 ;;
 
 let set_binary_mode = Caml.set_binary_mode_out
-
 let flush = Caml.flush
-
 let close = Caml.close_out
 let close_no_err = Caml.close_out_noerr
-
 let output t ~buf ~pos ~len = Caml.output t buf pos len
 let output_substring t ~buf ~pos ~len = Caml.output_substring t buf pos len
 let output_string = Caml.output_string
@@ -51,18 +47,18 @@ let output_byte = Caml.output_byte
 let output_binary_int = Caml.output_binary_int
 let output_buffer = Caml.Buffer.output_buffer
 let output_value = Caml.output_value
-
 let newline t = output_string t "\n"
 
 let output_lines t lines =
-  List.iter lines ~f:(fun line -> output_string t line; newline t)
+  List.iter lines ~f:(fun line ->
+    output_string t line;
+    newline t)
 ;;
 
-let printf   = Caml.Printf.printf
-let eprintf  = Caml.Printf.eprintf
-let fprintf  = Caml.Printf.fprintf
+let printf = Caml.Printf.printf
+let eprintf = Caml.Printf.eprintf
+let fprintf = Caml.Printf.fprintf
 let kfprintf = Caml.Printf.kfprintf
-
 let print_string = Caml.print_string
 let print_endline = Caml.print_endline
 let prerr_endline = Caml.prerr_endline
@@ -71,21 +67,19 @@ let print_s ?mach sexp =
   print_endline
     (match mach with
      | Some () -> Sexp.to_string_mach sexp
-     | None    -> Sexp.to_string_hum  sexp)
+     | None -> Sexp.to_string_hum sexp)
 ;;
 
 let eprint_s ?mach sexp =
   prerr_endline
     (match mach with
      | Some () -> Sexp.to_string_mach sexp
-     | None    -> Sexp.to_string_hum  sexp)
+     | None -> Sexp.to_string_hum sexp)
 ;;
 
-
 let with_file ?binary ?append ?fail_if_exists ?perm file ~f =
   Exn.protectx (create ?binary ?append ?fail_if_exists ?perm file) ~f ~finally:close
 ;;
 
 let write_lines file lines = with_file file ~f:(fun t -> output_lines t lines)
-
 let write_all file ~data = with_file file ~f:(fun t -> output_string t data)
diff --git a/src/out_channel.mli b/src/out_channel.mli
index 52b61e3..b39c518 100644
--- a/src/out_channel.mli
+++ b/src/out_channel.mli
@@ -13,12 +13,16 @@
 *)
 
 open! Base
-open! Import
 
 type t = Caml.out_channel [@@deriving_inline sexp_of]
-include
-  sig [@@@ocaml.warning "-32"] val sexp_of_t : t -> Ppx_sexp_conv_lib.Sexp.t
-  end[@@ocaml.doc "@inline"]
+
+include sig
+  [@@@ocaml.warning "-32"]
+
+  val sexp_of_t : t -> Sexplib0.Sexp.t
+end
+[@@ocaml.doc "@inline"]
+
 [@@@end]
 
 include Equal.S with type t := t
@@ -27,13 +31,12 @@ val stdout : t
 val stderr : t
 
 type 'a with_create_args =
-  ?binary:bool            (** defaults to [true] *)
-  -> ?append:bool         (** defaults to [false] *)
+  ?binary:bool (** defaults to [true] *)
+  -> ?append:bool (** defaults to [false] *)
   -> ?fail_if_exists:bool (** defaults to [false] *)
   -> ?perm:int
   -> 'a
 
-
 val create : (string -> t) with_create_args
 val with_file : (string -> f:(t -> 'a) -> 'a) with_create_args
 
@@ -64,9 +67,7 @@ val close : t -> unit
 val close_no_err : t -> unit
 
 val set_binary_mode : t -> bool -> unit
-
 val flush : t -> unit
-
 val output : t -> buf:bytes -> pos:int -> len:int -> unit
 val output_string : t -> string -> unit
 val output_substring : t -> buf:string -> pos:int -> len:int -> unit
@@ -75,7 +76,9 @@ val output_char : t -> char -> unit
 val output_byte : t -> int -> unit
 val output_binary_int : t -> int -> unit
 val output_buffer : t -> Buffer.t -> unit
-val output_value : t -> _ -> unit  (** OCaml's internal Marshal format *)
+
+(** OCaml's internal Marshal format *)
+val output_value : t -> _ -> unit
 
 val newline : t -> unit
 
@@ -93,11 +96,11 @@ val printf : ('a, t, unit) format -> 'a
 
 (** [print_s sexp] outputs [sexp] on [stdout], by default using [Sexp.to_string_hum],
     or, with [~mach:()], [Sexp.to_string_mach]. *)
-val print_s : ?mach : unit -> Sexp.t -> unit
+val print_s : ?mach:unit -> Sexp.t -> unit
 
 (** [eprint_s sexp] outputs [sexp] on [stderr], by default using [Sexp.to_string_hum],
     or, with [~mach:()], [Sexp.to_string_mach]. *)
-val eprint_s : ?mach : unit -> Sexp.t -> unit
+val eprint_s : ?mach:unit -> Sexp.t -> unit
 
 (** [eprintf fmt] is the same as [fprintf stderr fmt] *)
 val eprintf : ('a, t, unit) format -> 'a
@@ -123,7 +126,7 @@ val length : t -> int64
 
 (** The first argument of these is the file name to write to. *)
 val write_lines : string -> string list -> unit
-val write_all : string -> data:string -> unit
 
+val write_all : string -> data:string -> unit
 
 
diff --git a/src/stdio.ml b/src/stdio.ml
index b33f377..35bd892 100644
--- a/src/stdio.ml
+++ b/src/stdio.ml
@@ -1,17 +1,14 @@
 open! Base
-open! Import
-
-module In_channel  = In_channel
+module In_channel = In_channel
 module Out_channel = Out_channel
 
-let stdin  = In_channel.stdin
+let stdin = In_channel.stdin
 let stdout = Out_channel.stdout
 let stderr = Out_channel.stderr
-
-let eprintf       = Out_channel.eprintf
-let printf        = Out_channel.printf
-let print_s       = Out_channel.print_s
-let eprint_s      = Out_channel.eprint_s
-let print_string  = Out_channel.print_string
+let eprintf = Out_channel.eprintf
+let printf = Out_channel.printf
+let print_s = Out_channel.print_s
+let eprint_s = Out_channel.eprint_s
+let print_string = Out_channel.print_string
 let print_endline = Out_channel.print_endline
 let prerr_endline = Out_channel.prerr_endline
diff --git a/src/stdio.mli b/src/stdio.mli
index bb59596..8222640 100644
--- a/src/stdio.mli
+++ b/src/stdio.mli
@@ -1,7 +1,5 @@
 open! Base
-open! Import
-
-module In_channel  = In_channel
+module In_channel = In_channel
 module Out_channel = Out_channel
 
 (** Same as {!In_channel.stdin} *)
@@ -17,10 +15,10 @@ val stderr : Out_channel.t
 val printf : ('a, Out_channel.t, unit) format -> 'a
 
 (** Same as {!Out_channel.print_s} *)
-val print_s : ?mach : unit -> Sexp.t -> unit
+val print_s : ?mach:unit -> Sexp.t -> unit
 
 (** Same as {!Out_channel.eprint_s} *)
-val eprint_s : ?mach : unit -> Sexp.t -> unit
+val eprint_s : ?mach:unit -> Sexp.t -> unit
 
 (** Same as {!Out_channel.eprintf} *)
 val eprintf : ('a, Out_channel.t, unit) format -> 'a
diff --git a/stdio.opam b/stdio.opam
index d0fe107..fa52a03 100644
--- a/stdio.opam
+++ b/stdio.opam
@@ -1,7 +1,6 @@
 opam-version: "2.0"
-version: "v0.14.0"
-maintainer: "opensource@janestreet.com"
-authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]
+maintainer: "Jane Street developers"
+authors: ["Jane Street Group, LLC"]
 homepage: "https://github.com/janestreet/stdio"
 bug-reports: "https://github.com/janestreet/stdio/issues"
 dev-repo: "git+https://github.com/janestreet/stdio.git"
@@ -11,9 +10,9 @@ build: [
   ["dune" "build" "-p" name "-j" jobs]
 ]
 depends: [
-  "ocaml" {>= "4.04.2"}
-  "base"  {>= "v0.14" & < "v0.15"}
-  "dune"  {>= "2.0.0"}
+  "ocaml" {>= "4.08.0"}
+  "base"
+  "dune" {>= "2.0.0"}
 ]
 synopsis: "Standard IO library for OCaml"
 description: "