diff --git a/bin/duneproject b/bin/duneproject
index bbf1648e778e76d8c7a5300196e2efd64107ea00..6dbc10fcf70ed730f6f061ec943dc71ec11f2b83 100755
--- a/bin/duneproject
+++ b/bin/duneproject
@@ -147,8 +147,9 @@ echo
 
 . "$(canonicalpath $0)/../lib/dunemodules.lib"
 
-# create PKG_CONFIG_PATH for installed dune modules
-export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:\"$(canonicalpath $0)/../lib/pkgconfig\""
+export PREFIX_DIR="`canonicalpath "$0"`/.."
+
+extract_multiarch_pkg_config_path
 
 # search for modules, both installed and src modules
 find_modules_in_path
@@ -340,7 +341,7 @@ AC_CONFIG_FILES([
   Makefile
   src/Makefile
   cmake/Makefile
-  cmake/pkg/Makefile
+  cmake/modules/Makefile
   doc/Makefile
   doc/doxygen/Makefile
   doc/doxygen/Doxyfile
@@ -466,7 +467,7 @@ include \$(top_srcdir)/am/global-rules
 
 # Generate package configuration files for finding
 # installed modules with CMake
-include $(top_srcdir)/am/cmake-pkg-config
+include \$(top_srcdir)/am/cmake-pkg-config
 
 M_DELIM
 
@@ -497,6 +498,7 @@ add_subdirectory("src")
 add_subdirectory("m4")
 add_subdirectory("dune")
 add_subdirectory("doc")
+add_subdirectory("cmake/modules")
 
 # finalize the dune project, e.g. generating config.h etc.
 finalize_dune_project(GENERATE_CONFIG_H_CMAKE)
@@ -696,7 +698,7 @@ CC_DELIM
 echo "- $PROJECT/m4/CMakeLists.txt"
 cat> "$PROJECT/m4/CMakeLists.txt" << CC_DELIM
 
-install(PROGRAMS $MODULE.m4 DESTINATION share/dune/aclocal)
+install(PROGRAMS $MODULE.m4 DESTINATION \${CMAKE_INSTALL_DATAROOTDIR}/dune/aclocal)
 
 CC_DELIM
 
@@ -880,7 +882,7 @@ cat> "$PROJECT/doc/doxygen/CMakeLists.txt" << CC_DELIM
 add_doxygen_target()
 CC_DELIM
 
-#########################################################
+
 ############### The cmake subdirectory ##################
 #########################################################
 
@@ -890,11 +892,51 @@ mkdir "$PROJECT/cmake"
 
 echo "- $PROJECT/cmake/Makefile.am"
 cat> "$PROJECT/cmake/Makefile.am" <<EOF
-SUBDIRS = pkg
+SUBDIRS = modules
+
+include \$(top_srcdir)/am/global-rules
+EOF
+
+############### The cmake subdirectory ##################
+#########################################################
+
+mkdir "$PROJECT/cmake/modules"
+
+################# cmake/modules/Makefile.am #####################
+macroname=""
+for i in $(echo $PROJECT| sed 's/-/ /g'); do
+  firstchar=$(echo $i | sed 's/\(.\).*/\1/')
+  macroname=$macroname$(echo $firstchar | tr '[a-z]' '[A-Z]')$(echo $i | sed 's/.\(.*\)/\1/')
+done
+macroname="$macroname""Macros.cmake"
+
+echo "- $PROJECT/cmake/modules/Makefile.am"
+cat> "$PROJECT/cmake/modules/Makefile.am" <<EOF
+MODULES = $macroname
+modulesdir = $(datadir)/dune/cmake/modules
+dist_modules_DATA = \${MODULES}
 
 include \$(top_srcdir)/am/global-rules
+EXTRA_DIST = CMakeLists.txt
 EOF
 
+################# cmake/modules/Makefile.am #####################
+
+echo "- $PROJECT/cmake/modules/CMakeLists.txt"
+cat> "$PROJECT/cmake/modules/CMakeLists.txt" <<EOF
+set(modules "$macroname")
+
+install(FILES \${modules} DESTINATION \${DUNE_INSTALL_MODULEDIR})
+EOF
+
+################# cmake/modules/$macroname #####################
+
+echo "- $PROJECT/cmake/modules/$macroname"
+cat> "$PROJECT/cmake/modules/$macroname" <<EOF
+# File for module specific CMake tests.
+EOF
+
+
 ################# stamp-regenerate-config-h #####################
 
 echo "- $PROJECT/stamp-regenerate-config-h"
diff --git a/lib/dunemodules.lib b/lib/dunemodules.lib
index face91ff0282fc38becd6360f0b1fed758a8dd25..cf28377bde6f6196338f516cad83e198ded1a0e5 100644
--- a/lib/dunemodules.lib
+++ b/lib/dunemodules.lib
@@ -161,6 +161,38 @@ parse_control() {
   fi
 }
 
+# Uses the current compiler to extract information about the
+# multiarch triplets and sets the export variable MULTIARCH_LIBDIR
+# according to it.
+# If not compiler is specified then cc or gcc is used.
+extract_multiarch_pkg_config_path(){
+  local my_cxx_compiler
+  if test "x$MULTIARCH_LIBDIR" != "x"; then
+    return
+  fi
+  set +e #error in the multiarch detection should not be fatal.
+  $(which cc &>/dev/null)
+  if test $? -eq "0"; then
+      my_cxx_compiler=cc
+  else
+      my_cxx_compiler=gcc
+  fi
+  multiarch=$($my_cxx_compiler --print-multiarch 2>/dev/null)
+  if test $? -gt 0; then
+    multiarch=$($my_cxx_compiler -v 2>&1| $GREP target | sed "s/.*target=\([a-z0-9_-]\+\)/\1/")
+  fi
+  set -e # set to old value.
+  export MULTIARCH_LIBDIR="lib/$multiarch"
+
+  # create PKG_CONFIG_PATH for installed dune modules
+  for i in $MULTIARCH_LIBDIR lib64 lib32 lib; do
+    if test -d "$PREFIX_DIR/$i/pkgconfig"; then
+      export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$PREFIX_DIR/$i/pkgconfig"
+    fi
+  done
+}
+
+
 #
 # try to setup the control path
 #
@@ -180,6 +212,8 @@ setup_control_path() {
           DUNE_CONTROL_PATH=$DUNE_CONTROL_PATH:"$i/../dunecontrol"
         fi
       done
+    else
+       DUNE_CONTROL_PATH=$DUNE_CONTROL_PATH:$(pkg-config dune-common --variable=prefix)/lib/dunecontrol
     fi
   fi
   # try to read DUNE_CONTROL_PATH from OPTS file