diff --git a/Makefile.conf.in b/Makefile.conf.in
index b70654c9760ae8081eac15d963ac9b96a9a98727..7119fa9504360d89ec5aacd9104d8c37e9332e4e 100644
--- a/Makefile.conf.in
+++ b/Makefile.conf.in
@@ -18,3 +18,12 @@ program_transform_name=@program_transform_name@
 program_can_run_mpi=@program_can_run_mpi@
 program_can_run=@program_can_run@
 LD_RO=@LD_RO@
+exec_prefix="@exec_prefix@"
+bindir="@bindir@"
+libdir="@libdir@"
+includedir="@includedir@"
+datarootdir="@datarootdir@"
+datadir="@datadir@"
+docdir="${datarootdir}/doc/@program_name@"
+htmldir="@htmldir@"
+program_name="@program_name@"
diff --git a/configure b/configure
index b5fccae4f75e0ac264f7546b03dffa2138e165cf..f2544f37705d869fd54660bd113381d5bcdccc1e 100755
--- a/configure
+++ b/configure
@@ -621,6 +621,7 @@ ac_includes_default="\
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
 build_dir
+program_name
 LD_RO
 program_can_run_mpi
 program_can_run
diff --git a/configure.ac b/configure.ac
index 1f81d66db5456c29d45da8c2a6732ca00fac852a..a91dadcecd56afcd68f80d00c35cf30a9302cecf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -715,6 +715,7 @@ AC_ARG_PROGRAM
 # version modified to work in shell script instead of makefile:
 program_transform_name_sh=$(echo "${program_transform_name}" | sed 's:\$\$:$:g')
 program_name=$(echo plumed | sed "$program_transform_name_sh")
+AC_SUBST(program_name)
 
 if test "$(echo "$program_name" | tr '[A-Z]' '[a-z]')" != "$(echo "$program_name" | tr '[A-Z]' '[a-z]' | sed 's/kernel$//')" ; then
   AC_MSG_ERROR([$program_name is not a valid program name (should not terminate with Kernel)])
diff --git a/include/plumed b/include/plumed
new file mode 120000
index 0000000000000000000000000000000000000000..5cd551cf2693e4b4f65d7954ec621454c2b20326
--- /dev/null
+++ b/include/plumed
@@ -0,0 +1 @@
+../src
\ No newline at end of file
diff --git a/patches/patch.sh b/patches/patch.sh
index dafd2525f95c89d7c30e8b6836d144b161e04188..0aa5cac5fe1b738a015d5b9de222777d47d5f904 100755
--- a/patches/patch.sh
+++ b/patches/patch.sh
@@ -237,7 +237,7 @@ case "$action" in
       plumed_before_patch
     fi
     test -n "$quiet" || echo "Linking Plumed.h and Plumed.inc ($mode mode)"
-    ln -s "$PLUMED_ROOT/src/wrapper/Plumed.h"
+    ln -s "$PLUMED_INCLUDEDIR/$PLUMED_PROGRAM_NAME/wrapper/Plumed.h" Plumed.h
     ln -s "$PLUMED_ROOT/src/lib/Plumed.inc.$mode" Plumed.inc
     ln -s "$PLUMED_ROOT/src/lib/Plumed.cmake.$mode" Plumed.cmake
 
diff --git a/src/cltools/Info.cpp b/src/cltools/Info.cpp
index 9ed205ef07aaa1a707d8dada2376b6886e8008a4..d2238c7d075eb109e5c3b7ceea2a5f54f042577a 100644
--- a/src/cltools/Info.cpp
+++ b/src/cltools/Info.cpp
@@ -91,8 +91,8 @@ int Info::main(FILE* in, FILE*out,Communicator& pc){
  bool printgitversion; parseFlag("--git-version",printgitversion);
  if(printroot) fprintf(out,"%s\n",config::getPlumedRoot().c_str());
  if(printconfiguration) fprintf(out,"%s",config::getMakefile().c_str());
- std::string userdoc=config::getPlumedRoot()+"user-doc/html/index.html";
- std::string developerdoc=config::getPlumedRoot()+"developer-doc/html/index.html";
+ std::string userdoc=config::getPlumedHtmldir()+"/user-doc/html/index.html";
+ std::string developerdoc=config::getPlumedHtmldir()+"/developer-doc/html/index.html";
  if(printuserdoc) fprintf(out,"%s\n",userdoc.c_str());
  if(printdeveloperdoc) fprintf(out,"%s\n",developerdoc.c_str());
  if(printversion) fprintf(out,"%s\n",config::getVersion().c_str());
diff --git a/src/config/Config.cpp.in b/src/config/Config.cpp.in
index 66c391c02521d8844393a037dd2df3bb0cdf2389..6d0701a3c8e2bb186b1d94c2da3fe13df02d451f 100644
--- a/src/config/Config.cpp.in
+++ b/src/config/Config.cpp.in
@@ -47,6 +47,50 @@ std::string getPlumedRoot(){
   return ss;
 }
 
+std::string getPlumedHtmldir(){
+  if(!isInstalled()) return getPlumedRoot();
+  char *env = std::getenv("PLUMED_HTMLDIR");
+  std::string ss;
+  if( env == NULL) {
+    ss="@htmldir@";
+  } else {
+    ss=std::string( env );
+  }
+  return ss;
+}
+
+std::string getPlumedIncludedir(){
+  if(!isInstalled()) return getPlumedRoot()+"/include";
+  char *env = std::getenv("PLUMED_INCLUDEDIR");
+  std::string ss;
+  if( env == NULL) {
+    ss="@includedir@";
+  } else {
+    ss=std::string( env );
+  }
+  return ss;
+}
+
+std::string getPlumedProgramName(){
+  if(!isInstalled()) return "plumed";
+  char *env = std::getenv("PLUMED_PROGRAM_NAME");
+  std::string ss;
+  if( env == NULL) {
+    ss="@program_name@";
+  } else {
+    ss=std::string( env );
+  }
+  return ss;
+}
+
+std::string getEnvCommand(){
+  return "env PLUMED_ROOT=\""+getPlumedRoot()+"\""+
+        " env PLUMED_HTMLDIR=\""+getPlumedHtmldir()+"\""+
+        " env PLUMED_INCLUDEDIR=\""+getPlumedIncludedir()+"\""+
+        " env PLUMED_PROGRAM_NAME=\""+getPlumedProgramName()+"\""+
+        " env PLUMED_IS_INSTALLED=\""+(@ISINSTALLED@?"yes":"no")+"\"";
+}
+
 std::string getVersion(){
   return PLUMED_VERSION_SHORT;
 }
diff --git a/src/config/Config.h b/src/config/Config.h
index edf1b00d4d43ef64d1a9d338303f265e8d05a879..76bf723e7f325c38d391d3dc7bc591506fd43041 100644
--- a/src/config/Config.h
+++ b/src/config/Config.h
@@ -31,6 +31,14 @@ std::string getSoExt();
 
 std::string getPlumedRoot();
 
+std::string getPlumedHtmldir();
+
+std::string getPlumedIncludedir();
+
+std::string getPlumedProgramName();
+
+std::string getEnvCommand();
+
 std::string getMakefile();
 
 std::string getVersion();
diff --git a/src/config/Makefile b/src/config/Makefile
index fae0e2748e86050caf2649dfa39cc557dae3d777..5fb978fe0e229da4c0b712766b786b4f1c5936e5 100644
--- a/src/config/Makefile
+++ b/src/config/Makefile
@@ -7,36 +7,45 @@ ifndef program_transform_name
   program_transform_name=s,x,x,
 endif
 
-# default target
 .PHONY: all obj
+ifdef PLUMED_FORCE
+.PHONY: ConfigInstall.cpp Config.cpp version.h
+endif
+
+# default target
 all:
-	@echo "Updating ConfigInstall.cpp"
-	@sed "s/@SOEXT@/$(SOEXT)/g" Config.cpp.in | \
-         sed "s/@ISINSTALLED@/true/g" | \
-	env prefix="${prefix}" env program_transform_name="${program_transform_name}" ../maketools/update-plumedroot.sh ConfigInstall.cpp
-	@echo "Updating version file"
-	@ ../maketools/update-version.sh version.h
-	$(MAKE) do-all
+	$(MAKE) PLUMED_FORCE=yes ConfigInstall.cpp Config.cpp version.h
+	$(MAKE) Config.o ConfigInstall.o compile_options.sh
 
 obj: all
 
-do-all: Config.o ConfigInstall.o compile_options.sh 
-	make ConfigInstall.o
+version.h:
+	@echo "Updating version.h"
+	@ ../maketools/update-version.sh version.h
 
-ConfigInstall.cpp:
+ConfigInstall.cpp: Config.cpp.in
 	@echo "Updating ConfigInstall.cpp"
 	@sed "s/@SOEXT@/$(SOEXT)/g" Config.cpp.in | \
          sed "s/@ISINSTALLED@/true/g" | \
-         ../maketools/update-plumedroot.sh ConfigInstall.cpp
-	@echo "Updating version file"
-	@ ../maketools/update-version.sh version.h
+         sed "s|@PLUMED_ROOT@|$(libdir)/$(program_name)|g" | \
+         sed "s|@htmldir@|$(htmldir)|g" | \
+         sed "s|@includedir@|$(includedir)|g" | \
+         sed "s|@program_name@|$(program_name)|g" | \
+         sed "s|@libdir@|$(libdir)|g" > $@~
+	cmp -s $@~ $@ || cp $@~ $@
+	rm $@~
 
 # file to import compilation options inside c++
-Config.cpp: Config.cpp.in Config.h
-	@echo Building Config.cpp, a object containing configuration infos
+Config.cpp: Config.cpp.in
+	@echo "Updating Config.cpp"
 	@sed "s/@SOEXT@/$(SOEXT)/g" $< | \
          sed "s/@ISINSTALLED@/false/g" | \
-         sed "s|@PLUMED_ROOT@|$(CURDIR:src/config=)|g" > $@
+         sed "s|@htmldir@|xxxxNAxxxx|g" | \
+         sed "s|@includedir@|xxxxNAxxxx|g" | \
+         sed "s|@program_name@|xxxxNAxxxx|g" | \
+         sed "s|@PLUMED_ROOT@|$(CURDIR:src/config=)|g" > $@~
+	cmp -s $@~ $@ || cp $@~ $@
+	rm $@~
 
 links: 
 	@echo Nothing to do in $(CURDIR)
@@ -51,7 +60,7 @@ Makefile.conf.xxd: ../../Makefile.conf
 # file to import compilation options inside a bash script
 compile_options.sh:
 	@echo Building compile_options.sh, a sourceable bash script with some compilation options
-	@echo "compile='"$(CXX) -c -I'"$$PLUMED_ROOT"'/src $(CPPFLAGS) $(CXXFLAGS) -o"'" > $@
+	@echo "compile='"$(CXX) -c -I'"$$PLUMED_INCLUDEDIR/$$PLUMED_PROGRAM_NAME"'/ $(CPPFLAGS) $(CXXFLAGS) -o"'" > $@
 	@echo "link='"$(LDSO) -o"'" >> $@
 	@echo "soext='"$(SOEXT)"'" >> $@
 
diff --git a/src/core/CLToolMain.cpp b/src/core/CLToolMain.cpp
index 891920ea7422ce79468f55ef9860fe77ab0c6d8c..0e67b25acf020abda9db376f3b7d5a56fe9f704c 100644
--- a/src/core/CLToolMain.cpp
+++ b/src/core/CLToolMain.cpp
@@ -210,7 +210,7 @@ int CLToolMain::run(int argc, char **argv,FILE*in,FILE*out,Communicator& pc){
       fprintf(out,"  plumed %s\n", manual.c_str());
     }
     for(unsigned j=0;j<availableShell.size();++j){
-      string cmd="env PLUMED_ROOT=\""+root+"\" \""+root+"/scripts/"+availableShell[j]+".sh\" --description";
+      string cmd=config::getEnvCommand()+" \""+root+"/scripts/"+availableShell[j]+".sh\" --description";
       FILE *fp=popen(cmd.c_str(),"r");
       string line,manual;
       while(Tools::getline(fp,line))manual+=line;
@@ -241,7 +241,7 @@ int CLToolMain::run(int argc, char **argv,FILE*in,FILE*out,Communicator& pc){
   if(find(availableShell.begin(),availableShell.end(),command)!=availableShell.end()){
     plumed_massert(in==stdin,"shell tools can only work on stdin");
     plumed_massert(out==stdout,"shell tools can only work on stdin");
-    string cmd="env PLUMED_ROOT=\""+root+"\" \""+root+"/scripts/"+command+".sh\"";
+    string cmd=config::getEnvCommand()+" \""+root+"/scripts/"+command+".sh\"";
     for(int j=i+1;j<argc;j++) cmd+=string(" ")+argv[j];
     system(cmd.c_str());
     return 0;
diff --git a/src/lib/.gitignore b/src/lib/.gitignore
index 57494398f40b13688c8fd7f1a398c92681d23711..f1672ee0ab9235fa3bd2fad5854d474b926dbb5b 100644
--- a/src/lib/.gitignore
+++ b/src/lib/.gitignore
@@ -3,3 +3,4 @@
 /compile_options.sh
 /plumed-*
 /plumed
+/install
diff --git a/src/lib/Makefile b/src/lib/Makefile
index dc6cd7301e68827eb4363d39b51910ad12770492..514c8d197d37bb394039655d18d4c78841f2c16f 100644
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -10,9 +10,6 @@ DIRSLINKS:=$(addsuffix .links,$(DIRS))
 # include the machine dependent configuration
 -include ../../Makefile.conf
 
-# include installation info
--include ../config/install.conf
-
 # if machine dependent configuration has been found:
 ifdef GCCDEP
 
@@ -38,6 +35,13 @@ XXX := $(SRC_KERNEL:.cpp=.o)
 OBJ_KERNEL := $(XXX:.c=.o)
 ALL_OBJ := $(OBJ_KERNEL) $(OBJ_WRAPPER) $(OBJ_DYNAMIC_WRAPPER) $(OBJ_MAIN)
 
+# when calling install-build, libraries in install should be built.
+ifeq ($(PLUMED_INSTALL),Install)
+  PLUMED_LIBDIR:=install/
+else
+  PLUMED_LIBDIR:=
+endif
+
 # plumed kernel
 PLUMED_KERNEL := $(PLUMED_LIBDIR)libplumedKernel.$(SOEXT)
 
@@ -54,130 +58,167 @@ PLUMED_MAIN_STATIC := $(PLUMED_LIBDIR)plumed
 PLUMED_MAIN_SHARED := $(PLUMED_LIBDIR)plumed-shared
 PLUMED_MAIN_RUNTIME := $(PLUMED_LIBDIR)plumed-runtime
 
-ifdef PLUMED_LIBDIR_NODEST
-  PLUMED_ROOT :="$(PLUMED_LIBDIR_NODEST)../../"
-else
-  PLUMED_ROOT :="$(realpath ../../)"
-endif
 
-
-.PHONY: all links $(DIRS) $(DIRSLINKS) all-static $(PLUMED_LIBDIR)Plumed.cmake $(PLUMED_LIBDIR)Plumed.inc
-ifdef SOEXT
+.PHONY: all links $(DIRS) $(DIRSLINKS) all-static $(PLUMED_LIBDIR)Plumed.cmake $(PLUMED_LIBDIR)Plumed.inc install $(PLUMED_SCRIPTS_EXE)
 all:
 	$(MAKE) dirslinks
 	$(MAKE) dirs
+ifdef SOEXT
 	$(MAKE) lib
 else
-all:
-	$(MAKE) all-static
-endif
-
-all-static:
-	$(MAKE) dirslinks
-	$(MAKE) dirs
 	$(MAKE) lib-static
+endif
+ifneq ($(PLUMED_INSTALL),Install)
+	$(MAKE) install-build
+endif
 
 dirs:
 	@echo "*** Compiling all directories ***"
 	$(MAKE) $(DIRS)
 
+install-build:
+	mkdir -p install/
+	$(MAKE) PLUMED_INSTALL=Install all
+ifdef LD_RO
+	$(LD_RO) install/kernel.o $(OBJ_KERNEL)
+endif
+# modulefile
+	@cat modulefile.in | \
+           sed "s|@_SOEXT_@|$(SOEXT)|" | \
+           sed "s|@_program_name_@|$(program_name)|" | \
+           sed "s|@_libdir_@|$(libdir)|" | \
+           sed "s|@_bindir_@|$(bindir)|" | \
+           sed "s|@_includedir_@|$(includedir)|" \
+	   > install/modulefile
 
 install:
+ifdef PLUMED_PREFIX
+	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+	@echo "WARNING: using PLUMED_PREFIX variable is not allowed anymore"
+	@echo "         please use one of the following choices:"
+	@echo "         (1) at configure time:"
+	@echo "           ./configure --prefix=$(PLUMED_PREFIX)"
+	@echo "         (2) or later, at install time:"
+	@echo "           make install prefix=$(PLUMED_PREFIX)"
+	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+endif
+ifdef PLUMED_LIBSUFFIX
+	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+	@echo "WARNING: using PLUMED_LIBSUFFIX variable is not allowed anymore"
+	@echo "         please use the following option at configure time"
+	@echo "         ./configure --program-suffix='_$(PLUMED_LIBSUFFIX)'"
+	@echo "         there is no way to change the suffix at install time"
+	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+endif
 	cd ../config ; $(MAKE)
-# two steps to be sure that ../config/install.conf is up to date
-	$(MAKE) install-do
-
-install-do:
 	$(MAKE) uninstall
-	mkdir -p $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin
-	mkdir -p $(DESTDIR)$(PLUMED_INSTALL_ROOT)/src/lib
-	mkdir -p $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/include/$(PLUMED_PROGRAM_NAME)
-	mkdir -p $(DESTDIR)$(PLUMED_INSTALL_ROOT)/obj
+	mkdir -p $(DESTDIR)$(bindir)
+	mkdir -p $(DESTDIR)$(libdir)
+	mkdir -p $(DESTDIR)$(includedir)/$(program_name)
+	mkdir -p $(DESTDIR)$(libdir)/$(program_name)/obj
+	mkdir -p $(DESTDIR)$(libdir)/$(program_name)/src/lib
+	mkdir -p $(DESTDIR)$(libdir)/$(program_name)/src/config
+	mkdir -p $(DESTDIR)$(libdir)/$(program_name)/src/colvar
 # rebuild libraries and main using new target dir
-	$(MAKE) PLUMED_LIBDIR=$(DESTDIR)$(PLUMED_INSTALL_ROOT)/src/lib/ PLUMED_LIBDIR_NODEST=$(PLUMED_INSTALL_ROOT)/src/lib/ PLUMED_INSTALL=Install all
-# copy scripts, required .h, .cpp, compile_options.sh and documentation:
-	cd ../../ ; tar cf - patches scripts src/wrapper/Plumed.h src/colvar/Template.cpp *-doc/html *-doc/regtests *-doc/manual.pdf | tar xf - -C $(DESTDIR)$(PLUMED_INSTALL_ROOT)/
-	mkdir -p $(DESTDIR)$(PLUMED_INSTALL_ROOT)/src/config/
-	sed 's|-I"$$PLUMED_ROOT"/src|-I"$$PLUMED_ROOT"/../../include/$(PLUMED_PROGRAM_NAME)|' ../config/compile_options.sh > $(DESTDIR)$(PLUMED_INSTALL_ROOT)/src/config/compile_options.sh
+	$(MAKE) install-build
+# copy documentation:
+	if test -d ../../user-doc/html ; then mkdir -p $(DESTDIR)$(htmldir) && cd ../../ && tar cf - user-doc/html | tar xf - -C $(DESTDIR)$(htmldir)/ ; fi
+	if test -d ../../developer-doc/html ; then mkdir -p $(DESTDIR)$(htmldir) && cd ../../ && tar cf - developer-doc/html | tar xf - -C $(DESTDIR)$(htmldir)/ ; fi
+	if test -f ../../user-doc/manual.pdf ; then mkdir -p $(DESTDIR)$(htmldir)/user-doc && cp ../../user-doc/manual.pdf $(DESTDIR)$(htmldir)/user-doc/ ; fi
+# copy patches and scripts
+	cd ../../ ; tar cf - patches scripts | tar xf - -C $(DESTDIR)$(libdir)/$(program_name)/
+# copy Template.cpp file (we leave it in src/colvar/ for backward compatibility)
+	cp ../colvar/Template.cpp $(DESTDIR)$(libdir)/$(program_name)/src/colvar/
+# copy compile_options.sh file (we leave it in src/colvar/ for backward compatibility)
+	cp ../config/compile_options.sh $(DESTDIR)$(libdir)/$(program_name)/src/config/compile_options.sh
 ifdef LD_RO
-	$(LD_RO) $(DESTDIR)$(PLUMED_INSTALL_ROOT)/obj/kernel.o $(OBJ_KERNEL)
+	cp install/kernel.o $(DESTDIR)$(libdir)/$(program_name)/obj/kernel.o
 else
-	../maketools/copyobjects $(DESTDIR)$(PLUMED_INSTALL_ROOT)/obj/k $(OBJ_KERNEL)
+	../maketools/copyobjects $(DESTDIR)$(libdir)/$(program_name)/obj/k $(OBJ_KERNEL)
 endif
-	cp $(OBJ_WRAPPER) $(DESTDIR)$(PLUMED_INSTALL_ROOT)/obj/PlumedStatic.o
-	cp $(OBJ_DYNAMIC_WRAPPER) $(DESTDIR)$(PLUMED_INSTALL_ROOT)/obj/Plumed.o
+	cp $(OBJ_WRAPPER) $(DESTDIR)$(libdir)/$(program_name)/obj/PlumedStatic.o
+	cp $(OBJ_DYNAMIC_WRAPPER) $(DESTDIR)$(libdir)/$(program_name)/obj/Plumed.o
 # also copy .h files into include/ dir
-	cd ../../src ; tar cf - */*.h */*/*.h | tar xf - -C $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/include/$(PLUMED_PROGRAM_NAME)/
-# modulefile
-	@sed "s|@_PREFIX_@|$(PLUMED_INSTALL_PREFIX)|" modulefile.in | sed "s|@_SOEXT_@|$(SOEXT)|" | sed "s|@_PROGNAME_@|$(PLUMED_PROGRAM_NAME)|" > $(DESTDIR)$(PLUMED_INSTALL_ROOT)/src/lib/modulefile
-# install links
-	cd $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin/ && ln -s ../lib/$(PLUMED_PROGRAM_NAME)/src/lib/plumed $(PLUMED_PROGRAM_NAME)
-	cd $(DESTDIR)$(PLUMED_INSTALL_ROOT) && for file in $(PLUMED_SCRIPTS) ; do ln -s src/lib/plumed-$$file plumed-$$file ; done
-	cd $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin/ && ln -s ../lib/$(PLUMED_PROGRAM_NAME)/src/lib/plumed-patch $(PLUMED_PROGRAM_NAME)-patch
+	cd ../../src ; tar cf - */*.h */*/*.h | tar xf - -C $(DESTDIR)$(includedir)/$(program_name)/
+# install executable
+	cp install/plumed $(DESTDIR)$(bindir)/$(program_name)
+# patch file for cross compiling
+	cp install/plumed-patch $(DESTDIR)$(bindir)/$(program_name)-patch
+# copy include files for cmake and make
+# we leave it in src/lib/ for backward compatibility
+	cp install/Plumed.cmake* $(DESTDIR)$(libdir)/$(program_name)/src/lib/
+	cp install/Plumed.inc* $(DESTDIR)$(libdir)/$(program_name)/src/lib/
+# other shell-based cltools are copied
+	for file in $(PLUMED_SCRIPTS) ; do cp install/plumed-$$file $(DESTDIR)$(libdir)/$(program_name)/plumed-$$file ; done
 ifdef SOEXT
-	cd $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/lib/ && ln -s $(PLUMED_PROGRAM_NAME)/src/lib/libplumed.$(SOEXT) lib$(PLUMED_PROGRAM_NAME).$(SOEXT)
-	cd $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/lib/ && ln -s $(PLUMED_PROGRAM_NAME)/src/lib/libplumedKernel.$(SOEXT) lib$(PLUMED_PROGRAM_NAME)Kernel.$(SOEXT)
+	cp install/libplumed.$(SOEXT) $(DESTDIR)$(libdir)/lib$(program_name).$(SOEXT)
+	cp install/libplumedKernel.$(SOEXT) $(DESTDIR)$(libdir)/lib$(program_name)Kernel.$(SOEXT)
 endif
-	chmod -R go+rX,go-w $(DESTDIR)$(PLUMED_INSTALL_ROOT)
-	chmod -R go+rX,go-w $(DESTDIR)$(PLUMED_INSTALL_ROOT)/plumed-*
-	chmod -R go+rX,go-w $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/include/$(PLUMED_PROGRAM_NAME)
-	chmod -R go+rX,go-w $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin/$(PLUMED_PROGRAM_NAME)
+# modulefile
+	cp install/modulefile $(DESTDIR)$(libdir)/$(program_name)/src/lib/modulefile
+# making everything visible:
+	chmod -R go+rX,go-w $(DESTDIR)$(libdir)/$(program_name)
+	chmod -R go+rX,go-w $(DESTDIR)$(includedir)/$(program_name)
+	chmod -R go+rX,go-w $(DESTDIR)$(bindir)/$(program_name)
+	chmod -R go+rX,go-w $(DESTDIR)$(bindir)/$(program_name)-patch
 	@echo
 	@echo "*** PLUMED has been installed ***"
 	@echo
 ifdef DESTDIR
 	@echo "WARNING: Staged install with DESTDIR = $(DESTDIR)"
 endif
-	@echo "Install prefix : $(PLUMED_INSTALL_PREFIX)"
-	@echo "Full name      : $(PLUMED_PROGRAM_NAME)"
+	@echo "Install prefix : $(prefix)"
+	@echo "Full name      : $(program_name)"
 	@echo
 	@echo "Setup your environment"
-	@echo "- Ensure this is in your execution path : $(PLUMED_INSTALL_PREFIX)/bin"
-	@echo "- Ensure this is in your include path   : $(PLUMED_INSTALL_PREFIX)/include"
+	@echo "- Ensure this is in your execution path : $(bindir)"
+	@echo "- Ensure this is in your include path   : $(includedir)"
 ifdef SOEXT
-	@echo "- Ensure this is in your library path   : $(PLUMED_INSTALL_PREFIX)/lib"
+	@echo "- Ensure this is in your library path   : $(libdir)"
 	@echo "For runtime binding:"
-	@echo "- Set this environment variable         : PLUMED_KERNEL=$(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME)Kernel.$(SOEXT)"
+	@echo "- Set this environment variable         : PLUMED_KERNEL=$(libdir)/lib$(program_name)Kernel.$(SOEXT)"
 endif
 	@echo
 	@echo "To create a tcl module that sets all the variables above, use this one as a starting point:"
-	@echo "$(PLUMED_INSTALL_ROOT)/src/lib/modulefile"
+	@echo "$(libdir)/$(program_name)/modulefile"
 	@echo
 	@echo "To uninstall, remove the following files and directories:"
-	@echo $(PLUMED_INSTALL_ROOT)
-	@echo $(PLUMED_INSTALL_PREFIX)/include/$(PLUMED_PROGRAM_NAME)
-	@echo $(PLUMED_INSTALL_PREFIX)/bin/$(PLUMED_PROGRAM_NAME)
-	@echo $(PLUMED_INSTALL_PREFIX)/bin/$(PLUMED_PROGRAM_NAME)-patch
+	@echo $(libdir)/$(program_name)
+	@echo $(htmldir)
+	@echo $(includedir)/$(program_name)
+	@echo $(bindir)/$(program_name)
+	@echo $(bindir)/$(program_name)-patch
 ifdef SOEXT
-	@echo $(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME).$(SOEXT)
-	@echo $(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME)Kernel.$(SOEXT)
+	@echo $(libdir)/lib$(program_name).$(SOEXT)
+	@echo $(libdir)/lib$(program_name)Kernel.$(SOEXT)
 endif
 ifeq ($(program_can_run),no)
-	@echo "WARNING: $(PLUMED_PROGRAM_NAME) executable will not run on this machine"
+	@echo "WARNING: $(program_name) executable will not run on this machine"
 	@echo "WARNING: to patch an MD code use 'plumed-patch'"
-	@echo "WARNING: a few other command line tools are avalable as $(PLUMED_INSTALL_ROOT)/plumed-*"
+	@echo "WARNING: a few other command line tools are avalable as $(libdir)/$(program_name)/plumed-*"
 else ifeq ($(program_can_run_mpi),no)
-	@echo "WARNING: $(PLUMED_PROGRAM_NAME) executable will not run on this machine"
-	@echo "WARNING: unless you invoke it as '$(PLUMED_PROGRAM_NAME) --no-mpi'"
-	@echo "WARNING: to patch an MD code now use '$(PLUMED_PROGRAM_NAME) --no-mpi patch'"
+	@echo "WARNING: $(program_name) executable will not run on this machine"
+	@echo "WARNING: unless you invoke it as '$(program_name) --no-mpi'"
+	@echo "WARNING: to patch an MD code now use '$(program_name) --no-mpi patch'"
 	@echo "WARNING: (notice that MPI will be available anyway in the patched code)"
-	@echo "WARNING: all command line tools are available as '$(PLUMED_PROGRAM_NAME) --no-mpi name-of-the-tool'"
-	@echo "WARNING: e.g. '$(PLUMED_PROGRAM_NAME) --no-mpi driver'"
+	@echo "WARNING: all command line tools are available as '$(program_name) --no-mpi name-of-the-tool'"
+	@echo "WARNING: e.g. '$(program_name) --no-mpi driver'"
 endif
 
 
 uninstall:
-	rm -fr $(DESTDIR)$(PLUMED_INSTALL_ROOT)
-	rm -fr $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/include/$(PLUMED_PROGRAM_NAME)
-	rm -f $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin/$(PLUMED_PROGRAM_NAME)
-	rm -f $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/bin/$(PLUMED_PROGRAM_NAME)-patch
-	rm -f $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME).$(SOEXT)
-	rm -f $(DESTDIR)$(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME)Kernel.$(SOEXT)
+	rm -fr $(DESTDIR)$(libdir)/$(program_name)
+	rm -fr $(DESTDIR)$(htmldir)
+	rm -fr $(DESTDIR)$(includedir)/$(program_name)
+	rm -f $(DESTDIR)$(bindir)/bin/$(program_name)
+	rm -f $(DESTDIR)$(bindir)/bin/$(program_name)-patch
+	rm -f $(DESTDIR)$(libdir)/lib$(program_name).$(SOEXT)
+	rm -f $(DESTDIR)$(libdir)/lib$(program_name)Kernel.$(SOEXT)
 
 $(DIRS):
 	$(MAKE) -C $@ obj
 
-.PHONY: lib lib-static lib-shared
+.PHONY: lib lib-static lib-shared lib-install lib-static-install
 
 lib: lib-static lib-shared
 
@@ -190,8 +231,24 @@ lib-shared: $(PLUMED_KERNEL) $(PLUMED_SHARED_OBJ) $(PLUMED_MAIN_SHARED) $(PLUMED
 $(PLUMED_SCRIPTS_EXE):
 	@echo "#! /bin/bash" > $@
 	@echo "echo 'NOTE: shell only version, useful when plumed is cross compiled' >&2" >> $@
-	@echo "export PLUMED_ROOT=\"\$${PLUMED_ROOT-$(PLUMED_ROOT)}\"" >> $@
+# The logic implemented here should be the same as in config/Config.cpp.in
+# Please keep them consistent
+ifeq ($(PLUMED_INSTALL),Install)
+# If plumed is installed, single paths can be overridden using env vars
+	@echo "export PLUMED_IS_INSTALLED=yes" >> $@
+	@echo "export PLUMED_ROOT=\"\$${PLUMED_ROOT-$(libdir)/$(program_name)}\"" >> $@
+	@echo "export PLUMED_INCLUDEDIR=\"\$${PLUMED_INCLUDEDIR-$(includedir)}\"" >> $@
+	@echo "export PLUMED_HTMLDIR=\"\$${PLUMED_HTMLDIR=$(htmldir)}\"" >> $@
+	@echo "export PLUMED_PROGRAM_NAME=\"\$${PLUMED_PROGRAM_NAME-$(program_name)}\"" >> $@
+	@echo "source \"\$$PLUMED_ROOT\"/scripts/$(subst plumed-,,$(@F)).sh" >> $@
+else
+	@echo "export PLUMED_IS_INSTALLED=no" >> $@
+	@echo "export PLUMED_ROOT=\"\$${PLUMED_ROOT-$(realpath ../../)}\"" >> $@
+	@echo "export PLUMED_INCLUDEDIR=\"\$${PLUMED_ROOT}/include\"" >> $@
+	@echo "export PLUMED_HTMLDIR=\"\$${PLUMED_ROOT}\"" >> $@
+	@echo "export PLUMED_PROGRAM_NAME=plumed" >> $@
 	@echo "source \"\$$PLUMED_ROOT\"/scripts/$(subst plumed-,,$(@F)).sh" >> $@
+endif
 	chmod a+x $@
 
 $(PLUMED_KERNEL):$(OBJ_KERNEL)
@@ -200,7 +257,7 @@ $(PLUMED_KERNEL):$(OBJ_KERNEL)
 # it moves the presently compiled version out of the way then move it back
 # perhaps a cleaner solution is to use patchelf (linux) and install_name_tool (mac)
 # but I am not sure how that would be portable
-ifdef DESTDIR
+ifeq ($(PLUMED_INSTALL),Install)
 	-test -f libplumedKernel.$(SOEXT) && mv libplumedKernel.$(SOEXT) .libplumedKernel.$(SOEXT)
 	$(LDSO) -o libplumedKernel.$(SOEXT) $^ $(DYNAMIC_LIBS)
 	mv libplumedKernel.$(SOEXT) $@
@@ -215,7 +272,7 @@ $(PLUMED_SHARED_OBJ): $(OBJ_KERNEL) $(OBJ_WRAPPER)
 # it moves the presently compiled version out of the way then move it back
 # perhaps a cleaner solution is to use patchelf (linux) and install_name_tool (mac)
 # but I am not sure how that would be portable
-ifdef DESTDIR
+ifeq ($(PLUMED_INSTALL),Install)
 	-test -f libplumed.$(SOEXT) && mv libplumed.$(SOEXT) .libplumed.$(SOEXT)
 	$(LDSO) -o libplumed.$(SOEXT) $^ $(DYNAMIC_LIBS)
 	mv libplumed.$(SOEXT) $@
@@ -237,18 +294,18 @@ ifeq ($(PLUMED_INSTALL),Install)
 
 $(PLUMED_LIBDIR)Plumed.inc:
 	@echo Building Plumed.inc
-	@echo "PLUMED_RUNTIME_LOAD=" $(PLUMED_INSTALL_ROOT)/obj/Plumed.o $(LIBS) $(LDFLAGS) > $@
+	@echo "PLUMED_RUNTIME_LOAD=" $(libdir)/$(program_name)/obj/Plumed.o $(LIBS) $(LDFLAGS) > $@
 ifdef LD_RO
-	@echo "PLUMED_STATIC_LOAD=" $(PLUMED_INSTALL_ROOT)/obj/kernel.o $(PLUMED_INSTALL_ROOT)/obj/PlumedStatic.o $(LIBS) $(DYNAMIC_LIBS) $(LDFLAGS) >> $@
+	@echo "PLUMED_STATIC_LOAD=" $(libdir)/$(program_name)/obj/kernel.o $(libdir)/$(program_name)/obj/PlumedStatic.o $(LIBS) $(DYNAMIC_LIBS) $(LDFLAGS) >> $@
 else
-	@echo "PLUMED_STATIC_LOAD=" $(shell ../maketools/listobjects $(PLUMED_INSTALL_ROOT)/obj/k $(OBJ_KERNEL)) $(PLUMED_INSTALL_ROOT)/obj/PlumedStatic.o $(LIBS) $(DYNAMIC_LIBS) $(LDFLAGS) >> $@
+	@echo "PLUMED_STATIC_LOAD=" $(shell ../maketools/listobjects $(libdir)/$(program_name)/obj/k $(OBJ_KERNEL)) $(libdir)/$(program_name)/obj/PlumedStatic.o $(LIBS) $(DYNAMIC_LIBS) $(LDFLAGS) >> $@
 endif
-	@echo "PLUMED_SHARED_LOAD=" $(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME).$(SOEXT) $(LIBS) $(LDFLAGS) >> $@
+	@echo "PLUMED_SHARED_LOAD=" $(libdir)/lib$(program_name).$(SOEXT) $(LIBS) $(LDFLAGS) >> $@
 	@echo "PLUMED_RUNTIME_DEPENDENCIES="   >> $@
 # when installing, it is sufficient to include dependence wrt a single object
 # indeed, the object are replaced all at the same time
-	@echo "PLUMED_STATIC_DEPENDENCIES=" $(PLUMED_INSTALL_ROOT)/obj/PlumedStatic.o  >> $@
-	@echo "PLUMED_SHARED_DEPENDENCIES=" $(PLUMED_INSTALL_PREFIX)/lib/lib$(PLUMED_PROGRAM_NAME).$(SOEXT)  >> $@
+	@echo "PLUMED_STATIC_DEPENDENCIES=" $(libdir)/$(program_name)/obj/PlumedStatic.o  >> $@
+	@echo "PLUMED_SHARED_DEPENDENCIES=" $(libdir)/lib$(program_name).$(SOEXT)  >> $@
 else
 Plumed.inc:
 	@echo Building Plumed.inc
@@ -316,6 +373,7 @@ clean:
 	rm -f $(PLUMED_MAIN_STATIC) $(PLUMED_MAIN_SHARED) $(PLUMED_MAIN_RUNTIME)
 	rm -f Plumed.inc* plumed-* Plumed.cmake*
 	rm -f .lib*
+	rm -fr install/
 
 dirslinks:
 	@echo "*** Updating links to used modules in all directories ***"
diff --git a/src/lib/modulefile.in b/src/lib/modulefile.in
index 48d9ab9890bcf9646cb2a14437e1ba76b068ee87..fc264258ac87c22ea02f481f65cd4db8865297b5 100644
--- a/src/lib/modulefile.in
+++ b/src/lib/modulefile.in
@@ -2,14 +2,18 @@
 
 # Manually add here dependencies and conflicts
 
-# this is the prefix path, and should be set properly:
-set prefix "@_PREFIX_@"
+# this is the path for libraries
+set libdir "@_libdir_@"
+# this is the path for binaries
+set bindir "@_bindir_@"
+# this is the path for include files
+set bindir "@_includedir_@"
 # this is the extension for dynamic libraries
 # if set to empty, switches off plumed library
 set soext  "@_SOEXT_@"
 # this is the name of the plumed program
 # it is usually plumed
-set progname "@_PROGNAME_@"
+set progname "@_program_name_@"
 
 # everything past this line should not need any editing
 
@@ -20,11 +24,11 @@ proc ModulesHelp { } {
 module-whatis   "Adds paths for Plumed"
 
 # execution path
-prepend-path  PATH               $prefix/bin
+prepend-path  PATH               $bindir
 
 # include path
-prepend-path  CPATH              $prefix/include/
-prepend-path  INCLUDE            $prefix/include/
+prepend-path  CPATH              $includedir
+prepend-path  INCLUDE            $includedir
 
 # paths for libraries are only set if plumed is compiled as a dynamic library
 if { [ string length $soext ]  != 0 } {
@@ -36,8 +40,8 @@ if { [module-info mode load] && [ info exists ::env(PLUMED_KERNEL) ] } {
 }
 
 # library path
-prepend-path  LIBRARY_PATH       $prefix/lib/
-prepend-path  LD_LIBRARY_PATH    $prefix/lib/
-prepend-path  DYLD_LIBRARY_PATH  $prefix/lib/
-setenv        PLUMED_KERNEL      $prefix/lib/lib${progname}Kernel.$soext
+prepend-path  LIBRARY_PATH       $libdir
+prepend-path  LD_LIBRARY_PATH    $libdir
+prepend-path  DYLD_LIBRARY_PATH  $libdir
+setenv        PLUMED_KERNEL      $libdir/lib${progname}Kernel.$soext
 }
diff --git a/src/maketools/update-plumedroot.sh b/src/maketools/update-plumedroot.sh
deleted file mode 100755
index 1a4f9325fb29dec5fb88c1962202308e22c152f0..0000000000000000000000000000000000000000
--- a/src/maketools/update-plumedroot.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /bin/bash
-
-test -n "$1" || {
-  echo "Usage: $0 outfile"
-  exit 1
-}
-
-# if environment variable "prefix" is set, use it.
-# otherwise defaults to /usr/local
-prefix="${prefix:=/usr/local}"
-
-# if environment variable PLUMED_PREFIX is set,
-# override the present prefix
-if test -n "$PLUMED_PREFIX" ; then
-  echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
-  echo "WARNING: using PLUMED_PREFIX variable is deprecated"
-  echo "         please use one of the following choices:"
-  echo "         (1) at configure time:"
-  echo "           ./configure --prefix=$PLUMED_PREFIX"
-  echo "         (2) or later, at install time:"
-  echo "           make install prefix=$PLUMED_PREFIX"
-  echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
-# this will result in an error in a later version
-# now we fall back to the previous behavior
-  prefix="${PLUMED_PREFIX}"
-fi
-
-# if environment variable PLUMED_LIBSUFFIX is set, complain
-if test -n "$PLUMED_LIBSUFFIX" ; then
-  echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
-  echo "WARNING: using PLUMED_LIBSUFFIX variable is deprecated, please use"
-  echo "         ./configure --program-suffix='$PLUMED_LIBSUFFIX'"
-  echo "         at configure time"
-  echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
-# this will result in an error in a later version
-# now we fall back to the previous behavior
-  PLUMED_LIBSUFFIX="${PLUMED_LIBSUFFIX:=}"
-  test -n "$PLUMED_LIBSUFFIX" && PLUMED_LIBSUFFIX="_${PLUMED_LIBSUFFIX}"
-fi
-
-PLUMED_PROGRAM_NAME="$(echo plumed | sed "${program_transform_name}")${PLUMED_LIBSUFFIX}"
-PLUMED_ROOT="$prefix/lib/${PLUMED_PROGRAM_NAME}"
-
-{
-echo "PLUMED_INSTALL_ROOT=${PLUMED_ROOT}"
-echo "PLUMED_INSTALL_PREFIX=$prefix"
-echo "PLUMED_PROGRAM_NAME=${PLUMED_PROGRAM_NAME}"
-} > install.conf
-
-sed "s|@PLUMED_ROOT@|${PLUMED_ROOT}|g" > $1~
-
-cmp -s $1~ $1 || cp $1~ $1
-rm $1~
-
-
-