diff --git a/NEWS b/NEWS
index a3012249c4c4fb1550f5cbc1e4139d81d804be2a..b90e5c199a89e360ee27551983f76021bdb1962a 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,9 @@ documents those changes that are of interest to users and admins.
  -- Added sbatch '--parsable' option to output only the job id number and the
     cluster name separated by a semicolon. Errors will still be displayed.
  -- Added failure management "slurmctld/nonstop" plugin.
+ -- Remove the SLURM_PMI_KVS_NO_DUP_KEYS functionality from PMI support,
+    the PMI protocol does not accept duplicate keys. If there already
+    is an entry with the same key, the old value is replaced.
 
 * Changes in Slurm 14.03.0pre6
 ==============================
diff --git a/doc/man/man1/srun.1 b/doc/man/man1/srun.1
index d3ef73326485f4f387f7448e36728af78a37b081..72644e1598779473525de4072699e0d074ebc851 100644
--- a/doc/man/man1/srun.1
+++ b/doc/man/man1/srun.1
@@ -2039,11 +2039,6 @@ Same as \fB\-O, \-\-overcommit\fR
 \fBSLURM_PARTITION\fR
 Same as \fB\-p, \-\-partition\fR
 .TP
-\fBSLURM_PMI_KVS_NO_DUP_KEYS\fR
-If set, then PMI key\-pairs will contain no duplicate keys.
-This is the case for MPICH2 and reduces overhead in testing for duplicates
-for improved performance
-.TP
 \fBSLURM_PROFILE\fR
 Same as \fB\-\-profile\fR
 .TP
diff --git a/src/api/pmi.c b/src/api/pmi.c
index 27cca1c836c154bdca70842df194eda8735e0c76..2af8451c54a75deeebdd924423e86e69f13a2275 100644
--- a/src/api/pmi.c
+++ b/src/api/pmi.c
@@ -149,7 +149,6 @@ int pmi_size;
 int pmi_spawned;
 int pmi_rank;
 int pmi_debug;
-static int pmi_kvs_no_dup_keys = 0;
 
 static pthread_mutex_t kvs_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -196,12 +195,6 @@ int PMI_Init( int *spawned )
 	if (pmi_debug)
 		fprintf(stderr, "In: PMI_Init\n");
 
-	env = getenv("SLURM_PMI_KVS_NO_DUP_KEYS");
-	if (env)
-		pmi_kvs_no_dup_keys = 1;
-	else
-		pmi_kvs_no_dup_keys = 0;
-
 	if (spawned == NULL)
 		return PMI_ERR_INVALID_ARG;
 
@@ -1121,10 +1114,6 @@ static int _kvs_put( const char kvsname[], const char key[], const char value[],
 	for (i=0; i<kvs_rec_cnt; i++) {
 		if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN))
 			continue;
-		if (pmi_kvs_no_dup_keys) {
-			j = kvs_recs[i].kvs_cnt;
-			goto no_dup;
-		}
 		/* search for duplicate key */
 		for (j=0; j<kvs_recs[i].kvs_cnt; j++) {
 			if (strncmp(kvs_recs[i].kvs_keys[j], key,
@@ -1147,7 +1136,7 @@ static int _kvs_put( const char kvsname[], const char key[], const char value[],
 			}
 			goto fini;
 		}
-no_dup:
+
 		/* create new key */
 		kvs_recs[i].kvs_cnt++;
 		kvs_recs[i].kvs_key_states = realloc(kvs_recs[i].kvs_key_states,
@@ -1753,7 +1742,7 @@ int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp,
 	if  (pmi_debug)
 		fprintf(stderr, "In: PMI_Args_to_keyval \n");
 
-	if ((keyvalp == NULL) || (size == NULL) || 
+	if ((keyvalp == NULL) || (size == NULL) ||
 	    (argcp == NULL) || (argvp == NULL))
 		return PMI_ERR_INVALID_ARG;
 
diff --git a/src/api/pmi_server.c b/src/api/pmi_server.c
index d135ad91c278f3667b4f27cd9e2818ce0e83ee3f..73f66172193c49369a0eea876862d8b0f25145ab 100644
--- a/src/api/pmi_server.c
+++ b/src/api/pmi_server.c
@@ -58,8 +58,6 @@ static int min_time_kvs_put = 1000000;
 static int max_time_kvs_put = 0;
 static int tot_time_kvs_put = 0;
 
-static int pmi_kvs_no_dup_keys = 0;
-
 struct barrier_resp {
 	uint16_t port;
 	char *hostname;
@@ -315,8 +313,8 @@ struct kvs_comm **_kvs_comm_dup(void)
 		rc_kvs[i]->kvs_values =
 				xmalloc(sizeof(char *) * rc_kvs[i]->kvs_cnt);
 		if (kvs_comm_ptr[i]->kvs_key_sent == NULL) {
-			kvs_comm_ptr[i]->kvs_key_sent = 
-				xmalloc(sizeof(uint16_t) * 
+			kvs_comm_ptr[i]->kvs_key_sent =
+				xmalloc(sizeof(uint16_t) *
 				kvs_comm_ptr[i]->kvs_cnt);
 		}
 		cnt = 0;
@@ -354,8 +352,6 @@ static void _merge_named_kvs(struct kvs_comm *kvs_orig,
 	int i, j;
 
 	for (i=0; i<kvs_new->kvs_cnt; i++) {
-		if (pmi_kvs_no_dup_keys)
-			goto no_dup;
 		for (j=0; j<kvs_orig->kvs_cnt; j++) {
 			if (strcmp(kvs_new->kvs_keys[i], kvs_orig->kvs_keys[j]))
 				continue;
@@ -368,7 +364,6 @@ static void _merge_named_kvs(struct kvs_comm *kvs_orig,
 		}
 		if (j < kvs_orig->kvs_cnt)
 			continue;	/* already recorded, update */
-no_dup:
 		/* append it */
 		kvs_orig->kvs_cnt++;
 		xrealloc(kvs_orig->kvs_keys,
@@ -383,7 +378,7 @@ no_dup:
 	}
 	if (kvs_orig->kvs_key_sent) {
 		xrealloc(kvs_orig->kvs_key_sent,
-			 (sizeof(uint16_t) * kvs_orig->kvs_cnt)); 
+			 (sizeof(uint16_t) * kvs_orig->kvs_cnt));
 	}
 }
 
@@ -415,17 +410,8 @@ extern int pmi_kvs_put(struct kvs_comm_set *kvs_set_ptr)
 {
 	int i, usec_timer;
 	struct kvs_comm *kvs_ptr;
-	static int pmi_kvs_no_dup_keys_set = 0;
 	DEF_TIMERS;
 
-	if (pmi_kvs_no_dup_keys_set == 0) {
-		char *env = getenv("SLURM_PMI_KVS_NO_DUP_KEYS");
-		if (env) 
-			pmi_kvs_no_dup_keys = 1;
-		else 
-			pmi_kvs_no_dup_keys = 0;
-		pmi_kvs_no_dup_keys_set = 1;
-	}
 	/* Merge new data with old.
 	 * NOTE: We just move pointers rather than copy data where
 	 * possible for improved performance */
diff --git a/src/plugins/mpi/pmi2/kvs.c b/src/plugins/mpi/pmi2/kvs.c
index c7d4e426c959b0edf6ce1956f7d94c3807e53168..f87dcacda7eea86074bec7f12fe09cdc9eb79a36 100644
--- a/src/plugins/mpi/pmi2/kvs.c
+++ b/src/plugins/mpi/pmi2/kvs.c
@@ -66,8 +66,6 @@ static char *temp_kvs_buf = NULL;
 static int temp_kvs_cnt = 0;
 static int temp_kvs_size = 0;
 
-static int no_dup_keys = 0;
-
 #define TASKS_PER_BUCKET 8
 #define TEMP_KVS_SIZE_INC 2048
 
@@ -234,9 +232,6 @@ kvs_init(void)
 
 	kvs_hash = xmalloc(hash_size * sizeof(kvs_bucket_t));
 
-	if (getenv(PMI2_KVS_NO_DUP_KEYS_ENV))
-		no_dup_keys = 1;
-
 	return SLURM_SUCCESS;
 }
 
@@ -277,17 +272,16 @@ kvs_put(char *key, char *val)
 
 	bucket = &kvs_hash[HASH(key)];
 
-	if (! no_dup_keys) {
-		for (i = 0; i < bucket->count; i ++) {
-			if (! strcmp(key, bucket->pairs[KEY_INDEX(i)])) {
-				/* replace the k-v pair */
-				xfree(bucket->pairs[VAL_INDEX(i)]);
-				bucket->pairs[VAL_INDEX(i)] = xstrdup(val);
-				debug("mpi/pmi2: put kvs %s=%s", key, val);
-				return SLURM_SUCCESS;
-			}
+	for (i = 0; i < bucket->count; i ++) {
+		if (! strcmp(key, bucket->pairs[KEY_INDEX(i)])) {
+			/* replace the k-v pair */
+			xfree(bucket->pairs[VAL_INDEX(i)]);
+			bucket->pairs[VAL_INDEX(i)] = xstrdup(val);
+			debug("mpi/pmi2: put kvs %s=%s", key, val);
+			return SLURM_SUCCESS;
 		}
 	}
+
 	if (bucket->count * 2 >= bucket->size) {
 		bucket->size += (TASKS_PER_BUCKET * 2);
 		xrealloc(bucket->pairs, bucket->size * sizeof(char *));
diff --git a/src/plugins/mpi/pmi2/pmi.h b/src/plugins/mpi/pmi2/pmi.h
index 3703870fc0a79b66a1473980dcf742f7a96292b1..e21309b222313c0b33759f096c28e2da82124dfb 100644
--- a/src/plugins/mpi/pmi2/pmi.h
+++ b/src/plugins/mpi/pmi2/pmi.h
@@ -234,8 +234,6 @@
 #define SLURM_STEP_RESV_PORTS   "SLURM_STEP_RESV_PORTS"
 /* old PMIv1 envs */
 #define PMI2_PMI_DEBUGGED_ENV   "PMI_DEBUG"
-#define PMI2_KVS_NO_DUP_KEYS_ENV "SLURM_PMI_KVS_NO_DUP_KEYS"
-
 
 extern int handle_pmi1_cmd(int fd, int lrank);
 extern int handle_pmi2_cmd(int fd, int lrank);