diff --git a/workflow.module b/workflow.module
index d5cfc1d..a3ca708 100644
--- a/workflow.module
+++ b/workflow.module
@@ -219,6 +219,8 @@ function workflow_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
         $keys = array_keys($choices);
         $sid = array_shift($keys);
       }
+      // Prep the internal cache 
+      workflow_node_current_state($node, workflow_get_creation_state_for_type($node->type));
       // Note no break; fall through to 'update' case.
     case 'update':
       // Do nothing if there is no workflow for this node type.
@@ -724,24 +726,46 @@ function workflow_field_choices($node) {
  * Get the current state of a given node.
  *
  * @param $node
- *   The node to check.
+ *   The node to check
+ * @param $sid
+ *   An sid to set the cache to.
+ * @param $reset
+ *   Reset the internal cache.
+ *
  * @return
  *   The ID of the current state.
  */
-function workflow_node_current_state($node) {
-  $sid = FALSE;
+function workflow_node_current_state($node, $sid = NULL, $reset = FALSE) {
+  static $states = array();
 
-  // There is no nid when creating a node.
-  if (!empty($node->nid)) {
-    $sid = db_result(db_query('SELECT sid FROM {workflow_node} WHERE nid = %d', $node->nid));
+  if ($reset) {
+    $states = array();
   }
 
-  if (!$sid && !empty($node->type)) {
-    // No current state. Use creation state.
-    $wid = workflow_get_workflow_for_type($node->type);
-    $sid = _workflow_creation_state($wid);
+  // No valid input supplied.
+  if (empty($node->nid) && empty($node->type)) {
+    return;
   }
-  return $sid;
+
+  $key = !empty($node->nid) ? $node->nid : $node->type;
+
+  if ($sid) {
+    $states[$key] = $sid;
+  }
+
+  if (!isset($states[$key])) {
+    // There is no nid when creating a node.
+    if (!empty($node->nid)) {
+      $states[$key] = db_result(db_query('SELECT sid FROM {workflow_node} WHERE nid = %d', $node->nid));
+    }
+
+    if (empty($states[$key]) && !empty($node->type)) {
+      // No current state. Use creation state.
+      $states[$key] = workflow_get_creation_state_for_type($node->type);
+    }
+  }
+
+  return $states[$key];
 }
 
 /**
@@ -991,6 +1015,19 @@ function workflow_get_workflow_for_type($type) {
 }
 
 /**
+ * Get ID of a creation state for a node type.
+ *
+ * @param $type
+ *   Machine readable node type name, e.g. 'story'.
+ * @return int
+ *   The ID of the creation state sid.
+ */
+
+function workflow_get_creation_state_for_type($type) {
+  return _workflow_creation_state(workflow_get_workflow_for_type($type));
+}
+
+/**
  * Get names and IDs of all workflows from the database.
  *
  * @return
@@ -1394,6 +1431,8 @@ function _workflow_node_to_state($node, $sid, $comment = NULL) {
   else {
     db_query("INSERT INTO {workflow_node} (nid, sid, uid, stamp) VALUES (%d, %d, %d, %d)", $node->nid, $sid, $user->uid, $node->workflow_stamp);
   }
+  // Prep/update the internal cache.
+  workflow_node_current_state($node, $sid);
   _workflow_write_history($node, $sid, $comment);
 }
 
