diff --git a/ompi/peruse/peruse-internal.h b/ompi/peruse/peruse-internal.h
index 31d83b650a..005ab1e6c5 100644
--- a/ompi/peruse/peruse-internal.h
+++ b/ompi/peruse/peruse-internal.h
@@ -50,6 +50,13 @@ enum {
     PERUSE_TYPE_WIN
 };
 
+extern int ompi_peruse_initialized;
+extern int ompi_peruse_finalized;
+
+#define OMPI_ERR_PERUSE_INIT_FINALIZE \
+    if( OPAL_UNLIKELY(!ompi_peruse_initialized || ompi_peruse_finalized) ) { \
+        return PERUSE_ERR_INIT; \
+    }
 
 /*
  * Module internal function declarations
@@ -57,7 +64,6 @@ enum {
 int ompi_peruse_init (void);
 int ompi_peruse_finalize (void);
 
-
 /*
  * Global macros
  */
diff --git a/ompi/peruse/peruse.c b/ompi/peruse/peruse.c
index 86a25e5e1a..19d76631ea 100644
--- a/ompi/peruse/peruse.c
+++ b/ompi/peruse/peruse.c
@@ -75,9 +75,9 @@ int PERUSE_Init (void)
 
 
 /* Query all implemented events */
-int PERUSE_Query_supported_events( int* num_supported,
-                                                 char*** event_names,
-                                                 int** events )
+int PERUSE_Query_supported_events (int* num_supported,
+                                   char*** event_names,
+                                   int** events)
 {
     int i;
     *num_supported = PERUSE_num_events;
@@ -122,7 +122,7 @@ int PERUSE_Query_event_name (int event, char** event_name)
 
 
 /* Get environment variables that affect MPI library behavior */
-int PERUSE_Query_environment( int * env_size, char *** env )
+int PERUSE_Query_environment (int * env_size, char *** env)
 {
     /* XXX tbd */
     return PERUSE_SUCCESS;
@@ -141,14 +141,16 @@ int PERUSE_Query_queue_event_scope (int * scope)
  * II. Events, objects initialization and manipulation
  */
 /* Initialize event associated with an MPI communicator */
-int PERUSE_Event_comm_register( int                       event,
-                                              MPI_Comm                  comm,
-                                              peruse_comm_callback_f *  callback_fn,
-                                              void *                    param,
-                                              peruse_event_h *          event_h )
+int PERUSE_Event_comm_register (int                       event,
+                                MPI_Comm                  comm,
+                                peruse_comm_callback_f *  callback_fn,
+                                void *                    param,
+                                peruse_event_h *          event_h)
 {
     ompi_peruse_handle_t * handle;
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if( (event < 0) || (event > PERUSE_num_events) ||
             (NULL == PERUSE_events[event].name) )
             return PERUSE_ERR_EVENT;
@@ -196,6 +198,8 @@ int PERUSE_Event_activate (peruse_event_h event_h)
     ompi_peruse_handle_t* handle = (ompi_peruse_handle_t*)event_h;
 
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if (PERUSE_EVENT_HANDLE_NULL == event_h)
             return PERUSE_ERR_EVENT_HANDLE;
     }
@@ -213,6 +217,8 @@ int PERUSE_Event_deactivate (peruse_event_h event_h)
     ompi_peruse_handle_t* handle = (ompi_peruse_handle_t*)event_h;
 
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if (PERUSE_EVENT_HANDLE_NULL == event_h)
             return PERUSE_ERR_EVENT_HANDLE;
     }
@@ -228,6 +234,8 @@ int PERUSE_Event_deactivate (peruse_event_h event_h)
 int PERUSE_Event_release (peruse_event_h * event_h)
 {
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if (PERUSE_EVENT_HANDLE_NULL == event_h)
             return PERUSE_ERR_EVENT_HANDLE;
     }
@@ -240,6 +248,8 @@ int PERUSE_Event_release (peruse_event_h * event_h)
 
 #define PERUSE_MPI_PARAM_CHECK(obj_upper,obj_lower )                  \
     if (MPI_PARAM_CHECK) {                                            \
+        OMPI_ERR_PERUSE_INIT_FINALIZE;                                \
+                                                                      \
         if (PERUSE_EVENT_HANDLE_NULL == event_h ||                    \
             ((ompi_peruse_handle_t*)event_h)->active ||               \
             ((ompi_peruse_handle_t*)event_h)->type !=                 \
@@ -249,7 +259,7 @@ int PERUSE_Event_release (peruse_event_h * event_h)
         if (NULL == callback_fn)                                      \
             return PERUSE_ERR_PARAMETER;                              \
         /*                                                            \
-         * XXX whethter the underlying MPI-object has been freed!??   \
+         * XXX whether the underlying MPI-object has been freed!??    \
         if (ompi_ ## obj_lower ## _invalid (                          \
               ((ompi_peruse_handle_t*)event_h)->obj_lower))           \
             return PERUSE_ERR_MPI_OBJECT;                             \
@@ -257,9 +267,9 @@ int PERUSE_Event_release (peruse_event_h * event_h)
     }                                                                 \
 
 /* Set a new comm callback */
-int PERUSE_Event_comm_callback_set( peruse_event_h           event_h,
-                                                  peruse_comm_callback_f*  callback_fn,
-                                                  void*                    param )
+int PERUSE_Event_comm_callback_set (peruse_event_h           event_h,
+                                    peruse_comm_callback_f*  callback_fn,
+                                    void*                    param)
 {
     ompi_peruse_handle_t* handle = (ompi_peruse_handle_t*)event_h;
 
@@ -274,9 +284,9 @@ int PERUSE_Event_comm_callback_set( peruse_event_h           event_h,
 }
 
 /* Get the current comm callback */
-int PERUSE_Event_comm_callback_get( peruse_event_h           event_h,
-                                                  peruse_comm_callback_f** callback_fn,
-                                                  void**                   param )
+int PERUSE_Event_comm_callback_get (peruse_event_h           event_h,
+                                    peruse_comm_callback_f** callback_fn,
+                                    void**                   param)
 {
     ompi_peruse_handle_t* handle = (ompi_peruse_handle_t*)event_h;
 
@@ -291,9 +301,11 @@ int PERUSE_Event_comm_callback_get( peruse_event_h           event_h,
 }
 
 /* Obtain event descriptor from an event handle (reverse lookup) */
-int PERUSE_Event_get( peruse_event_h event_h, int* event )
+int PERUSE_Event_get (peruse_event_h event_h, int* event)
 {
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if (NULL == event_h)
             return PERUSE_ERR_EVENT_HANDLE;
 
@@ -307,17 +319,20 @@ int PERUSE_Event_get( peruse_event_h event_h, int* event )
 
 
 /* Obtain MPI object associated with event handle */
-int PERUSE_Event_object_get( peruse_event_h event_h, void** mpi_object )
+int PERUSE_Event_object_get (peruse_event_h event_h, void** mpi_object)
 {
     ompi_peruse_handle_t* p = (ompi_peruse_handle_t*)event_h;
 
     if (MPI_PARAM_CHECK) {
+        OMPI_ERR_PERUSE_INIT_FINALIZE;
+
         if (NULL == event_h)
             return PERUSE_ERR_EVENT_HANDLE;
 
         if (NULL == mpi_object)
             return PERUSE_ERR_PARAMETER;
     }
+
     switch (p->type) {
         case PERUSE_TYPE_COMM:
             *mpi_object = p->comm;
@@ -327,7 +342,7 @@ int PERUSE_Event_object_get( peruse_event_h event_h, void** mpi_object )
 }
 
 
-/* Propagaiont mode */
+/* Propagation mode */
 int PERUSE_Event_propagate (peruse_event_h event_h, int mode)
 {
     return PERUSE_SUCCESS;
diff --git a/ompi/peruse/peruse_module.c b/ompi/peruse/peruse_module.c
index 92135948fb..e540409e95 100644
--- a/ompi/peruse/peruse_module.c
+++ b/ompi/peruse/peruse_module.c
@@ -23,7 +23,8 @@
 
 static opal_list_t peruse_handle_list;
 static opal_mutex_t peruse_handle_list_lock;
-static int ompi_peruse_initialized = 0;
+int ompi_peruse_initialized = 0;
+int ompi_peruse_finalized = 0;
 
 static void ompi_peruse_handle_construct (ompi_peruse_handle_t* p)
 {
@@ -73,6 +74,11 @@ int ompi_peruse_init (void)
 
 int ompi_peruse_finalize (void)
 {
+    if (!ompi_peruse_initialized)
+        return OMPI_SUCCESS;
+
+    ompi_peruse_finalized = 1;
+
     OBJ_DESTRUCT (&peruse_handle_list);
     OBJ_DESTRUCT (&peruse_handle_list_lock);