diff --git a/NEWS b/NEWS
index cb37208d62b5022fa27acdd2f84d78f81a2bf70a..a489a3b86e5e8ee3ec6720437be6e6801f937393 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,7 @@ documents those changes that are of interest to users and admins.
  -- changed AC_CHECK_LIB to AC_SEARCH_LIBS to avoid extra libs in
     compile lines.
  -- Patch from Matthieu Hautreux to improve error message in slurmd/req.c
+ -- Added support for split groups from (Matthiu Hautreux CEA)
 
 * Changes in SLURM 2.1.0-pre7
 =============================
diff --git a/src/slurmctld/partition_mgr.c b/src/slurmctld/partition_mgr.c
index 89f91659b89e1d5a6935eb8c8b7f86dbc757f84b..3b24c459a8ec5050ea1095c7ee7010be8c28fd13 100644
--- a/src/slurmctld/partition_mgr.c
+++ b/src/slurmctld/partition_mgr.c
@@ -46,7 +46,6 @@
 
 #include <ctype.h>
 #include <errno.h>
-#include <grp.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -69,6 +68,17 @@
 #include "src/slurmctld/slurmctld.h"
 #include "src/slurmctld/state_save.h"
 
+/* needed for getgrent_r */
+#ifndef   _GNU_SOURCE
+#  define _GNU_SOURCE
+#endif
+#ifndef   __USE_GNU
+#define   __USE_GNU
+#endif
+
+#include <grp.h>
+
+
 /* Change PART_STATE_VERSION value when changing the state save format */
 #define PART_STATE_VERSION      "VER002"
 
@@ -1238,27 +1248,64 @@ uid_t *_get_group_members(char *group_name)
 
 	my_gid = grp_result->gr_gid;
 
-	for (uid_cnt=0; ; uid_cnt++) {
-		if (grp_result->gr_mem[uid_cnt] == NULL)
-			break;
+	/* MH-CEA workaround to handle different group entries with
+	 * the same gid */
+	uid_cnt=0;
+#ifdef HAVE_AIX
+	setgrent_r(&fp);
+	while (getgrent_r(&grp, grp_buffer, PW_BUF_SIZE,
+			  &grp_result, &fp) == 0 && grp_result != NULL) {
+#else
+	setgrent();
+	while (getgrent_r(&grp, grp_buffer, PW_BUF_SIZE,
+			  &grp_result) == 0 && grp_result != NULL) {
+#endif
+	        if (grp_result->gr_gid == my_gid) {
+		        for (i=0 ; grp_result->gr_mem[i] != NULL ; i++) {
+				uid_cnt++;
+			}
+		}
 	}
 
 	group_uids = (uid_t *) xmalloc(sizeof(uid_t) * (uid_cnt + 1));
 
-	j = 0;
-	for (i=0; i<uid_cnt; i++) {
-		if (uid_from_string (grp_result->gr_mem[i], &my_uid) < 0)
-			error("Could not find user %s in configured group %s",
-			      grp_result->gr_mem[i], group_name);
-		else if (my_uid)
-			group_uids[j++] = my_uid;
+	j=0;
+#ifdef HAVE_AIX
+	setgrent_r(&fp);
+	while (getgrent_r(&grp, grp_buffer, PW_BUF_SIZE,
+			  &grp_result, &fp) == 0 && grp_result != NULL) {
+#else
+	setgrent();
+	while (getgrent_r(&grp, grp_buffer, PW_BUF_SIZE,
+			  &grp_result) == 0 && grp_result != NULL) {
+#endif
+	        if (grp_result->gr_gid == my_gid) {
+			if (strcmp(grp_result->gr_name, group_name))
+				debug("including members of group '%s' as it "
+				      "corresponds to the same gid as group"
+				      " '%s'",grp_result->gr_name,group_name);
+
+		        for (i=0; j < uid_cnt; i++) {
+			        if (grp_result->gr_mem[i] == NULL)
+			                break;
+				if (uid_from_string(grp_result->gr_mem[i], 
+						    &my_uid) < 0)
+				        error("Could not find user %s in "
+					      "configured group %s",
+					      grp_result->gr_mem[i],
+					      group_name);
+				else if (my_uid)
+				        group_uids[j++] = my_uid; 
+			}
+		}
 	}
-
 #ifdef HAVE_AIX
+	endgrent_r(&fp);
 	setpwent_r(&fp);
 	while (!getpwent_r(&pw, pw_buffer, PW_BUF_SIZE, &fp)) {
 		pwd_result = &pw;
 #else
+	endgrent();
 	setpwent();
 #if defined (__sun)
 	while ((pwd_result = getpwent_r(&pw, pw_buffer, PW_BUF_SIZE)) != NULL) {