diff -Naupr pvfs-2.8.2-orig/src/common/misc/state-machine-fns.c pvfs-2.8.2-pjmp/src/common/misc/state-machine-fns.c
--- pvfs-2.8.2-orig/src/common/misc/state-machine-fns.c	2010-02-04 13:40:11.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/common/misc/state-machine-fns.c	2011-04-07 17:09:30.000000000 -0400
@@ -66,6 +66,8 @@ int PINT_state_machine_terminate(struct 
          my_frame = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
          /* this will loop from TOS down to the base frame */
          /* base frame will not be processed */
+
+         gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"[SM Terminating Child]: my_frame:%p\n",my_frame);
          qlist_for_each_entry(f, &smcb->parent_smcb->frames, link)
          {
              if(my_frame == f->frame)
@@ -75,6 +77,8 @@ int PINT_state_machine_terminate(struct 
              }
          }
 
+        gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"[SM Terminating Child]: children_running:%d\n"
+                                               ,smcb->parent_smcb->children_running);
         if (--smcb->parent_smcb->children_running <= 0)
         {
             /* no more child state machines running, so we can
@@ -82,11 +86,15 @@ int PINT_state_machine_terminate(struct 
              */
             job_null(0, smcb->parent_smcb, 0, r, &id, smcb->context);
         }
-        return SM_ACTION_DEFERRED;
     }
+
     /* call state machine completion function */
     if (smcb->terminate_fn)
     {
+        if (smcb->parent_smcb)
+        {
+            gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"[SM Terminating Child]: calling terminate function.\n");
+        }   
         (*smcb->terminate_fn)(smcb, r);
     }
     return 0;
@@ -544,13 +552,27 @@ void PINT_smcb_free(struct PINT_smcb *sm
 {
     struct PINT_frame_s *frame_entry, *tmp;
     assert(smcb);
+
+    gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"PINT_smcb_free: smcb:%p\n",smcb);
+
     qlist_for_each_entry_safe(frame_entry, tmp, &smcb->frames, link)
     {
+        if (frame_entry->frame)
+        {
+           gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"PINT_smcb_free: frame:%p \ttask-id:%d\n"
+                                                  ,frame_entry->frame
+                                                  ,frame_entry->task_id);
+        }
+        else
+        {
+           gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"PINT_smcb_free: NO FRAME ENTRIES.\n");
+        }
+
         if (frame_entry->frame && frame_entry->task_id == 0)
         {
             /* only free if task_id is 0 */
             free(frame_entry->frame);
-        }
+        } 
         qlist_del(&frame_entry->link);
         free(frame_entry);
     }
@@ -738,6 +760,8 @@ static struct PINT_state_s *PINT_sm_task
 
 static int child_sm_frame_terminate(struct PINT_smcb * smcb, job_status_s * js_p)
 {
+    gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"CHILD TERMINATE: smcb:%p.\n",smcb);
+
     PINT_smcb_free(smcb);
     return 0;
 }
@@ -802,8 +826,21 @@ static void PINT_sm_start_child_frames(s
         new_sm->parent_smcb = smcb;
         /* assign frame */
         PINT_sm_push_frame(new_sm, f->task_id, f->frame);
+
         /* locate SM to run */
+        gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"START CHILD FRAMES: calling smcb is %p.\n",smcb);
+        gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"START CHILD FRAMES: with frame: %p.\n",f->frame);
+        gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"START CHILD FRAMES: and task id: %d.\n",f->task_id);
         new_sm->current_state = PINT_sm_task_map(smcb, f->task_id);
+
+        gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"START CHILD FRAMES: new_sm->current_state is %s\n:"
+                                    ,(new_sm->current_state)?"VALID":"INVALID");
+        if (new_sm->current_state)
+        {
+            gossip_debug(GOSSIP_STATE_MACHINE_DEBUG,"START CHILD FRAMES: new_sm->current_state->flag is %d\n"
+                                        ,new_sm->current_state->flag);
+        }
+
         /* invoke SM */
         retval = PINT_state_machine_start(new_sm, &r);
         if(retval < 0)
diff -Naupr pvfs-2.8.2-orig/src/server/get-attr.sm pvfs-2.8.2-pjmp/src/server/get-attr.sm
--- pvfs-2.8.2-orig/src/server/get-attr.sm	2010-02-04 13:40:11.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/server/get-attr.sm	2011-04-07 17:40:54.000000000 -0400
@@ -167,24 +167,41 @@ nested machine pvfs2_get_attr_work_sm
     }
 }
 
-machine pvfs2_get_attr_sm
+
+nested machine pvfs2_get_attr_with_prelude_sm
 {
+    state init
+    {
+        run getattr_with_prelude_init;
+        default => prelude;
+    }
+     
+
     state prelude
     {
         jump pvfs2_prelude_sm;
         success => setup_op;
-        default => final_response;
+        default => return;
     }
-
+     
     state setup_op
     {
         run getattr_setup_op;
         default => do_work;
     }
-
+     
     state do_work
     {
         jump pvfs2_get_attr_work_sm;
+        default => return;
+    }
+}
+
+machine pvfs2_get_attr_sm
+{
+    state work
+    {
+        jump pvfs2_get_attr_with_prelude_sm;
         default => final_response;
     }
 
@@ -979,6 +996,14 @@ static PINT_sm_action getattr_cleanup(
     return(server_state_machine_complete(smcb));
 }
 
+static PINT_sm_action getattr_with_prelude_init(
+        struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    js_p->error_code = 0;
+    return SM_ACTION_COMPLETE;
+}
+
+
 static PINT_sm_action getattr_setup_op(
         struct PINT_smcb *smcb, job_status_s *js_p)
 {
diff -Naupr pvfs-2.8.2-orig/src/server/list-attr.sm pvfs-2.8.2-pjmp/src/server/list-attr.sm
--- pvfs-2.8.2-orig/src/server/list-attr.sm	2010-02-04 13:40:11.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/server/list-attr.sm	2011-04-08 11:04:19.000000000 -0400
@@ -24,6 +24,8 @@
 #include "pint-util.h"
 #include "pvfs2-internal.h"
 
+#define GETATTR 100
+
 %%
 
 
@@ -47,7 +49,7 @@ machine pvfs2_list_attr_sm
     {
         pjmp listattr_setup_getattr
         {
-            success => pvfs2_get_attr_work_sm;
+            GETATTR => pvfs2_pjmp_get_attr_work_sm;
         }
         success => interpret_getattrs;
         default => final_response;
@@ -171,7 +173,7 @@ static PINT_sm_action listattr_setup_get
         getattr_op->u.getattr.handle = s_op->req->u.listattr.handles[i];
         getattr_op->u.getattr.attrmask = s_op->req->u.listattr.attrmask;
 
-        ret = PINT_sm_push_frame(smcb, 0, getattr_op);
+        ret = PINT_sm_push_frame(smcb, GETATTR, getattr_op);
         if(ret < 0)
         {
             s_op->u.listattr.errors[i] = -PVFS_ENOMEM;
diff -Naupr pvfs-2.8.2-orig/src/server/module.mk.in pvfs-2.8.2-pjmp/src/server/module.mk.in
--- pvfs-2.8.2-orig/src/server/module.mk.in	2010-02-04 13:40:11.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/server/module.mk.in	2011-04-07 17:11:45.000000000 -0400
@@ -6,6 +6,7 @@ ifdef BUILD_SERVER
 
         # automatically generated c files
         SERVER_SMCGEN := \
+		$(DIR)/pjmp-machines.c \
 		$(DIR)/setparam.c \
 		$(DIR)/lookup.c \
 		$(DIR)/create.c \
diff -Naupr pvfs-2.8.2-orig/src/server/pjmp-machines.sm pvfs-2.8.2-pjmp/src/server/pjmp-machines.sm
--- pvfs-2.8.2-orig/src/server/pjmp-machines.sm	1969-12-31 19:00:00.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/server/pjmp-machines.sm	2011-04-07 17:23:01.000000000 -0400
@@ -0,0 +1,194 @@
+/* 
+ * (C) 2001 Clemson University and The University of Chicago 
+ *
+ * See COPYING in top-level directory.
+ *
+ * Changes by Acxiom Corporation to add dirent_count field to attributes
+ * Copyright © Acxiom Corporation, 2005.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "server-config.h"
+#include "pvfs2-server.h"
+#include "pvfs2-attr.h"
+#include "pvfs2-types.h"
+#include "pvfs2-types-debug.h"
+#include "pvfs2-util.h"
+#include "pint-util.h"
+#include "pvfs2-internal.h"
+#include "pint-cached-config.h"
+
+%%
+machine pvfs2_pjmp_get_attr_work_sm
+{
+    state pjmp_get_attr_work_initialize
+    {
+        run pjmp_initialize;
+        default => pjmp_call_get_attr_work_sm;
+    }
+
+    state pjmp_call_get_attr_work_sm
+    {
+        jump pvfs2_get_attr_work_sm;
+        default => pjmp_get_attr_work_execute_terminate;
+    }
+
+    state pjmp_get_attr_work_execute_terminate
+    {
+        run pjmp_execute_terminate;
+        default => terminate;
+    }
+}
+
+
+machine pvfs2_pjmp_remove_work_sm
+{
+    state pjmp_remove_work_initialize
+    {
+        run pjmp_initialize;
+        default => pjmp_call_remove_work_sm;
+    }
+
+    state pjmp_call_remove_work_sm
+    {
+        jump pvfs2_remove_work_sm;
+        default => pjmp_remove_work_execute_terminate;
+    }
+
+    state pjmp_remove_work_execute_terminate
+    {
+        run pjmp_execute_terminate;
+        default => terminate;
+    }
+}
+
+
+machine pvfs2_pjmp_get_attr_with_prelude_sm
+{
+    state pjmp_initialize
+    {
+        run pjmp_initialize;
+        default => pjmp_call_get_attr_with_prelude;
+    }
+
+    state pjmp_call_get_attr_with_prelude
+    {
+        jump pvfs2_get_attr_with_prelude_sm;
+        default => pjmp_execute_terminate;
+    }
+
+    state pjmp_execute_terminate
+    {
+        run pjmp_execute_terminate;
+        default => terminate;
+    } 
+}
+
+
+machine pvfs2_pjmp_call_msgpairarray_sm
+{
+   state call_msgpairarray
+    {
+        run call_msgpairarray;
+        success => transfer_msgpair;
+        default => cleanup_msgpairarray;
+    }
+
+   state transfer_msgpair
+    {
+         jump pvfs2_msgpairarray_sm;
+         default => cleanup_msgpairarray;
+    }
+
+   state cleanup_msgpairarray
+    {
+        run cleanup_msgpairarray;
+        default => terminate;
+    }
+} /*end state machine pvfs2_pjmp_call_msgpairarray_sm*/
+%%
+
+static PINT_sm_action pjmp_initialize( struct PINT_smcb *smcb
+                                     , job_status_s *js_p)
+{
+    js_p->error_code = 0;
+    return SM_ACTION_COMPLETE;
+}
+
+static PINT_sm_action pjmp_execute_terminate( struct PINT_smcb *smcb
+                                            , job_status_s *js_p)
+{
+    return SM_ACTION_TERMINATE;
+}
+
+/****************************************************************************/
+/* Actions for pvfs2_pjmp_call_msgpairarray_sm                              */
+/****************************************************************************/
+
+/*We use a separate nested state machine to call msgpairarray because */
+/*msgpairarray.sm is setup to work only with a "jump".  When "pjmp"   */
+/*is used, the frame stack gets corrupted.                            */
+static PINT_sm_action call_msgpairarray (struct PINT_smcb *smcb
+                                        ,job_status_s *js_p)
+{   
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"Executing pvfs2_pjmp_call_msgpairarray_sm:"
+                                    "call_msgpairarray....\n");
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tframe count is %d.\n",smcb->frame_count);
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\t base frame is %d.\n",smcb->base_frame);
+   struct PINT_server_op *mirror_op = PINT_sm_frame(smcb,PINT_FRAME_CURRENT);
+   PINT_sm_msgarray_op *m_op = &(mirror_op->msgarray_op);
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tmirror_op:%p\n",mirror_op);
+
+   js_p->error_code = 0;
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tm_op->msgpair.req.op:%d\n"
+                                    ,m_op->msgpair.req.op );
+
+   PINT_sm_push_frame(smcb,0,m_op);
+   
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tAFTER PUSH:smcb->base_frame:%d"
+                                    "\tframe_count:%d\n"
+                                   ,smcb->base_frame,smcb->frame_count);
+
+   return SM_ACTION_COMPLETE;
+}/*end action call_msgpairarray*/
+
+static PINT_sm_action cleanup_msgpairarray (struct PINT_smcb *smcb
+                                           ,job_status_s *js_p)
+{   
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"Executing IMM_COPIES:cleanup_msgpairarray"
+                                    "....\n");
+   struct PINT_server_op *mirror_op = PINT_sm_frame(smcb,PINT_FRAME_CURRENT);
+   PINT_sm_msgarray_op *m_op = &(mirror_op->msgarray_op);
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tmirror_op:%p\n",mirror_op);
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tjs_p->error_code:%d\n"
+                                   ,js_p->error_code);
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tBEFORE POP:smcb->frame_base:%d"
+                                    "\tframe_count:%d\n"
+                                   ,smcb->base_frame,smcb->frame_count);
+
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tm_op->msgpair.req.op:%d\n"
+                                    ,m_op->msgpair.req.op );
+
+   gossip_debug(GOSSIP_MSGPAIR_DEBUG,"\tmirror_op->resp.status:%d\n"
+                                   ,mirror_op->resp.status);
+
+   return SM_ACTION_TERMINATE;
+}/*end action cleanup_msgpairarray*/
+
+
+/*
+ * Local variables:
+ *  mode: c
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ *
+ * vim: ft=c ts=8 sts=4 sw=4 expandtab
+ */
diff -Naupr pvfs-2.8.2-orig/src/server/pvfs2-server.h pvfs-2.8.2-pjmp/src/server/pvfs2-server.h
--- pvfs-2.8.2-orig/src/server/pvfs2-server.h	2010-02-04 13:40:11.000000000 -0500
+++ pvfs-2.8.2-pjmp/src/server/pvfs2-server.h	2011-04-07 17:37:16.000000000 -0400
@@ -502,8 +502,16 @@ void PINT_server_access_debug(PINT_serve
                               const char * format,
                               ...) __attribute__((format(printf, 3, 4)));
 
+/* server side state machines */
+extern struct PINT_state_machine_s pvfs2_pjmp_call_msgpairarray_sm;
+extern struct PINT_state_machine_s pvfs2_pjmp_get_attr_with_prelude_sm;
+extern struct PINT_state_machine_s pvfs2_pjmp_remove_work_sm;
+extern struct PINT_state_machine_s pvfs2_pjmp_get_attr_work_sm;
+extern struct PINT_state_machine_s pvfs2_get_attr_with_prelude_sm;
+
 /* nested state machines */
 extern struct PINT_state_machine_s pvfs2_get_attr_work_sm;
+extern struct PINT_state_machine_s pvfs2_get_attr_with_prelude_sm;
 extern struct PINT_state_machine_s pvfs2_prelude_sm;
 extern struct PINT_state_machine_s pvfs2_prelude_work_sm;
 extern struct PINT_state_machine_s pvfs2_final_response_sm;
