diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index fcf7ae857380e5b93248ae717dc30815b58877ae..cb61a08f3ba3b72cef009bbdbeda429f5d6a999a 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -63,7 +63,7 @@ void free_libblock_us(struct ListBase *lb, void *idv);
 void free_main(struct Main *mainvar);
 void tag_main(struct Main *mainvar, int tag);
 
-int splitIDname(char *name, char *left, int *nr);
+void splitIDname(char *name, char *left, int *nr);
 void rename_id(struct ID *id, char *name);
 void test_idbutton(char *name);
 void text_idbutton(struct ID *id, char *text);
@@ -85,3 +85,4 @@ void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowMa
 #define ID_FALLBACK_NAME "Untitled"
 
 #endif
+
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 8b035ff1bba831a267f107cdb21f2e5a658a64d1..fdc98d9ed29bf1a65430aace33c70a063697c4d0 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -995,7 +995,7 @@ void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb
 
 
 /* used by buttons.c library.c mball.c */
-int splitIDname(char *name, char *left, int *nr)
+void splitIDname(char *name, char *left, int *nr)
 {
 	int a;
 	
@@ -1003,21 +1003,19 @@ int splitIDname(char *name, char *left, int *nr)
 	strncpy(left, name, 21);
 	
 	a= strlen(name);
-	if(a>1 && name[a-1]=='.') return a;
+	if(a>1 && name[a-1]=='.') return;
 	
 	while(a--) {
 		if( name[a]=='.' ) {
 			left[a]= 0;
 			*nr= atol(name+a+1);
-			return a;
+			return;
 		}
 		if( isdigit(name[a])==0 ) break;
 		
 		left[a]= 0;
 	}
 	strcpy(left, name);	
-
-	return a;
 }
 
 static void sort_alpha_id(ListBase *lb, ID *id)
@@ -1079,7 +1077,8 @@ static ID *is_dupid(ListBase *lb, ID *id, char *name)
 static int check_for_dupid(ListBase *lb, ID *id, char *name)
 {
 	ID *idtest;
-	int nr= 0, nrtest, a, left_len;
+	int nr= 0, nrtest, a;
+	const int maxtest=32;
 	char left[32], leftest[32], in_use[32];
 
 	/* make sure input name is terminated properly */
@@ -1096,25 +1095,22 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
 
 		/* we have a dup; need to make a new name */
 		/* quick check so we can reuse one of first 32 ids if vacant */
-		memset(in_use, 0, sizeof(in_use));
+		memset(in_use, 0, maxtest);
 
 		/* get name portion, number portion ("name.number") */
-		left_len= splitIDname(name, left, &nr);
+		splitIDname( name, left, &nr);
 
 		/* if new name will be too long, truncate it */
 		if(nr>999 && strlen(left)>16) left[16]= 0;
 		else if(strlen(left)>17) left[17]= 0;
 
-		if(left_len) {
-			for(idtest= lb->first; idtest; idtest= idtest->next) {
-				if(		(id != idtest) &&
-						(idtest->lib == NULL) &&
-						(*name == *(idtest->name+2)) &&
-						(strncmp(name, idtest->name+2, left_len)==0) &&
-						(splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
-
-				) {
-					if(nrtest < sizeof(in_use))
+		for( idtest = lb->first; idtest; idtest = idtest->next ) {
+			if( id != idtest && idtest->lib == NULL ) {
+				splitIDname(idtest->name+2, leftest, &nrtest);
+				/* if base names match... */
+				/* optimized */
+				if( *left == *leftest && strcmp(left, leftest)==0 ) {
+					if(nrtest < maxtest)
 						in_use[nrtest]= 1;	/* mark as used */
 					if(nr <= nrtest)
 						nr= nrtest+1;		/* track largest unused */
@@ -1123,7 +1119,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
 		}
 
 		/* decide which value of nr to use */
-		for(a=0; a < sizeof(in_use); a++) {
+		for(a=0; a<maxtest; a++) {
 			if(a>=nr) break;	/* stop when we've check up to biggest */
 			if( in_use[a]==0 ) { /* found an unused value */
 				nr = a;
@@ -1133,9 +1129,8 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
 
 		/* If the original name has no numeric suffix, 
 		 * rather than just chopping and adding numbers, 
-		 * shave off the end chars until we have a unique name.
-		 * Check the null terminators match as well so we dont get Cube.000 -> Cube.00 */
-		if (nr==0 && name[left_len] == left[left_len]) {
+		 * shave off the end chars until we have a unique name */
+		if (nr==0) {
 			int len = strlen(name)-1;
 			idtest= is_dupid(lb, id, name);
 			
@@ -1394,3 +1389,4 @@ void rename_id(ID *id, char *name)
 	
 	new_id(lb, id, name);				
 }
+