Moved the BaseLinkCost definition to OnLoad, and corrected the order of the arguments.
Moved the BaseLinkCost definition to OnLoad, and corrected the order of the arguments.

--- a/ARConfiguration.cs
+++ b/ARConfiguration.cs
@@ -6,6 +6,8 @@
 using KSP;
 using KSP.UI.Screens;
 using System;
+using System.Collections.Generic;
+using System.Reflection;
 using ToadicusTools.Extensions;
 using ToadicusTools.Text;
 using ToadicusTools.GUIUtils;
@@ -130,6 +132,8 @@
 
 #pragma warning disable 1591
 
+		private static MethodInfo partLoader_CompilePartInfo;
+
 		private bool showConfigWindow;
 		private Rect configWindowPos;
 
@@ -230,6 +234,16 @@
 					this.trackingStationRanges.SPrint());
 			}
 
+			if (partLoader_CompilePartInfo == null)
+			{
+				partLoader_CompilePartInfo = typeof(PartLoader).GetMethod(
+					"CompilePartInfo",
+					BindingFlags.NonPublic | BindingFlags.Instance
+				);
+
+				this.Log("Fetched PartLoader.CompilePartInfo: {0}", partLoader_CompilePartInfo);
+			}
+
 			this.runOnce = true;
 
 			this.LogDebug("Awake.");
@@ -245,6 +259,7 @@
 				this.runOnce = false;
 
 				this.SetKerbinRelayRange();
+				this.updateModuleInfos();
 			}
 		}
 
@@ -352,6 +367,8 @@
 			{
 				ARConfiguration.FixedPowerCost = fixedPowerCost;
 				this.SaveConfigValue(FIXED_POWER_KEY, fixedPowerCost);
+
+				this.updateModuleInfos();
 			}
 
 			GUILayout.EndHorizontal();
@@ -363,6 +380,8 @@
 			{
 				ARConfiguration.UseAdditiveRanges = useAdditive;
 				this.SaveConfigValue(USE_ADDITIVE_KEY, useAdditive);
+
+				this.updateModuleInfos();
 			}
 
 			GUILayout.EndHorizontal();
@@ -468,6 +487,90 @@
 			{
 				this.Log("Caught onFacilityUpgraded for {0} at level {1}", fac.id, lvl);
 				this.SetKerbinRelayRange();
+
+				this.updateModuleInfos();
+			}
+		}
+
+		private void updateModuleInfos()
+		{
+			if (PartLoader.Instance != null && PartLoader.Instance.parts != null)
+			{
+				this.Log("Updating module infos in PartLoader");
+				this.updateModuleInfos(PartLoader.Instance.parts);
+			}
+
+			if (RDTestSceneLoader.Instance != null && RDTestSceneLoader.Instance.partsList != null)
+			{
+				this.Log("Updating module infos in RDTestSceneLoader");
+				this.updateModuleInfos(RDTestSceneLoader.Instance.partsList);
+			}
+		}
+
+		private void updateModuleInfos(List<AvailablePart> partsList)
+		{
+			if (partLoader_CompilePartInfo == null)
+			{
+				this.LogError("Cannot recompile part info; partLoader_CompilePartInfo not found.");
+				return;
+			}
+
+			if (PartLoader.Instance == null)
+			{
+				this.LogError("Cannot recompile part info; PartLoader.Instance is null.");
+				return;
+			}
+
+			// We need to go find all of the prefabs and update them, because Squad broke IModuleInfo.
+			AvailablePart availablePart;
+			Part partPrefab;
+			PartModule modulePrefab;
+			object[] compileArgs = new object[2];
+
+			this.Log("Updating module infos...");
+
+			for (int apIdx = 0; apIdx < partsList.Count; apIdx++)
+			{
+				availablePart = partsList[apIdx];
+
+				if (availablePart == null)
+				{
+					continue;
+				}
+
+				partPrefab = availablePart.partPrefab;
+
+				if (partPrefab == null || partPrefab.Modules == null)
+				{
+					continue;
+				}
+
+				for (int pmIdx = 0; pmIdx < partPrefab.Modules.Count; pmIdx++)
+				{
+					modulePrefab = partPrefab.Modules[pmIdx];
+
+					if (modulePrefab == null)
+					{
+						continue;
+					}
+
+					if (modulePrefab is IAntennaRelay)
+					{
+						this.Log("Found prefab IAntennaRelay {0}", modulePrefab);
+
+						this.Log("Recompiling part and module info for {0}", availablePart.name);
+
+						availablePart.moduleInfos.Clear();
+						availablePart.resourceInfos.Clear();
+
+						compileArgs[0] = availablePart;
+						compileArgs[1] = partPrefab;
+
+						partLoader_CompilePartInfo.Invoke(PartLoader.Instance, compileArgs);
+
+						break;
+					}
+				}
 			}
 		}
 

--- a/AntennaRelay.cs
+++ b/AntennaRelay.cs
@@ -165,7 +165,16 @@
 		{
 			get
 			{
-				return new RelayDataCost(this.moduleRef.PacketResourceCost, this.moduleRef.PacketSize);
+				return this.moduleRef?.CurrentLinkCost ?? RelayDataCost.Infinity;
+			}
+			set
+			{
+				throw new NotImplementedException(
+					string.Format(
+						"{0} must not assign CurrentLinkCost.  This is probably a bug.",
+						this.GetType().FullName
+					)
+				);
 			}
 		}
 
@@ -184,7 +193,7 @@
 				ushort iters = 0;
 				while (relay != null)
 				{
-					cost += new RelayDataCost(relay.PacketResourceCost, relay.PacketSize);
+					cost += relay.CurrentLinkCost;
 
 					if (relay.KerbinDirect)
 					{
@@ -235,69 +244,6 @@
 			get;
 			set;
 		}
-		/*
-		 * The next two functions overwrite the behavior of the stock functions and do not perform equivalently, except
-		 * in that they both return floats.  Here's some quick justification:
-		 * 
-		 * The stock implementation of GetTransmitterScore (which I cannot override) is:
-		 * 		Score = (1 + DataResourceCost) / DataRate
-		 * 
-		 * The stock DataRate and DataResourceCost are:
-		 * 		DataRate = packetSize / packetInterval
-		 * 		DataResourceCost = packetResourceCost / packetSize
-		 * 
-		 * So, the resulting score is essentially in terms of joules per byte per baud.  Rearranging that a bit, it
-		 * could also look like joule-seconds per byte per byte, or newton-meter-seconds per byte per byte.  Either way,
-		 * that metric is not a very reasonable one.
-		 * 
-		 * Two metrics that might make more sense are joules per byte or joules per byte per second.  The latter case
-		 * would look like:
-		 * 		DataRate = packetSize / packetInterval
-		 * 		DataResourceCost = packetResourceCost
-		 * 
-		 * The former case, which I've chosen to implement below, is:
-		 * 		DataRate = packetSize
-		 * 		DataResourceCost = packetResourceCost
-		 * 
-		 * So... hopefully that doesn't screw with anything else.
-		 * */
-		/// <summary>
-		/// Override ModuleDataTransmitter.DataRate to just return packetSize, because we want antennas to be scored in
-		/// terms of joules/byte
-		/// </summary>
-		public virtual float DataRate
-		{
-			get
-			{
-				if (this.CanTransmit())
-				{
-					return this.moduleRef.PacketSize;
-				}
-				else
-				{
-					return float.Epsilon;
-				}
-			}
-		}
-
-		/// <summary>
-		/// Override ModuleDataTransmitter.DataResourceCost to just return packetResourceCost, because we want antennas
-		/// to be scored in terms of joules/byte
-		/// </summary>
-		public virtual double DataResourceCost
-		{
-			get
-			{
-				if (this.CanTransmit())
-				{
-					return this.moduleRef.PacketResourceCost;
-				}
-				else
-				{
-					return float.PositiveInfinity;
-				}
-			}
-		}
 
 		/// <summary>
 		/// Determines whether this instance can transmit.
@@ -314,15 +260,13 @@
 		public void RecalculateTransmissionRates()
 		{
 			if (!this.canTransmit) {
-				this.moduleRef.PacketSize = 0f;
-				this.moduleRef.PacketResourceCost = float.PositiveInfinity;
+				this.moduleRef.CurrentLinkCost = RelayDataCost.Infinity;
 				return;
 			}
 
 			RelayDataCost cost = this.GetPotentialLinkCost(this.CurrentLinkSqrDistance, this.NominalLinkSqrDistance);
 
-			this.moduleRef.PacketSize = cost.PacketSize;
-			this.moduleRef.PacketResourceCost = cost.PacketResourceCost;
+			this.moduleRef.CurrentLinkCost = cost;
 		}
 
 		/// <summary>
@@ -337,31 +281,31 @@
 
 			float rangeFactor = (float)(nominalSqrDistance / currentSqrDistance);
 
-			linkCost.PacketSize = this.moduleRef.PacketSize;
+			RelayDataCost baseCost = this.moduleRef?.BaseLinkCost ?? RelayDataCost.Infinity;
 
 			if (ARConfiguration.FixedPowerCost)
 			{
-				linkCost.PacketResourceCost = this.moduleRef.BasePacketResourceCost;
+				linkCost.PacketResourceCost = baseCost.PacketResourceCost;
 
 				linkCost.PacketSize = Mathf.Min(
-					this.moduleRef.BasePacketSize * rangeFactor,
-					this.moduleRef.BasePacketSize * this.moduleRef.MaxDataFactor
+					baseCost.PacketSize * rangeFactor,
+					baseCost.PacketSize * this.moduleRef.MaxDataFactor
 				);
 			}
 			else
 			{
 				if (currentSqrDistance > nominalSqrDistance)
 				{
-					linkCost.PacketSize = this.moduleRef.BasePacketSize;
-					linkCost.PacketResourceCost = this.moduleRef.BasePacketResourceCost / rangeFactor;
+					linkCost.PacketSize = baseCost.PacketSize;
+					linkCost.PacketResourceCost = baseCost.PacketResourceCost / rangeFactor;
 				}
 				else
 				{
 					linkCost.PacketSize = Mathf.Min(
-						this.moduleRef.BasePacketSize * rangeFactor,
-						this.moduleRef.BasePacketSize * this.moduleRef.MaxDataFactor
+						baseCost.PacketSize * rangeFactor,
+						baseCost.PacketSize * this.moduleRef.MaxDataFactor
 					);
-					linkCost.PacketResourceCost = this.moduleRef.BasePacketResourceCost;
+					linkCost.PacketResourceCost = baseCost.PacketResourceCost;
 				}
 			}
 
@@ -545,9 +489,15 @@
 
 				// Find the distance from here to the vessel...
 				log.Append("\n\tgetting cost to potential vessel");
-				potentialRelayRate = potentialBestRelay.CurrentNetworkLinkCost + this.GetPotentialLinkCost(potentialBestRelay);
-
-				log.AppendFormat("\n\tpotentialRelayRate = {0} ({1} + {2})", potentialRelayRate, potentialBestRelay.CurrentNetworkLinkCost, this.GetPotentialLinkCost(potentialBestRelay));
+				potentialRelayRate = potentialBestRelay.CurrentNetworkLinkCost +
+					this.GetPotentialLinkCost(potentialBestRelay);
+
+				log.AppendFormat(
+					"\n\tpotentialRelayRate = {0} ({1} + {2})",
+					potentialRelayRate,
+					potentialBestRelay.CurrentNetworkLinkCost,
+					this.GetPotentialLinkCost(potentialBestRelay)
+				);
 
 				#if BENCH
 				startLOSVesselTicks = performanceTimer.ElapsedTicks;
@@ -584,7 +534,7 @@
 						potentialBestRelay.CanTransmit()
 					)
 					{
-						log.Append("\n\t\t...vessel is cheapest and close enough and potentialBestRelay can transmit");
+						log.Append("\n\t\t...vessel is cheapest and in range and potentialBestRelay can transmit");
 						log.AppendFormat("\n\t\t...{0} found new best occluded relay {1}", this, potentialBestRelay);
 
 						this.bestOccludedRelay = potentialBestRelay;
@@ -783,7 +733,7 @@
 						// Since cheapestRelayRate is infinity if there are no nearby relays, this is safe.
 						if (cheapestRelayRate < cheapestOccludedRelayRate)
 						{
-							log.AppendFormat("\n\t\t\t\t...but the nearest relay is cheaper ({0} < {1}), so picking it.",
+							log.AppendFormat("\n\t\t\t\t...but the cheapest relay is cheaper ({0} < {1}), so picking it.",
 								cheapestRelayRate, cheapestOccludedRelayRate);
 							
 							this.targetRelay = this.nearestRelay;
@@ -907,7 +857,7 @@
 							// Since cheapestRelayRate is infinity if there are no nearby relays, this is safe.
 							if (cheapestRelayRate < cheapestOccludedRelayRate)
 							{
-								log.AppendFormat("\n\t\t\t\t...but the nearest relay is cheaper ({0} < {1}), so picking it.",
+								log.AppendFormat("\n\t\t\t\t...but the cheapest relay is cheaper ({0} < {1}), so picking it.",
 									cheapestRelayRate, cheapestOccludedRelayRate);
 								
 								this.targetRelay = this.nearestRelay;
@@ -916,7 +866,7 @@
 							// Otherwise, target the best occluded relay.
 							else
 							{
-								log.AppendFormat("\n\t\t\t\t...and cheaper than the nearest relay ({0} >= {1}), so picking it.",
+								log.AppendFormat("\n\t\t\t\t...and cheaper than the cheapest relay ({0} >= {1}), so picking it.",
 									cheapestRelayRate, cheapestOccludedRelayRate);
 								
 								this.targetRelay = bestOccludedRelay;

--- a/IAntennaRelay.cs
+++ b/IAntennaRelay.cs
@@ -47,28 +47,16 @@
 		IAntennaRelay targetRelay { get; }
 
 		/// <summary>
-		/// Gets or sets the data capacity of a packet, in MiT/packet
+		/// Gets the current link resource rate in EC/MiT.
 		/// </summary>
-		/// <value>The data capacity of a packet, in MiT/packet</value>
-		float PacketSize { get; set; }
+		/// <value>The current link resource rate in EC/MiT.</value>
+		RelayDataCost CurrentLinkCost { get; set; }
 
 		/// <summary>
-		/// Gets the base data capacity of a packet, in MiT/packet
+		/// Gets the base link resource rate in EC/MiT.
 		/// </summary>
-		/// <value>The base data capacity of a packet, in MiT/packet</value>
-		float BasePacketSize { get; }
-
-		/// <summary>
-		/// Gets or sets the resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The resource cost of a packet, in EC/packet</value>
-		float PacketResourceCost { get; set; }
-
-		/// <summary>
-		/// Gets the base resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The base resource cost of a packet, in EC/packet</value>
-		float BasePacketResourceCost { get; }
+		/// <value>The base link resource rate in EC/MiT.</value>
+		RelayDataCost BaseLinkCost { get; }
 
 		/// <summary>
 		/// Gets the packet throttle.

--- a/ModuleLimitedDataTransmitter.cs
+++ b/ModuleLimitedDataTransmitter.cs
@@ -52,18 +52,12 @@
 		: ModuleDataTransmitter, IScienceDataTransmitter, IAntennaRelay, IModuleInfo
 	{
 		private const string tooltipSkinName = "PartTooltipSkin";
-		private static GUISkin partTooltipSkin;
-		private static GUIStyle partTooltipBodyStyle;
-		private static GUIStyle partTooltipHeaderStyle;
 
 		// Every antenna is a relay.
 		private AntennaRelay relay;
 
 		// Sometimes we will need to communicate errors; this is how we do it.
 		private ScreenMessage ErrorMsg;
-
-		// Used in module info panes for part tooltips in the editor and R&D
-		private GUIContent moduleInfoContent;
 
 		/// <summary>
 		/// When additive ranges are enabled, the distance from Kerbin at which the antenna will perform exactly as
@@ -187,52 +181,27 @@
 		}
 
 		/// <summary>
-		/// Gets or sets the data capacity of a packet, in MiT/packet
-		/// </summary>
-		/// <value>The data capacity of a packet, in MiT/packet</value>
-		public float PacketSize
-		{
-			get
-			{
-				return this.packetSize;
+		/// Gets the current link resource rate in EC/MiT.
+		/// </summary>
+		/// <value>The current link resource rate in EC/MiT.</value>
+		public RelayDataCost CurrentLinkCost
+		{
+			get
+			{
+				return new RelayDataCost(this.packetResourceCost, this.packetSize);
 			}
 			set
 			{
-				this.packetSize = value;
-			}
-		}
-
-		/// <summary>
-		/// Gets the base data capacity of a packet, in MiT/packet
-		/// </summary>
-		/// <value>The base data capacity of a packet, in MiT/packet</value>
-		public float BasePacketSize
-		{
-			get;
-			private set;
-		}
-
-		/// <summary>
-		/// Gets or sets the resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The resource cost of a packet, in EC/packet</value>
-		public float PacketResourceCost
-		{
-			get
-			{
-				return this.packetResourceCost;
-			}
-			set
-			{
-				this.packetResourceCost = value;
-			}
-		}
-
-		/// <summary>
-		/// Gets the base resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The base resource cost of a packet, in EC/packet</value>
-		public float BasePacketResourceCost
+				this.packetResourceCost = value.PacketResourceCost;
+				this.packetSize = value.PacketSize;
+			}
+		}
+
+		/// <summary>
+		/// Gets the base link resource rate in EC/MiT.
+		/// </summary>
+		/// <value>The base link resource rate in EC/MiT.</value>
+		public RelayDataCost BaseLinkCost
 		{
 			get;
 			private set;
@@ -431,12 +400,14 @@
 		{
 			get
 			{
-				if (this.relay == null)
-				{
-					return float.PositiveInfinity;
-				}
-
-				return this.relay.DataRate;
+				if (this.CanTransmit())
+				{
+					return this.packetSize;
+				}
+				else
+				{
+					return float.Epsilon;
+				}
 			}
 		}
 
@@ -448,12 +419,14 @@
 		{
 			get
 			{
-				if (this.relay == null)
-				{
-					return double.PositiveInfinity;
-				}
-
-				return this.relay.DataResourceCost;
+				if (this.CanTransmit())
+				{
+					return this.packetResourceCost;
+				}
+				else
+				{
+					return float.PositiveInfinity;
+				}
 			}
 		}
 
@@ -506,10 +479,6 @@
 		public override void OnAwake()
 		{
 			base.OnAwake();
-
-			this.BasePacketSize = base.packetSize;
-			this.BasePacketResourceCost = base.packetResourceCost;
-			this.moduleInfoContent = new GUIContent();
 
 			this.LogDebug("{0} loaded:\n" +
 				"packetSize: {1}\n" +
@@ -519,7 +488,7 @@
 				"maxDataFactor: {5}\n",
 				this,
 				base.packetSize,
-				this.BasePacketResourceCost,
+				this.packetResourceCost,
 				this.nominalTransmitDistance,
 				this.maxPowerFactor,
 				this.maxDataFactor
@@ -562,6 +531,7 @@
 
 			base.OnLoad (node);
 
+			this.BaseLinkCost = new RelayDataCost(base.packetResourceCost, base.packetSize);
 			this.RecalculateMaxRange();
 		}
 
@@ -585,6 +555,9 @@
 		// HACK: Currently hacks around Squad's extraneous layout box, see KSPModders issue #5118
 		private void drawTooltipWidget(Rect rect)
 		{
+			/*
+			 * Removed all this because Squad doesn't even call it anymore.
+			 *
 			this.moduleInfoContent.text = this.GetInfo();
 
 			if (partTooltipSkin == null)
@@ -626,7 +599,7 @@
 			GUILayout.Space(height - orgHeight
 				- partTooltipBodyStyle.padding.bottom - partTooltipBodyStyle.padding.top
 				- 2f * (partTooltipBodyStyle.margin.bottom + partTooltipBodyStyle.margin.top)
-			);
+			);*/
 		}
 
 		/// <summary>
@@ -644,16 +617,12 @@
 		{
 			using (PooledStringBuilder sb = PooledStringBuilder.Get())
 			{
-				string text;
-
-				sb.Append(base.GetInfo());
-
 				if (ARConfiguration.UseAdditiveRanges)
 				{
-					sb.AppendFormat("Nominal Range to Kerbin: {0:S3}m\n",
+					sb.AppendFormat("<b>Nominal Range to Kerbin: </b>{0:S3}m\n",
 						Math.Sqrt(this.nominalTransmitDistance * ARConfiguration.KerbinNominalRange)
 					);
-					sb.AppendFormat("Maximum Range to Kerbin: {0:S3}m",
+					sb.AppendFormat("<b>Maximum Range to Kerbin: </b>{0:S3}m\n",
 						Math.Sqrt(
 							this.nominalTransmitDistance * Math.Sqrt(this.maxPowerFactor) *
 							ARConfiguration.KerbinRelayRange
@@ -662,13 +631,69 @@
 				}
 				else
 				{
-					sb.AppendFormat("Nominal Range: {0:S3}m\n", this.nominalTransmitDistance);
-					sb.AppendFormat("Maximum Range: {0:S3}m", this.maxTransmitDistance);
-				}
-
-				text = sb.ToString();
-
-				return text;
+					sb.AppendFormat("<b>Nominal Range: </b>{0:S3}m\n", this.nominalTransmitDistance);
+					sb.AppendFormat("<b>Maximum Range: </b>{0:S3}m\n", this.maxTransmitDistance);
+				}
+
+				sb.AppendLine();
+
+				sb.AppendFormat("<b>Nominal Packet Size: </b>{0:S2}iT\n", this.BaseLinkCost.PacketSize * 1000000f);
+				sb.AppendFormat(
+					"<b>Nominal Data Rate: </b>{0:S2}iT/sec\n",
+					this.BaseLinkCost.PacketSize / this.packetInterval * 1000000f
+				);
+
+				sb.AppendLine();
+
+				sb.AppendFormat("<b>Within Nominal Range...\n...Maximum Speedup:</b> {0:P0}\n", this.maxDataFactor);
+
+				if (ARConfiguration.FixedPowerCost)
+				{
+					sb.AppendLine();
+
+					sb.AppendFormat(
+						"<b>Outside Nominal Range...\n...Maximum Slowdown:</b> {0:P1}\n",
+						1f / this.maxPowerFactor
+					);
+
+					sb.AppendLine();
+
+					sb.AppendFormat(
+						"<b>Packet Cost:</b> {0:0.0#} {1}\n",
+						this.BaseLinkCost.PacketResourceCost,
+						this.requiredResource == "ElectricCharge" ? "EC" : this.requiredResource
+					);
+					sb.AppendFormat(
+						"<b>Power Drain:</b> {0:0.0#} {1}/s\n",
+						this.BaseLinkCost.PacketResourceCost / this.packetInterval,
+						this.requiredResource == "ElectricCharge" ? "EC" : this.requiredResource
+					);
+				}
+				else
+				{
+					sb.AppendLine();
+
+					sb.AppendFormat(
+						"<b>Nominal Packet Cost:</b> {0:0.0#} {1}\n",
+						this.BaseLinkCost.PacketResourceCost,
+						this.requiredResource == "ElectricCharge" ? "EC" : this.requiredResource
+					);
+					sb.AppendFormat(
+						"<b>Nominal Power Drain:</b> {0:0.0#} {1}/s\n",
+						this.BaseLinkCost.PacketResourceCost / this.packetInterval,
+						this.requiredResource == "ElectricCharge" ? "EC" : this.requiredResource
+					);
+
+					sb.AppendLine();
+
+					sb.AppendFormat(
+						"<b>Outside Nominal Range...\n...Maximum Power Drain:</b> {0:0.0#} {1}/s\n",
+						this.BaseLinkCost.PacketResourceCost / this.packetInterval * this.maxPowerFactor,
+						this.requiredResource == "ElectricCharge" ? "EC" : this.requiredResource
+					);
+				}
+
+				return sb.ToString();
 			}
 		}
 

--- a/Properties/AssemblyInfo.cs
+++ b/Properties/AssemblyInfo.cs
@@ -39,7 +39,7 @@
 // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
-[assembly: AssemblyVersion("1.10.3.*")]
+[assembly: AssemblyVersion("1.11.1.*")]
 // The following attributes are used to specify the signing key for the assembly,
 // if desired. See the Mono documentation for more information about signing.
 //[assembly: AssemblyDelaySign(false)]

--- a/ProtoAntennaRelay.cs
+++ b/ProtoAntennaRelay.cs
@@ -73,88 +73,31 @@
 		}
 
 		/// <summary>
-		/// Gets or sets the data capacity of a packet, in MiT/packet
-		/// </summary>
-		/// <value>The data capacity of a packet, in MiT/packet</value>
-		public float PacketSize
-		{
-			get
-			{
-				if (this.moduleRef == null)
-				{
-					return float.NaN;
-				}
-
-				return this.moduleRef.PacketSize;
-			}
-			set
-			{
-				if (this.moduleRef == null)
-				{
-					return;
-				}
-
-				this.moduleRef.PacketSize = value;
-			}
-		}
-
-		/// <summary>
-		/// Gets the base data capacity of a packet, in MiT/packet
-		/// </summary>
-		/// <value>The base data capacity of a packet, in MiT/packet</value>
-		public float BasePacketSize
-		{
-			get
-			{
-				if (this.moduleRef == null)
-				{
-					return float.NaN;
-				}
-
-				return this.moduleRef.BasePacketSize;
-			}
-		}
-
-		/// <summary>
-		/// Gets or sets the resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The resource cost of a packet, in EC/packet</value>
-		public float PacketResourceCost
-		{
-			get
-			{
-				if (this.moduleRef == null)
-				{
-					return float.NaN;
-				}
-
-				return this.moduleRef.PacketResourceCost;
-			}
-			set
-			{
-				if (this.moduleRef == null)
-				{
-					return;
-				}
-
-				this.moduleRef.PacketResourceCost = value;
-			}
-		}
-
-		/// <summary>
-		/// Gets the base resource cost of a packet, in EC/packet
-		/// </summary>
-		/// <value>The base resource cost of a packet, in EC/packet</value>
-		public float BasePacketResourceCost
-		{
-			get
-			{
-				if (this.moduleRef == null)
-				{
-					return float.NaN;
-				}
-
-				return this.moduleRef.BasePacketResourceCost;
+		/// Gets the base link resource rate in EC/MiT.
+		/// </summary>
+		/// <value>The base link resource rate in EC/MiT.</value>
+		public RelayDataCost BaseLinkCost
+		{
+			get;
+			private set;
+		}
+
+		/// <summary>
+		/// Override ModuleDataTransmitter.DataResourceCost to just return packetResourceCost, because we want antennas
+		/// to be scored in terms of joules/byte
+		/// </summary>
+		public double DataResourceCost
+		{
+			get
+			{
+				if (this.CanTransmit())
+				{
+					return this.moduleRef.DataResourceCost;
+				}
+				else
+				{
+					return float.PositiveInfinity;
+				}
 			}
 		}