diff --git a/m4/ppm_check_mpi.m4 b/m4/ppm_check_mpi.m4
new file mode 100644
index 0000000000000000000000000000000000000000..f965f2e72dfe25240c46278b2ccb92ece523593f
--- /dev/null
+++ b/m4/ppm_check_mpi.m4
@@ -0,0 +1,106 @@
+# SYNOPSIS
+#
+#   PPM_CHECK_MPI(mpi implementation)
+#
+#   the value can be one of
+#   openmpi
+#   lammpi
+#   mpich
+#   mpich2
+#   intelmpi_gnu
+#   intelmpi_intel
+#   sun
+#   ibm
+# DESCRIPTION
+#
+#
+# LICENSE
+#
+
+AC_DEFUN([PPM_CHECK_MPI],
+[
+if test "x$1" = xyes; then
+    AC_MSG_NOTICE([*** Check for any MPI to compile and link with ***])
+else
+    AC_MSG_NOTICE([*** First check if I can use $1 to compile and link with ***])
+fi
+# check for one of the following MPI distributions
+# OpenMPI
+# LAMMPI
+# MPICH
+# MPICH2
+# intel MPI
+# Sun ClusterTools (tmcc,tmCC,tmf77,tmf90)
+# IBM AIX POE (mpcc_r,mpCC_r,mpxlf_r)
+# Many of thsoe implementation have same wrapper names
+if test "x$1" = xopenmpi; then
+    AC_CHECK_PROG(MPICC,[mpicc],[mpicc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpicc for OpenMPI])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpic++],[mpic++],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpic++ for OpenMPI])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpif90],[mpif90],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpif90 for OpenMPI])],[FC="$MPIFC"])
+elif test "x$1" = xlammpi; then
+    AC_CHECK_PROG(MPICC,[mpicc],[mpicc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpicc for LAM/MPI])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpiCC],[mpiCC],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpiCC for LAM/MPI])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpif90],[mpif90],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpif90 for LAM/MPI])],[FC="$MPIFC"])
+elif test "x$1" = xmpich; then
+    AC_CHECK_PROG(MPICC,[mpicc],[mpicc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpicc for MPICH])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpiCC],[mpiCC],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpiCC for MPICH])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpif90],[mpif90],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpif90 for MPICH])],[FC="$MPIFC"])
+elif test "x$1" = xmpich2; then
+    AC_CHECK_PROG(MPICC,[mpicc],[mpicc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpicc for MPICH 2])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpicxx],[mpicxx],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpicxx for MPICH 2])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpif90],[mpif90],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpif90 for MPICH 2])],[FC="$MPIFC"])
+elif test "x$1" = xintelmpi_gnu; then
+    AC_CHECK_PROG(MPICC,[mpigcc],[mpigcc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpigcc for Intel MPI + GNU Compilers])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpig++],[mpig++],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpig++ for Intel MPI + GNU Compilers])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpigfortran],[mpigfortran],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpigfortran for Intel MPI + GNU Compilers])],[FC="$MPIFC"])
+elif test "x$1" = xintelmpi_intel; then
+    AC_CHECK_PROG(MPICC,[mpiicc],[mpiicc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpigcc for Intel MPI + Intel Compilers])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpiicpc],[mpicpc],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpicpc for Intel MPI + Intel Compilers])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpiifort],[mpiifort],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpiifort for Intel MPI + Intel Compilers])],[FC="$MPIFC"])
+elif test "x$1" = xsun; then
+    AC_CHECK_PROG(MPICC,[tmcc],[tmcc],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find tmcc for Sun MPI])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[tmCC],[tmCC],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find tmCC for Sun MPI])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[tmf90],[tmf90],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find tmf90 for Sun MPI])],[FC="$MPIFC"])
+elif test "x$1" = xibm; then
+    AC_CHECK_PROG(MPICC,[mpcc_r],[mpcc_r],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_ERROR([Could not find mpcc_r for IBM AIX MPI])],[CC="$MPICC"])
+    AC_CHECK_PROG(MPICXX,[mpCC_r],[mpCC_r],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_ERROR([Could not find mpCC_r for IBM AIX MPI])],[CXX="$MPICXX"])
+    AC_CHECK_PROG(MPIFC,[mpxf90_r],[mpxf90_r],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_ERROR([Could not find mpxf90_ for IBM AIX MPI])],[FC="$MPIFC"])
+elif test "x$1" = xguess; then
+    AC_CHECK_PROGS(MPICC,[mpicc mpigcc mpiicc tmcc mpcc_r],[no])
+    AS_VAR_IF(MPICC,[no],[AC_MSG_WARN([Could not find any mpi wrapper for a C compiler])],[CC="$MPICC"])
+    AC_CHECK_PROGS(MPICXX,[mpic++ mpiCC mpicxx mpig++ mpiicpc tmCC mpCC_r],[no])
+    AS_VAR_IF(MPICXX,[no],[AC_MSG_WARN([Could not find any mpi wrapper for a C++ compiler])],[CXX="$MPICXX"])
+    AC_CHECK_PROGS(MPIFC,[mpif90 mpifc mpigfortran mpiifort tmf90 mpxf90_r],[no])
+    AS_VAR_IF(MPIFC,[no],[AC_MSG_WARN([Could not find any mpi wrapper for a Fortran compiler])],[FC="$MPIFC"])
+    AC_MSG_NOTICE([found $CC $CXX $FC])
+elif test "x$1" = xyes; then
+    AC_MSG_NOTICE([You would like to use $CC $CXX $FC to compile with MPI support])
+else
+    AC_MSG_ERROR([Could not reocgnize this MPI implementation: $1])
+fi
+])
+