diff --git a/Makefile b/Makefile
index aac8887311c5376819f5cb3613cb2d9ee006774b..079925659e6fe0fe70e989da896ef11aa2f7af1c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,3 @@
-# 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 ?=
@@ -33,9 +28,8 @@ Makefile.coq: _CoqProject Makefile
 # Install build-dependencies
 build-dep:
 	cat opam.pins | build/opam-pins.sh
-	opam upgrade $(YFLAG)
 	opam pin add coq-lambda-rust "$$(pwd)#HEAD" -k git -n -y
-	opam install coq-lambda-rust --deps-only $(YFLAG)
+	opam install coq-lambda-rust --deps-only -y
 
 # 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 95f19e830600f704f17fe22a8d470c17fff43364..35117dafd931f62f4fb7ded5fea7a5a6bda8c0ad 100755
--- a/build/opam-ci.sh
+++ b/build/opam-ci.sh
@@ -16,18 +16,17 @@ test -d "$OPAMROOT/repo/coq-released" || opam repo add coq-released https://coq.
 opam update
 opam install ocamlfind -y # Remove this once the Coq crew fixed their package...
 
-# Pick fixed versions of some dependencies
+# Install fixed versions of some dependencies
 echo
 for PIN in "${@}"
 do
     echo "Applying pin: $PIN"
-    opam pin add $PIN -k version -y -n
+    opam pin add $PIN -k version -y
 done
 
-# Install/upgrade build-dependencies
+# Install build-dependencies
 echo
-opam upgrade -y
-make build-dep Y=1
+make build-dep
 
 # done
 echo
diff --git a/build/opam-pins.sh b/build/opam-pins.sh
index 784100b25abf102cf4c7781208234c468cabc3c2..d08fb314e5b865d0d56c88c159d46863247d39b9 100755
--- a/build/opam-pins.sh
+++ b/build/opam-pins.sh
@@ -1,13 +1,52 @@
 #!/bin/bash
 set -e
-# Process an opam.pins file from stdin.
+## 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 stdin
 while read PACKAGE PIN; do
     if echo "$PIN" | egrep '^https://gitlab\.mpi-sws\.org' > /dev/null; then
         # an MPI URL -- try doing recursive pin processing
         URL=$(echo "$PIN" | sed 's|#|/raw/|')/opam.pins
-        curl -f "$URL" 2> /dev/null | "$0"
+        curl -f "$URL" 2> /dev/null | "$0" --recursive
     fi
-    echo "Applying pin: $PACKAGE -> $PIN"
+    echo "[opam-pins] Applying pin: $PACKAGE -> $PIN"
     opam pin add "$PACKAGE" "$PIN" -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 3c8dba6db1ea92c03fc97c40a163fdedf780ae2a..febb0c13ad543bd49553f0f5102381f1a14a21cf 100644
--- a/opam.pins
+++ b/opam.pins
@@ -1 +1 @@
-coq-iris https://gitlab.mpi-sws.org/FP/iris-coq#ce32b224b90b6c91eae1ddb60505107b2f66b263
+coq-iris https://gitlab.mpi-sws.org/FP/iris-coq#90f773c0eb319320932edfd4a5fbe878673bb3de