diff --git a/bin/dunecontrol b/bin/dunecontrol
index b3b140a8d985bb13ff16d215e464c08263f3b609..535edd50628db5bf5e4a76ff787f14819b357417 100755
--- a/bin/dunecontrol
+++ b/bin/dunecontrol
@@ -172,8 +172,8 @@ run_default_configure () {
     eval ./configure "$PARAMS" || exit 1
   else
     if test -f configure.in || test -f configure.ac; then
-      echo "ERROR: configure.[in|ac] found, but configure missing"
-      echo "did you forget to run autoconf?"
+      echo "ERROR: configure.[in|ac] found, but configure missing" > /dev/stderr
+      echo "did you forget to run autoconf?" > /dev/stderr
       exit 1
     fi
   fi
@@ -207,11 +207,12 @@ run_default_svn () {
 ###
 
 onfailure() {
-  echo Execution terminated due to errors!
+  echo Execution terminated due to errors! > /dev/stderr
   exit 1
 }
 
 usage () {
+  (
     echo "Usage: $(basename $0) [OPTIONS] COMMAND [COMMAND-OPTIONS]"
     echo ""
     echo "Execute COMMAND for all Dune modules found in and below the current directory."
@@ -229,6 +230,7 @@ usage () {
       printf "  \`$i'\t$(eval echo \$${i}_HELP)\n"
     done
     echo
+  )  > /dev/stderr
 }
 
 if test "x$1" = "x"; then
@@ -256,15 +258,15 @@ while test $# -gt 0; do
     --opts=*)
       if test "x$arg" = "x"; then
         usage
-        echo "ERROR: Parameter for --opts is missing"
-        echo
+        echo "ERROR: Parameter for --opts is missing"  > /dev/stderr
+        echo  > /dev/stderr
         exit 1;
       fi
       DUNE_OPTS_FILE=$(canonicalpath $arg)/$(basename $arg)
       if ! test -r "$DUNE_OPTS_FILE"; then
         usage
-        echo "ERROR: could not read opts file \"$DUNE_OPTS_FILE\""
-        echo
+        echo "ERROR: could not read opts file \"$DUNE_OPTS_FILE\""  > /dev/stderr
+        echo  > /dev/stderr
         exit 1;
       fi
     ;;
@@ -279,8 +281,8 @@ while test $# -gt 0; do
     --module=*)
       if test "x$arg" = "x"; then
         usage
-        echo "ERROR: Parameter for --module is missing"
-        echo
+        echo "ERROR: Parameter for --module is missing"  > /dev/stderr
+        echo  > /dev/stderr
         exit 1;
       fi
       fix_and_assign MODULE "$arg"
@@ -288,8 +290,8 @@ while test $# -gt 0; do
     --only=*)
       if test "x$arg" = "x"; then
         usage
-        echo "ERROR: Parameter for --only is missing"
-        echo
+        echo "ERROR: Parameter for --only is missing"  > /dev/stderr
+        echo  > /dev/stderr
         exit 1;
       fi
       fix_and_assign ONLY "$arg"
@@ -344,7 +346,7 @@ case "$command" in
     usage
     ;;
   *)
-    echo "ERROR: unknown command \"$command\""
+    echo "ERROR: unknown command \"$command\""  > /dev/stderr
     usage
     exit 1
     ;;
diff --git a/bin/dunemodules.inc b/bin/dunemodules.inc
index 85c07b8ba69a8afd8e824952dab0cd401430a8fe..dbec0635236a2e5ba6a4d5f775cd89ccb101f990 100644
--- a/bin/dunemodules.inc
+++ b/bin/dunemodules.inc
@@ -31,39 +31,39 @@ fi
 parse_control() {
   # check file existence
   if ! test -f "$1"; then
-    echo "ERROR: could not read file $1"
+    echo "ERROR: could not read file $1" > /dev/stderr
     exit 1
   fi
   # read parameters from control file
   local name="$(echo $($GREP Module: "$1" | cut -d ':' -f2))"
   if test "x$name" = "x"; then
-    echo "ERROR: $CONTROL files $1 does not contain a Module entry"
+    echo "ERROR: $CONTROL files $1 does not contain a Module entry" > /dev/stderr
     exit 1
   fi
   local deps="$(echo $($GREP Depends: "$1" | cut -d ':' -f2))"
   local sugs="$(echo $($GREP Suggests: "$1" | cut -d ':' -f2))"
   local path="$(dirname "$1")"
   # create and check variable name from module name
-  fix_and_assign module $name
+  export module=$(fix_variable_name $name)
   if ! check_modname "$module"; then
-    echo "ERROR: $CONTROL files $1 contains an invalid Module entry"
+    echo "ERROR: $CONTROL files $1 contains an invalid Module entry" > /dev/stderr
     exit 1
   fi
   # avoid multiple definition of the same module
   if test "x$(eval echo \$HAVE_$module)" != "x"; then
-    echo "ERROR: multiple definition of module $name"
-    echo "previous defined in:"
-    echo "  $(eval echo \$PATH_$module)/$CONTROL"
-    echo "redefined in:"
-    echo "  $path/$CONTROL"
+    echo "ERROR: multiple definition of module $name" > /dev/stderr
+    echo "previous defined in:" > /dev/stderr
+    echo "  $(eval echo \$PATH_$module)/$CONTROL" > /dev/stderr
+    echo "redefined in:" > /dev/stderr
+    echo "  $path/$CONTROL" > /dev/stderr
     exit 1
   fi
   # set status variables
   export HAVE_${module}=yes
   export PATH_${module}="$path"
   export NAME_${module}="$name"
-  fix_and_assign DEPS_${module} "$deps"
-  fix_and_assign SUGS_${module} "$sugs"
+  export DEPS_${module}="$deps"
+  export SUGS_${module}="$sugs"
 }
 
 #
@@ -103,7 +103,7 @@ EOF
       parse_control "$1"
       export MODULES="$MODULES $module"
     else
-      echo "ERROR: '$1' is neither a directory nor a $CONTROL file"
+      echo "ERROR: '$1' is neither a directory nor a $CONTROL file" > /dev/stderr
       false
     fi
   fi
@@ -114,10 +114,11 @@ EOF
 #
 sort_modules() {
   for m in "$@"; do
+    # did we find a module file for this mopdule?
     if test "x$(eval echo \$HAVE_$m)" != "x"; then
       _sort_module $m
     else
-      echo "ERROR: could not find module $dep"
+      echo "ERROR: could not find module $dep" > /dev/stderr
       exit 1
     fi
   done
@@ -134,21 +135,37 @@ sort_modules() {
 _sort_module() {
   local module="$1"
   shift 1
-  if ! check_modname $module; then echo "ERROR: invalid module name $module"; exit 1; fi
+  if ! check_modname $module; then 
+    echo "ERROR: invalid module name $module" > /dev/stderr
+    exit 1
+  fi
   if test "x$(eval echo \$SORT_DONE_${command}_${module})" != "xyes"; then
     # resolve dependencies
-    for dep in $(eval "echo \$DEPS_$module"); do
-      if ! check_modname $dep; then echo "ERROR: invalid module name $dep"; exit 1; fi
+    for name in $(eval "echo \$DEPS_$module"); do
+	  dep=$(fix_variable_name $name)
+      if ! check_modname $dep; then 
+        echo "ERROR: invalid module name $dep" > /dev/stderr
+        exit 1
+      fi
       if test "x$(eval echo \$HAVE_$dep)" != "x"; then
         _sort_module $dep
       else
-        echo "ERROR: could not find module $dep"
-        exit 1
+        # perhaps this module is installed,
+        # then it should be handled via pkg-config
+        if ! pkg-config $name; then
+          echo "ERROR: could not find module $dep" > /dev/stderr
+          echo "       module is also unknown to pkg-config" > /dev/stderr
+          exit 1
+        fi
       fi
     done
     # resolve suggestions
-    for dep in $(eval "echo \$SUGS_$module"); do
-      if ! check_modname $dep; then echo "ERROR: invalid module name $dep"; exit 1; fi
+    for name in $(eval "echo \$SUGS_$module"); do
+	  dep=$(fix_variable_name $name)
+      if ! check_modname $dep; then
+        echo "ERROR: invalid module name $dep" > /dev/stderr
+        exit 1
+      fi
       if test "x$(eval echo \$HAVE_$dep)" != "x"; then
         _sort_module $dep
       fi
@@ -183,7 +200,7 @@ eval_control() {
       $command
     ) || false
   else
-    echo "ERROR: could not find $file"
+    echo "ERROR: could not find $file" > /dev/stderr
     exit 1
   fi
 }
@@ -195,13 +212,17 @@ eval_control() {
 # $1 name of variable
 # $2 value
 #
+fix_variable_name() {
+  if ! check_modname $name; then
+    echo "ERROR: error in assignment. $name is not a valid variabel name." > /dev/stderr
+  fi
+  echo "$@" | tr '-' '_'
+}
+
 fix_and_assign() {
   local name="$1"
   shift 1
-  if ! check_modname $name; then
-    echo ERROR: error in assignment. $name is not a valid variabel name.
-  fi
-  export $name="$(echo "$@" | sed -e 's/-/_/g')"
+  export $name=$(fix_variable_name $@)
 }
 
 #