public IEnumerator TransferData(ScienceHardDrive drive) {
			if(drive.StartXfering()) {

				float secTotal = 0f;
				float secRemaining = 0f;
				ScreenMessage msg = null;
				ScienceData data = null;
				IScienceDataContainer container = null;
				KeyValuePair<ScienceData, IScienceDataContainer> kvp = new KeyValuePair<ScienceData, IScienceDataContainer>();

				while((kvp = QueueManager.instance.GetNextInXferQueue(drive)).Key != null) {
					data = kvp.Key;
					container = kvp.Value;

					if(data.dataAmount <= drive.capacity - drive.usedSpace) {
						secTotal = secRemaining = data.dataAmount / drive.xferRate;
						msg = new ScreenMessage("<color=#99ff00ff>Transfering " + data.title + " to " + drive.part.partInfo.title + ":  0%</color>", (float)secTotal + 5f, ScreenMessageStyle.UPPER_LEFT);

						ScreenMessages.PostScreenMessage(msg);
						while(secRemaining > 0 && Mathf.Round((float)drive.part.RequestResource("ElectricCharge", .1 * drive.powerUsage) * 10000) == .1 * drive.powerUsage * 10000) {
							yield return new WaitForSeconds(.1f);
							secRemaining -= .1f;
							msg.message = "<color=#99ff00ff>Transfering " + data.title + " to " + drive.part.partInfo.title + ": " + Mathf.Round(1000 * (secTotal - secRemaining) / secTotal) / 10 + "%</color>";
						}

						if(secRemaining > 0) {
							ScreenMessages.RemoveMessage(msg);
							ScreenMessages.PostScreenMessage("<color=#ff9900ff>Ran out of Electric Charge while transfering " + data.title + " to " + drive.part.partInfo.title + ".</color>", 5f, ScreenMessageStyle.UPPER_LEFT);
							QueueManager.instance.ClearXferQueue(drive);
						}
						else {
							ScreenMessages.RemoveMessage(msg);
							ScreenMessages.PostScreenMessage("<color=#99ff00ff>" + data.title + " transfered to " + drive.part.partInfo.title + ".</color>", 5f, ScreenMessageStyle.UPPER_LEFT);
							drive.AddData(data);
							container.DumpData(data);
						}
					}
					else {
						Print(drive.part.partInfo.title + " doesn't have the room for " + data.title);
					}

					QueueManager.instance.RemvoeFromXferQueue(drive, data);
				}

				yield return new WaitForSeconds(1f);
				drive.StopXfering();
			}
			else {
				Print(drive.part.partInfo.title + " is already transfering data.");
			}
		}