diff --git a/src/api/pmi.c b/src/api/pmi.c
index edbcb04ab284569825c48cce5e7c3891e41f8cf0..bfda4c6a21c9064065b3c38b26920b01cfdbe536 100644
--- a/src/api/pmi.c
+++ b/src/api/pmi.c
@@ -93,9 +93,13 @@
 #define PMI_MAX_KVSNAME_LEN 256	/* Maximum size of KVS name */
 #define PMI_MAX_VAL_LEN  256	/* Maximum size of a PMI value */
 
+#define KVS_STATE_LOCAL    0
+#define KVS_STATE_DEFUNCT  1
+
 /* default key names form is jobid.stepid[.sequence] */
 struct kvs_rec {
 	char *	kvs_name;
+	int	kvs_state;	/* see KVS_STATE_* */
 	int	kvs_cnt;
 	int	kvs_inx;	/* iteration index */
 	char **	kvs_keys;
@@ -267,7 +271,6 @@ static void _del_kvs_rec(struct kvs_rec *kvs_ptr)
 	}
 	if (kvs_ptr->kvs_name)
 		free(kvs_ptr->kvs_name);
-	free(kvs_ptr);
 	return;
 }
 
@@ -807,13 +810,25 @@ parameter, kvsname, must be at least as long as the value returned by
 @*/
 int PMI_KVS_Create( char kvsname[], int length )
 {
+	int size, rc;
+
 	if (kvsname == NULL)
 		return PMI_ERR_INVALID_ARG;
-	if (length < PMI_MAX_KVSNAME_LEN)
-		return PMI_ERR_INVALID_LENGTH;
+	if ((pmi_jobid < 0) || (pmi_stepid < 0))
+		return PMI_FAIL;
 
-	/* FIXME */
-	return PMI_FAIL;
+	pthread_mutex_lock(&kvs_mutex);
+	size = snprintf(kvsname, length, "%ld.%ld.%d.%d", pmi_jobid, 
+			pmi_stepid, pmi_rank, kvs_name_sequence);
+	if (size >= length)	/* truncated */
+		rc = PMI_ERR_INVALID_LENGTH;
+	else {
+		kvs_name_sequence++;
+		_init_kvs(kvsname);
+		rc = PMI_SUCCESS;
+	}
+	pthread_mutex_unlock(&kvs_mutex);
+	return rc;
 }
 
 /*@
@@ -833,11 +848,23 @@ This function destroys a keyval space created by 'PMI_KVS_Create()'.
 @*/
 int PMI_KVS_Destroy( const char kvsname[] )
 {
+	int i, found = 0;
+
 	if (kvsname == NULL)
 		return PMI_ERR_INVALID_ARG;
 
-	/* FIXME */
-	return PMI_FAIL;
+	pthread_mutex_lock(&kvs_mutex);
+	for (i=0; i<kvs_rec_cnt; i++) {
+		if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN))
+			continue;
+		kvs_recs[i].kvs_state = KVS_STATE_DEFUNCT;
+		found = 1;
+		break;
+	}
+	pthread_mutex_unlock(&kvs_mutex);
+	if (found == 0)
+		return PMI_ERR_INVALID_ARG;
+	return PMI_SUCCESS;
 }
 
 /*@
@@ -983,6 +1010,8 @@ int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int lengt
 	/* find the proper kvs record */
 	pthread_mutex_lock(&kvs_mutex);
 	for (i=0; i<kvs_rec_cnt; i++) {
+		if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT)
+			continue;
 		if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN))
 			continue;
 		for (j=0; j<kvs_recs[i].kvs_cnt; j++) {
@@ -1049,6 +1078,8 @@ int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[]
 	/* find the proper kvs record */
 	pthread_mutex_lock(&kvs_mutex);
 	for (i=0; i<kvs_rec_cnt; i++) {
+		if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT)
+			continue;
 		if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN))
 			continue;
 		kvs_recs[i].kvs_inx = 0;
@@ -1121,6 +1152,8 @@ int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len,
 	/* find the proper kvs record */
 	pthread_mutex_lock(&kvs_mutex);
 	for (i=0; i<kvs_rec_cnt; i++) {
+		if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT)
+			continue;
 		if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN))
 			continue;
 		kvs_recs[i].kvs_inx++;
diff --git a/testsuite/expect/test7.2.prog.c b/testsuite/expect/test7.2.prog.c
index 3ef94e081a4c808bcff2ba0c2ba5f57ca60a9a98..5952fd40f5ab3dffa55f1f31ca3a12082adf8941 100644
--- a/testsuite/expect/test7.2.prog.c
+++ b/testsuite/expect/test7.2.prog.c
@@ -175,21 +175,49 @@ main (int argc, char **argv)
 	for (i=0; ; i++) {
 		if (key[0] == '\0') {
 			if (i != (pmi_size * 2)) {
-				printf("FAILURE: PMI_KVS_iter_next cycle count(%d, %d)\n",
-					i, pmi_size);
+				printf("FAILURE: PMI_KVS_iter_next cycle count"
+					"(%d, %d)\n", i, pmi_size);
 			}
 			break;
 		}
-		printf("PMI_KVS_Iter_next(%s,%d): %s=%s\n", kvs_name, i, key, val);
-		if ((rc = PMI_KVS_Iter_next(kvs_name, key, key_len, val, val_len)) != 
-				PMI_SUCCESS) {
+		printf("PMI_KVS_Iter_next(%s,%d): %s=%s\n", kvs_name, i, key, 
+				val);
+		if ((rc = PMI_KVS_Iter_next(kvs_name, key, key_len, val, 
+				val_len)) != PMI_SUCCESS) {
 			printf("FAILURE: PMI_KVS_iter_next: %d\n", rc);
 			exit(1);
 		}
 	}
 
+	/* create new keyspace and test it */
+	if ((rc = PMI_KVS_Create(kvs_name, kvs_name_len)) != PMI_SUCCESS) {
+		printf("FAILURE: PMI_KVS_Create: %d\n", rc);
+		exit(1);
+	}
+	printf("PMI_KVS_Create %s\n", kvs_name);
+	if ((rc = PMI_KVS_Put(kvs_name, "KVS_KEY", "KVS_VAL")) != PMI_SUCCESS) {
+		printf("FAILURE: PMI_KVS_Put: %d\n", rc);
+		exit(1);
+	}
+	printf("PMI_KVS_Put(%s,KVS_KEY,KVS_VAL)\n", kvs_name);
+	if ((rc =  PMI_KVS_Get(kvs_name, "KVS_KEY", val, val_len)) != 
+			PMI_SUCCESS) {
+		printf("FAILURE: PMI_KVS_Get: %d\n", rc);
+		exit(1);
+	}
+	printf("PMI_KVS_Get(%s,%s) %s\n", kvs_name, "KVS_KEY", val);
+	if ((rc = PMI_KVS_Destroy(kvs_name)) != PMI_SUCCESS) {
+		printf("FAILURE: PMI_KVS_Destroy(%s): %d\n", kvs_name, rc);
+		exit(1);
+	}
+	if ((rc =  PMI_KVS_Get(kvs_name, "KVS_KEY", val, val_len)) != 
+			PMI_ERR_INVALID_KVS) {
+		printf("FAILURE: PMI_KVS_Get: %d\n", rc);
+		exit(1);
+	}
+
 	if ((rc = PMI_Finalize()) != PMI_SUCCESS) {
-		printf("FAILURE: PMI_Finalize: %\n", rc);
+		printf("FAILURE: PMI_Finalize: %d\n", rc);
 		exit(1);
 	}