Index: src/stats.c
===================================================================
--- src/stats.c	(revision 9311)
+++ src/stats.c	(working copy)
@@ -90,7 +90,7 @@
 static UDWORD	maxWeaponROF;
 static UDWORD	maxPropulsionSpeed;
 
-//stores for each players component states - can be either UNAVAILABLE, FOUND or AVAILABLE
+//stores for each players component states - can be either UNAVAILABLE, REDUNDANT, FOUND or AVAILABLE
 UBYTE		*apCompLists[MAX_PLAYERS][COMP_NUMCOMPONENTS];
 
 //store for each players Structure states
@@ -174,7 +174,7 @@
 	numConstructStats = 0;
 	numSpecialAbility = 0;
 
-	//stores for each players component states - can be either UNAVAILABLE, FOUND or AVAILABLE
+	//stores for each players component states - can be either UNAVAILABLE, REDUNDANT, FOUND or AVAILABLE
 	for(i=0; i<MAX_PLAYERS; i++) {
 		for(j=0; j<COMP_NUMCOMPONENTS; j++) {
 			apCompLists[i][j] = NULL;
Index: src/stats.h
===================================================================
--- src/stats.h	(revision 9303)
+++ src/stats.h	(working copy)
@@ -98,6 +98,7 @@
 #define AVAILABLE				0x01		//this item can be used to design droids
 #define UNAVAILABLE				0x02		//the player does not know about this item
 #define FOUND					0x04		//this item has been found, but is unresearched
+#define REDUNDANT				0x0A		//the player no longer needs this item
 
 /*******************************************************************************
 *		Allocate stats functions
Index: src/display.c
===================================================================
--- src/display.c	(revision 9303)
+++ src/display.c	(working copy)
@@ -875,7 +875,7 @@
 				{
 					for (i=0;(i<numStructureStats)&&(asStructureStats[i].type != REF_RESOURCE_EXTRACTOR);i++);	// find resource stat
 					{
-						if( (i < numStructureStats) && (apStructTypeLists[selectedPlayer][i] == UNAVAILABLE))		// check if you can build it!
+						if( (i < numStructureStats) && (apStructTypeLists[selectedPlayer][i] != AVAILABLE))		// check if you can build it!
 						{
 							item = MT_BLOCKING;				// don't allow build pointer.
 						}
Index: src/game.c
===================================================================
--- src/game.c	(revision 9303)
+++ src/game.c	(working copy)
@@ -9571,7 +9571,7 @@
 			continue;
 		}
 		if (psSaveCompList->state != UNAVAILABLE && psSaveCompList->state !=
-			AVAILABLE && psSaveCompList->state != FOUND)
+			AVAILABLE && psSaveCompList->state != FOUND && psSaveCompList->state != REDUNDANT)
 		{
 			//ignore this record
 			continue;
@@ -9623,7 +9623,7 @@
 			continue;
 		}
 		if (psSaveCompList->state != UNAVAILABLE && psSaveCompList->state !=
-			AVAILABLE && psSaveCompList->state != FOUND)
+			AVAILABLE && psSaveCompList->state != FOUND && psSaveCompList->state != REDUNDANT)
 		{
 			//ignore this record
 			continue;
@@ -9877,7 +9877,7 @@
 			continue;
 		}
 		if (psSaveStructList->state != UNAVAILABLE && psSaveStructList->state !=
-			AVAILABLE && psSaveStructList->state != FOUND)
+			AVAILABLE && psSaveStructList->state != FOUND && psSaveStructList->state != REDUNDANT)
 		{
 			//ignore this record
 			continue;
@@ -9936,7 +9936,7 @@
 			continue;
 		}
 		if (psSaveStructList->state != UNAVAILABLE && psSaveStructList->state !=
-			AVAILABLE && psSaveStructList->state != FOUND)
+			AVAILABLE && psSaveStructList->state != FOUND && psSaveStructList->state != REDUNDANT)
 		{
 			//ignore this record
 			continue;
Index: src/research.c
===================================================================
--- src/research.c	(revision 9335)
+++ src/research.c	(working copy)
@@ -1254,13 +1254,16 @@
 	//check for structures to be made available
 	for (inc = 0; inc < pResearch->numStructResults; inc++)
 	{
-		apStructTypeLists[player][pResearch->pStructureResults[inc]] = AVAILABLE;
+		if (apStructTypeLists[player][pResearch->pStructureResults[inc]] != REDUNDANT)
+		{
+			apStructTypeLists[player][pResearch->pStructureResults[inc]] = AVAILABLE;
+		}
 	}
 
 	//check for structures to be made redundant
 	for (inc = 0; inc < pResearch->numRedStructs; inc++)
 	{
-		apStructTypeLists[player][pResearch->pRedStructs[inc]] = UNAVAILABLE;
+		apStructTypeLists[player][pResearch->pRedStructs[inc]] = REDUNDANT;
 	}
 
 	//check for artefacts to be made available
@@ -1270,7 +1273,10 @@
 		type = statType(pResearch->pArtefactResults[inc]->ref);
 		//set the component state to AVAILABLE
 		compInc = pResearch->pArtefactResults[inc]->ref - statRefStart(type);
-		apCompLists[player][type][compInc] = AVAILABLE;
+		if (apCompLists[player][type][compInc] != REDUNDANT)
+		{
+			apCompLists[player][type][compInc] = AVAILABLE;
+		}
 		//check for default sensor
 		if (type == COMP_SENSOR)
 		{
@@ -1304,7 +1310,7 @@
 			type = statType(pResearch->pReplacedArtefacts[inc]->ref);
 			//set the component state to AVAILABLE
 			compInc = pResearch->pReplacedArtefacts[inc]->ref - statRefStart(type);
-			apCompLists[player][type][compInc] = UNAVAILABLE;
+			apCompLists[player][type][compInc] = REDUNDANT;
 		}
 		//check if the component is a brain
 		if (type == COMP_BRAIN)
@@ -1326,9 +1332,9 @@
 	{
 		//determine the type of artefact
 		type = statType(pResearch->pRedArtefacts[inc]->ref);
-		//set the component state to UNAVAILABLE
+		//set the component state to REDUNDANT
 		apCompLists[player][type][pResearch->pRedArtefacts[inc]->ref -
-			statRefStart(type)] = UNAVAILABLE;
+			statRefStart(type)] = REDUNDANT;
 	}
 
 	//check for technology effects

