diff --git a/CHANGES b/CHANGES
index 75d7feb9445798a8f15c3ca42a9c6372f0f16972..fc5102485f3fbec2147bbd379f295b855ef616b4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+## Release 0.3.1
+  * Add lower bounds for dependencies
+  * Attach tests to corresponding packages
+
 ## Release 0.3
 
 initial release
diff --git a/Makefile b/Makefile
index 512fea8d72c6519815983f67d2c14a4a4f5d7366..dc7dc5a5448e714e0106fde0366690791a7420a6 100644
--- a/Makefile
+++ b/Makefile
@@ -133,19 +133,32 @@ headers:
 clean:
 	dune clean --root=$$(pwd)
 
-PACKAGE_URL="https://git.frama-c.com/api/v4/projects/879/packages/generic/colibri2/$(TAG)/colibri2-$(TAG).tbz"
-DESCRIPTION="$(shell git show --format=%B --no-patch $(TAG) | tail -n+4)"
+PROJECT_ID=879
+PACKAGE_URL="https://git.frama-c.com/api/v4/projects/$(PROJECT_ID)/packages/generic/colibri2/$(TAG)/colibri2-$(TAG).tbz"
+DESCRIPTION="$(shell git show --format=%B --no-patch $(TAG) | tail -n+4 | perl -pe 's/\n/\\n/')"
+
+descr:
+	echo $(DESCRIPTION)
 
 release:
+	@echo "Have you checked CHANGES for $(TAG) (y/n)?"
+	@read yesno; test "$$yesno" = y
+	dune-release tag $(TAG)
+	dune-release distrib --no-build
 	curl --header "PRIVATE-TOKEN: $(GITLAB_TOKEN)" \
 	--upload-file _build/colibri2-$(TAG).tbz \
 	$(PACKAGE_URL)
 	echo $(PACKAGE_URL) > _build/asset-$(TAG).url
+	git push origin $(TAG)
+
+RELEASE_JSON=_build/release.json
 
-#Doesn't yet work, it should be created by hand.
 release2:
-	gitlab-release-cli --debug --server-url http://git.frama-c.com/ --project-id	\
-	879 --private-token $(GITLAB_TOKEN) create --ref $(shell git rev-parse	\
-	$(TAG)) --tag-name $(TAG) --name $(TAG) --description $(DESCRIPTION)	\
-	--assets-link='{"name": "release 0.3", "url":$(PACKAGE_URL), "type": "other", "filepath": "colibri2-$(TAG).tbz" }'
+	curl --header 'Content-Type: application/json' --header "PRIVATE-TOKEN:	\
+	$(GITLAB_TOKEN)" --request POST						\
+	"https://gitlab.example.com/api/v4/projects/$(PROJECT_ID)/releases" --data		\
+	'{"name": "Release $(TAG)","tag_name": "$(TAG)", "description":		\
+	$(DESCRIPTION), "milestones": [], "assets": { "links": [{ "name":	\
+	"colibri2-$(TAG).tbz", "url": "$(PACKAGE_URL)", "filepath":		\
+	"colibri2-$(TAG).tbz", "link_type":"other" }] } }'
 
diff --git a/colibri2.opam b/colibri2.opam
index cf8f6dc451e06553ec0cd973fac6146b6a239b3f..25c12aaac5e8e1205c0430fa7c2638d3fc73379c 100644
--- a/colibri2.opam
+++ b/colibri2.opam
@@ -5,9 +5,9 @@ description: "A reimplementation of COLIBRI in OCaml"
 maintainer: ["François Bobot"]
 authors: [
   "François Bobot"
+  "Bruno Marre"
   "Guillaume Bury"
   "Stéphane Graham-Lengrand"
-  "Bruno Marre"
 ]
 license: "LGPL-3.0-only"
 homepage: "https://colibri.frama-c.com"
@@ -23,17 +23,17 @@ depends: [
   "gen" {>= "0.5.3"}
   "dune" {>= "3.0"}
   "dune-build-info"
-  "zarith"
-  "ppx_deriving" {> "4.1.5"}
-  "ppx_optcomp"
-  "ppx_hash"
-  "ocamlgraph"
-  "qcheck-core"
+  "zarith" {>= "1.12"}
+  "ppx_deriving" {>= "5.2.1"}
+  "ppx_optcomp" {>= "v0.14.3"}
+  "ppx_hash" {>= "v0.14.0"}
+  "ocamlgraph" {>= "2.0.0"}
+  "qcheck-core" {>= "0.18.1"}
   "calcium"
   "farith"
-  "ounit2" {with-test}
+  "ounit2" {"2.2.4" >= with-test}
   "ocaml" {>= "4.08"}
-  "ocplib-simplex"
+  "ocplib-simplex" {>= "0.4"}
   "odoc" {with-doc}
 ]
 build: [
diff --git a/colibrics.opam b/colibrics.opam
index 049ada9e456f6ce828a6f3b433b3ceb69c5d1746..7f6575a174ffe9174053e70b16600b6ddb72bb4b 100644
--- a/colibrics.opam
+++ b/colibrics.opam
@@ -7,18 +7,18 @@ authors: ["François Bobot"]
 homepage: "https://colibri.frama-c.com"
 bug-reports: "https://git.frama-c.com/pub/colibrics/issues"
 depends: [
-  "ppx_deriving_yojson"
+  "ppx_deriving_yojson" {>= "3.6.1"}
   "dolmen" {>= "0.5~dev"}
   "dolmen_type" {>= "0.5~dev"}
   "dolmen_loop" {>= "0.5~dev"}
   "dune" {>= "3.0"}
-  "zarith"
+  "zarith" {>= "1.12"}
   "cmdliner" {= "1.0.4"}
   "ocaml" {>= "4.08"}
   "core" {>= "v0.14.1"}
-  "jingoo"
-  "logs"
-  "why3"
+  "jingoo" {>= "1.4.4"}
+  "logs" {>= "0.7.0"}
+  "why3" {>= "1.4.0"}
   "odoc" {with-doc}
 ]
 build: [
diff --git a/colibrilib.opam b/colibrilib.opam
index 7ac3e7b5e450b4aaeb38f91fd78e8aa69bba6541..4ff94609c1fc09d86e1cc468cf0f74e8143b43e3 100644
--- a/colibrilib.opam
+++ b/colibrilib.opam
@@ -8,7 +8,7 @@ homepage: "https://colibri.frama-c.com"
 bug-reports: "https://git.frama-c.com/pub/colibrics/issues"
 depends: [
   "dune" {>= "3.0"}
-  "zarith"
+  "zarith" {>= "1.12"}
   "odoc" {with-doc}
 ]
 build: [
diff --git a/dune-project b/dune-project
index 4b87f28dd77dd797a60fb22b4c1063040e61a9f0..19dc3db38e6c37228971ed4b56ca94a9c0e9c801 100644
--- a/dune-project
+++ b/dune-project
@@ -17,17 +17,18 @@
   (synopsis "A CP solver proved in Why3")
   (description "The core of Colibrics is formally proved using Why3.")
   (depends
-    "ppx_deriving_yojson"
+    ("ppx_deriving_yojson" (>= "3.6.1"))
     ("dolmen" (>= "0.5~dev"))
     ("dolmen_type" (>= "0.5~dev"))
     ("dolmen_loop" (>= "0.5~dev"))
     "dune"
-    "zarith"
+    ("zarith" (>= "1.12"))
     ("cmdliner" (= 1.0.4))
     ("ocaml" (>= "4.08"))
     ("core" (>= "v0.14.1"))
-    "jingoo" "logs"
-    "why3"
+    ("jingoo" (>= "1.4.4"))
+    ("logs" (>= "0.7.0"))
+    ("why3" (>= "1.4.0"))
   )
 )
 
@@ -38,7 +39,7 @@
   (synopsis "A library of domains and propagators proved in Why3")
   (description "Interval, and union of interval domains defined formally")
   (depends
-    "zarith"
+    ("zarith" (>= "1.12"))
   )
 )
 
@@ -60,17 +61,17 @@
            ("gen" (>= 0.5.3))
            "dune"
            "dune-build-info"
-           "zarith"
-           ("ppx_deriving" (> "4.1.5"))
-           "ppx_optcomp"
-           "ppx_hash"
-           "ocamlgraph"
-           "qcheck-core"
+           ("zarith" (>= "1.12"))
+           ("ppx_deriving" (>= "5.2.1"))
+           ("ppx_optcomp" (>= "v0.14.3"))
+           ("ppx_hash" (>= "v0.14.0"))
+           ("ocamlgraph" (>= "2.0.0"))
+           ("qcheck-core" (>= "0.18.1"))
            ; ("ppx_deriving_qcheck" (>= 0.2.0))
            "calcium"
            "farith"
-           ("ounit2" :with-test)
+           ("ounit2" (>= "2.2.4" :with-test))
           ("ocaml" (>= "4.08"))
-           "ocplib-simplex"
+           ("ocplib-simplex" (>= "0.4"))
          )
 )