diff --git a/Makefile b/Makefile
index 079925659e6fe0fe70e989da896ef11aa2f7af1c..8f2a976ccdb5aed709feab73badb4728cc803144 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,8 @@
+# Process flags
+ifeq ($(Y), 1)
+	YFLAG=-y
+endif
+
 # Determine Coq version
 COQ_VERSION=$(shell coqc --version | egrep -o 'version 8.[0-9]' | egrep -o '8.[0-9]')
 COQ_MAKEFILE_FLAGS ?=
@@ -27,9 +32,10 @@ Makefile.coq: _CoqProject Makefile
 
 # Install build-dependencies
 build-dep:
-	cat opam.pins | build/opam-pins.sh
+	build/opam-pins.sh < opam.pins
 	opam pin add coq-lambda-rust "$$(pwd)#HEAD" -k git -n -y
-	opam install coq-lambda-rust --deps-only -y
+	opam upgrade $(YFLAG) # it is not nice that we upgrade *all* packages here, but I found no nice way to upgrade only those that we pinned
+	opam install coq-lambda-rust --deps-only $(YLFAG)
 
 # some fiels that do *not* need to be forwarded to Makefile.coq
 Makefile: ;
diff --git a/build/opam-ci.sh b/build/opam-ci.sh
index 35117dafd931f62f4fb7ded5fea7a5a6bda8c0ad..fbf91d658197fee4e4b7f7fdbb673fb3617999ab 100755
--- a/build/opam-ci.sh
+++ b/build/opam-ci.sh
@@ -26,7 +26,7 @@ done
 
 # Install build-dependencies
 echo
-make build-dep
+make build-dep Y=1
 
 # done
 echo
diff --git a/build/opam-pins.sh b/build/opam-pins.sh
index d08fb314e5b865d0d56c88c159d46863247d39b9..aebd23ca2589992274146d8c37ebd2eb7489ac31 100755
--- a/build/opam-pins.sh
+++ b/build/opam-pins.sh
@@ -1,52 +1,17 @@
 #!/bin/bash
 set -e
-## Process an opam.pins file from stdin: Apply the pins and install the packages.
-## Usage:  (Arguments have to be given in the given order!)
-##   ./opam-pins.sh [--recursive]
-## Arguments:
-##   -- recursive    This is a recurisve call of the script to itself
-##                   (you should not pass this argument yourself manually).
-
-
-# Parse arguments
-if [[ "$1" == "--recursive" ]]; then
-    shift
-    IS_TOPLEVEL=0
-else
-    # We are the toplevel call. Record the old pin state.
-    IS_TOPLEVEL=1
-    OLD_PINS="$(mktemp)"
-    opam pin list > "$OLD_PINS"
-fi
-
-if [[ "$1" == "-n" ]]; then
-    shift
-    NFLAG="-n"
-else
-    NFLAG=""
-fi
+## Process an opam.pins file from stdin: Add all the given pins, but don't install anything.
+## Usage:
+##   ./opam-pins.sh < opam.pins
 
 # Process stdin
-while read PACKAGE PIN; do
-    if echo "$PIN" | egrep '^https://gitlab\.mpi-sws\.org' > /dev/null; then
+while read PACKAGE URL HASH; do
+    if echo "$URL" | egrep '^https://gitlab\.mpi-sws\.org' > /dev/null; then
+        echo "[opam-pins] Recursing into $URL"
         # an MPI URL -- try doing recursive pin processing
-        URL=$(echo "$PIN" | sed 's|#|/raw/|')/opam.pins
-        curl -f "$URL" 2> /dev/null | "$0" --recursive
+        curl -f "$URL/raw/$HASH" 2> /dev/null | "$0"
     fi
-    echo "[opam-pins] Applying pin: $PACKAGE -> $PIN"
-    opam pin add "$PACKAGE" "$PIN" -k git -y -n
+    echo "[opam-pins] Applying pin: $PACKAGE -> $URL#$HASH"
+    opam pin add "$PACKAGE.dev.$HASH" "$URL#$HASH" -k git -y -n
     echo
 done
-
-# If we are the toplevel call, see what pins changed and reinstall if necessary
-if [[ "$IS_TOPLEVEL" == "1" ]]; then
-    NEW_PINS="$(mktemp)"
-    opam pin list > "$NEW_PINS"
-    # Compare the pin lists and filter for the changed package names
-    PACKAGES=$(diff -u0 "$OLD_PINS" "$NEW_PINS" | egrep '^[+][^+]' | sed 's/+\([a-z0-9-]\+\)[ .].*$/\1/')
-    if [[ -n "$PACKAGES" ]]; then
-        echo "[opam-pins] Reinstalling packages:" $PACKAGES
-        opam reinstall $PACKAGES -y
-    fi
-    rm "$OLD_PINS" "$NEW_PINS"
-fi
diff --git a/opam.pins b/opam.pins
index db57c918bc869777bdadec2782a242d2c49604bf..a75ec042bf75e544b364bb4b9357456667e9c194 100644
--- a/opam.pins
+++ b/opam.pins
@@ -1 +1 @@
-coq-iris https://gitlab.mpi-sws.org/FP/iris-coq#e5a3be94012cb4b61ca7d199e39ab026095eb51e
+coq-iris https://gitlab.mpi-sws.org/FP/iris-coq 4417beb8bfa43f89c09a027e8dd55550bf8f7a63