diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7abf939ed1ea98fb1569026e3c471a09c12ae30e..e96bc79408396b3c2a8c8782b6cc0d1b568563cb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -626,6 +626,7 @@ if(ENABLE_PETSC)
   set(ENV_PETSC_DIR $ENV{PETSC_DIR})
   set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
   if(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
+    # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
     set_config_option(HAVE_PETSC "PETSc")
     file(STRINGS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables 
          PETSC_VARIABLES NEWLINE_CONSUME)
@@ -653,6 +654,23 @@ if(ENABLE_PETSC)
     if(NOT PETSC_LIBS)
       find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib)
     endif(NOT PETSC_LIBS)
+    # find slepc (needs to be linked in before petsc)
+    if(ENABLE_SLEPC)
+      set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+      find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib)
+      if(SLEPC_LIB)
+        find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include 
+                  ${ENV_PETSC_ARCH}/include include/slepc)
+        if(SLEPC_INC)
+          set_config_option(HAVE_SLEPC "SLEPc")
+          list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+          list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC}) 
+        endif(SLEPC_INC)
+      endif(SLEPC_LIB)
+      if(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
+         message("WARNING: Export SLEPC_DIR before calling cmake")
+      endif(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
+    endif(ENABLE_SLEPC)
     list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     # find additional libraries to link with
     string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
@@ -674,10 +692,20 @@ if(ENABLE_PETSC)
       list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
     endif(LLIBS)
   else(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
+    # new-style PETSc installations (in standard system directories)
     find_library(PETSC_LIBS petsc)
     find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
     if(PETSC_LIBS AND PETSC_INC)
       set_config_option(HAVE_PETSC "PETSc")
+      if(ENABLE_SLEPC)
+        find_library(SLEPC_LIB slepc)
+        find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
+        if(SLEPC_LIB AND SLEPC_INC)
+          set_config_option(HAVE_SLEPC "SLEPc")
+          list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+          list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC}) 
+        endif(SLEPC_LIB AND SLEPC_INC)
+      endif(ENABLE_SLEPC)
       list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
       list(APPEND EXTERNAL_INCLUDES ${PETSC_INC}) 
     endif(PETSC_LIBS AND PETSC_INC)
@@ -690,23 +718,6 @@ if(ENABLE_PETSC)
   endif(NOT HAVE_PETSC AND NOT ENV_PETSC_ARCH)
 endif(ENABLE_PETSC)
 
-if(ENABLE_SLEPC AND HAVE_PETSC)
-  set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
-  find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib)
-  if(SLEPC_LIB)
-    find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include 
-              ${ENV_PETSC_ARCH}/include include/slepc)
-    if(SLEPC_INC)
-      set_config_option(HAVE_SLEPC "SLEPc")
-      list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
-      list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC}) 
-    endif(SLEPC_INC)
-  endif(SLEPC_LIB)
-  if(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
-     message("WARNING: Export SLEPC_DIR before calling cmake")
-  endif(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
-endif(ENABLE_SLEPC AND HAVE_PETSC)
-
 if(ENABLE_OCC)
   if(WIN32 OR CYGWIN)
     set(OCC_SYS_NAME win32)