diff --git a/scripts/git-update.sh b/scripts/git-update.sh
index bd66745..cdea09e 100755
--- a/scripts/git-update.sh
+++ b/scripts/git-update.sh
@@ -6,16 +6,28 @@
 # run this from a directory that contains the checkouts for each of the
 # modules
 
-FAILURE=
+PIDS=
 
+CORE="\
+    gstreamer gst-plugins-base"
 MODULES="\
-    gstreamer gst-plugins-base \
     gst-plugins-good gst-plugins-ugly gst-plugins-bad \
     gst-ffmpeg \
     gst-python \
     gnonlin"
 
-for m in $MODULES; do
+tmp=${TMPDIR-/tmp}
+tmp=$tmp/git-update.$(date +%Y%m%d-%H%M-).$RANDOM.$RANDOM.$RANDOM.$$
+
+(umask 077 && mkdir "$tmp") || {
+  echo "Could not create temporary directory! Exiting." 1>&2
+  exit 1
+}
+
+ERROR_LOG="$tmp/failures.log"
+touch $ERROR_LOG
+
+for m in $CORE $MODULES; do
   if test -d $m; then
     echo "+ updating $m"
     cd $m
@@ -23,22 +35,22 @@ for m in $MODULES; do
     git pull origin master
     if test $? -ne 0
     then
+      echo "$m: update (trying stash, pull, stash apply)" >> $ERROR_LOG
       git stash
       git pull origin master
       if test $? -ne 0
       then 
-        git stash apply
-        FAILURE="$FAILURE$m: update\n"
-      else
-        git stash apply
+        echo "$m: update" >> $ERROR_LOG
+        cd ..
+        continue
       fi
-      cd ..
-      continue
+      git stash apply
     fi
+
     git submodule update
     if test $? -ne 0
     then
-      FAILURE="$FAILURE$m: update\n"
+      echo "$m: update (submodule)" >> $ERROR_LOG
       cd ..
       continue
     fi
@@ -46,42 +58,74 @@ for m in $MODULES; do
   fi
 done
 
-# then build
-for m in $MODULES; do
-  if test -d $m; then
-    cd $m
+build()
+{
+  if test -d $1; then
+    cd $1
     if test ! -e Makefile
     then
-      ./autoregen.sh
+      echo "+ $1: autoregen.sh"
+      ./autoregen.sh > "$tmp/$1-regen.log" 2>&1
       if test $? -ne 0
       then
-        FAILURE="$FAILURE$m: autoregen.sh\n"
+        echo "$1: autoregen.sh [$tmp/$1-regen.log]" >> $ERROR_LOG
         cd ..
-        continue
+        return -1
       fi
+      echo "+ $1: autoregen.sh done"
     fi
 
-    make $@
+    echo "+ $1: make"
+    make > "$tmp/$1-make.log" 2>&1
     if test $? -ne 0
     then
-      FAILURE="$FAILURE$m: make\n"
+      echo "$1: make [$tmp/$1-make.log]" >> $ERROR_LOG
       cd ..
-      continue
+      return -1
     fi
+    echo "+ $1: make done"
 
-    make $@ check
-    if test $? -ne 0
-    then
-      FAILURE="$FAILURE$m: check\n"
-      cd ..
-      continue
+    if test "x$CHECK" != "x"; then
+      echo "+ $1: make check"
+      make check > "$tmp/$1-check.log" 2>&1
+      if test $? -ne 0
+      then
+        echo "$1: check [$tmp/$1-check.log]" >> $ERROR_LOG
+        cd ..
+        return
+      fi
+      echo "+ $1: make check done"
     fi
     cd ..
   fi
-done
+}
 
-if test "x$FAILURE" != "x";  then
+beach()
+{
+if test -e $ERROR_LOG;  then
   echo "Failures:"
   echo
-  echo -e $FAILURE
+  cat $ERROR_LOG
+else
+  rm -rf "$tmp"
 fi
+}
+
+# build core and base plugins sequentially
+# exit if build fails (excluding checks)
+for m in $CORE; do
+  build $m
+  if [ $? == -1 ]; then
+  beach
+  fi
+done
+
+# build other modules in parallel
+for m in $MODULES; do
+  build $m &
+  PIDS="$PIDS $!"
+done
+wait $PIDS
+
+beach
+
