diff --git a/pkgs/applications/networking/browsers/chromium/update.sh b/pkgs/applications/networking/browsers/chromium/update.sh
index c9dd69df9a20..4721ded385ae 100755
--- a/pkgs/applications/networking/browsers/chromium/update.sh
+++ b/pkgs/applications/networking/browsers/chromium/update.sh
@@ -4,16 +4,92 @@ channels_url="http://omahaproxy.appspot.com/";
 bucket_url="http://commondatastorage.googleapis.com/chromium-browser-official/";
 output_file="$(cd "$(dirname "$0")" && pwd)/sources.nix";
 
-get_channels()
+nix_getattr()
+{
+    input_file="$1";
+    attr="$2";
+
+    var="$(nix-instantiate --eval-only -A "$attr" "$output_file")";
+    echo "$var" | tr -d '\\"';
+}
+
+### poor mans key/value-store :-) ###
+
+ver_sha_table=""; # list of version:sha256
+
+sha_lookup()
+{
+    version="$1";
+
+    for ver_sha in $ver_sha_table;
+    do
+        if [ "x${ver_sha%:*}" = "x$version" ];
+        then
+            echo "${ver_sha##*:}";
+            return 0;
+        fi;
+    done;
+
+    return 1;
+}
+
+sha_insert()
+{
+    version="$1";
+    sha256="$2";
+
+    ver_sha_table="$ver_sha_table $version:$sha256";
+}
+
+if [ -e "$output_file" ];
+then
+    get_sha256()
+    {
+        channel="$1";
+        version="$2";
+        url="$3";
+
+        oldver="$(nix_getattr "$output_file" "$channel.version")";
+
+        echo -n "Checking if $oldver ($channel) is up to date..." >&2;
+
+        if [ "x$version" != "x$oldver" ];
+        then
+            echo " no, getting sha256 for new version $version:" >&2;
+            sha256="$(nix-prefetch-url "$url")";
+        else
+            echo " yes, keeping old sha256." >&2;
+            sha256="$(nix_getattr "$output_file" "$channel.sha256")";
+        fi;
+
+        sha_insert "$version" "$sha256"
+        echo "$sha256";
+    }
+else
+    get_sha256()
+    {
+        nix-prefetch-url "$url";
+    }
+fi;
+
+get_channel_exprs()
 {
     for chline in $(echo "$1" | cut -d, -f-2);
     do
         channel="${chline%%,*}";
         version="${chline##*,}";
-
         url="${bucket_url%/}/chromium-$version.tar.bz2";
 
-        sha256="$(nix-prefetch-url "$url")";
+        echo -n "Checking if sha256 of version $version is cached..." >&2;
+        if sha256="$(sha_lookup "$version")";
+        then
+            echo "yes: $sha256" >&2;
+        else
+            echo "no." >&2;
+            sha256="$(get_sha256 "$channel" "$version" "$url")";
+        fi;
+
+        sha_insert "$version" "$sha256";
 
         echo "  $channel = {";
         echo "    version = \"$version\";";
@@ -25,26 +101,13 @@ get_channels()
 
 cd "$(dirname "$0")";
 
-versions="$(curl -s "$channels_url" | sed -n -e 's/^linux,\(\([^,]\+,\)\{2\}\).*$/\1/p')";
-
-if [ -e "$output_file" ];
-then
-    vhash="$(echo "$versions" | sha256sum | cut -d' ' -f1)";
-    old_vhash="$(sed -n 's/# *VHASH: *//p' "$output_file")";
-
-    if [ "x$vhash" = "x$old_vhash" ];
-    then
-        echo "$output_file is already up to date, bailing out." >&2;
-        exit 1;
-    fi;
-fi;
-
-channels="$(get_channels "$versions")";
+omaha="$(curl -s "$channels_url")";
+versions="$(echo "$omaha" | sed -n -e 's/^linux,\(\([^,]\+,\)\{2\}\).*$/\1/p')";
+channel_exprs="$(get_channel_exprs "$versions")";
 
 cat > "$output_file" <<-EOF
 # This file is autogenerated from update.sh in the same directory.
-# VHASH: $vhash
 {
-$channels
+$channel_exprs
 }
 EOF