diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index 2f25d8d89f5b5a57230a9d5f508c1e057cc9768c..5c0320de972c41cdfe45f23c48b6dac24c69af4a 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -98,7 +98,8 @@ public class ModelMain {
 		LogWriter.println(timestep.toString());
 
 		YieldRaster yieldSurfaces = getYieldSurfaces(timestep);  // this will wait for the marker file from LPJ if configured to do so
-
+		RasterSet<IrrigationItem> allIrrigData = getIrrigationData(timestep, yieldSurfaces);
+		
 		YieldResponsesItem yresp = yieldSurfaces.getFromCoordinates(-90.5, 45.5);
 		LogWriter.printlnError("Test key: " + yresp.getYieldMax(CropType.MAIZE)  + ", " + yresp.getYieldFertOnly(CropType.MAIZE) + ", " + yresp.getYieldIrrigOnly(CropType.MAIZE) + ", " + yresp.getYieldNone(CropType.MAIZE));
 
@@ -113,13 +114,13 @@ public class ModelMain {
 			LogWriter.println("Country " + ca.getCountry());
 			Collection<RasterKey> countryKeys = countryBoundaryRaster.getKeysFor(ca.getCountry());
 			YieldRaster countryYieldSurfaces = yieldSurfaces.createSubsetForKeys(countryKeys);
-
+			RasterSet<IrrigationItem> irrigData = allIrrigData.createSubsetForKeys(countryKeys);
+			
 			GamsRasterOutput result = null;
 
 			// do the optimization
 			try {
-				result = ca.determineProduction(timestep, countryYieldSurfaces, prevWorldPrices);
-
+				result = ca.determineProduction(timestep, countryYieldSurfaces, irrigData, prevWorldPrices);
 			}
 			catch (Exception e) {
 				LogWriter.printlnError("Exception processing " + ca.getCountry() + " will continue with other countries");	
@@ -296,21 +297,19 @@ public class ModelMain {
 		Collection<CountryAgent> countryAgents = new HashSet<CountryAgent>();
 
 		RasterSet<LandCoverItem> initLC = getInitialLandCover();
-		RasterSet<IrrigationItem> allIrrigationData = getIrrigationData();
 		Map<CompositeCountry, Map<CropType, CropUsageData>> cropUsageDataMap = new CropUsageReader(compositeCountryManager).getCommodityData();
 
 		for (CompositeCountry cc : countryGrouping) {
 
 			// DEBUG code
 			if (ModelConfig.DEBUG_LIMIT_COUNTRIES) {
-				if (!(cc.getName().equals("United States of Americaxx") || cc.getName().equals("India") || cc.getName().equals("Russian Federationxx") || cc.getName().equals("South Asia_otherxx")) ) {
+				if (!(cc.getName().equals("United States of Americaxx") || cc.getName().equals("United Kingdom") || cc.getName().equals("Russian Federationxx") || cc.getName().equals("South Asia_otherxx")) ) {
 					continue;
 				}
 			}
 
 			List<RasterKey> keys = countryBoundaryRaster.getKeysFor(cc);
 			RasterSet<LandCoverItem> initCountryLC = initLC.createSubsetForKeys(keys);
-			RasterSet<IrrigationItem> irrigationData = allIrrigationData.createSubsetForKeys(keys);
 			Map<CropType, CropUsageData> countryCommodityData = cropUsageDataMap.get(cc);
 
 			if (countryCommodityData == null) {
@@ -320,7 +319,7 @@ public class ModelMain {
 				LogWriter.printlnError("No initial land cover for " +cc + ", so skipping");
 			}
 			else {
-				CountryAgent ca = new CountryAgent(demandManager, cc, initCountryLC, irrigationData, countryCommodityData);
+				CountryAgent ca = new CountryAgent(demandManager, cc, initCountryLC, countryCommodityData);
 				countryAgents.add(ca);
 				LogWriter.println("Creating country agent for: " + cc );
 			}
@@ -339,8 +338,9 @@ public class ModelMain {
 		LPJYieldResponseMapReader yieldReader = new LPJYieldResponseMapReader(desiredProjection);
 		return yieldReader.getRasterData(timestep); 
 	}
-
-	private RasterSet<IrrigationItem> getIrrigationData() {
+	
+	private RasterSet<IrrigationItem> getIrrigationData(Timestep timestep, YieldRaster yieldSurfaces) {
+		
 		RasterSet<IrrigationItem> irigData = new RasterSet<IrrigationItem>(desiredProjection) {
 			private static final long serialVersionUID = 8393130687550888654L;
 
@@ -351,7 +351,7 @@ public class ModelMain {
 
 		new IrrigiationCostReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); 
 		new IrrigationConstraintReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE); 
-		new IrrigationMaxAmountReader(irigData).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE);
+		new IrrigationMaxAmountReader(irigData, yieldSurfaces).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE);
 
 		return irigData;
 	}
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index bdc07ee2b5463676af3b014b6453cf01e8635a48..ac107029fde1a0a455d23e9b6178ce9bcd9e107a 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -10,9 +10,9 @@ import ac.ed.lurg.country.gams.GamsRasterOptimiser;
 import ac.ed.lurg.country.gams.GamsRasterOutput;
 import ac.ed.lurg.demand.DemandManager;
 import ac.ed.lurg.landuse.CropUsageData;
-import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.LandCoverItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.types.CommodityType;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.utils.LogWriter;
@@ -26,18 +26,15 @@ public class CountryAgent {
 	private CompositeCountry country;
 	
 	private Map<Timestep, GamsRasterOutput> resultsTimeseries = new HashMap<Timestep, GamsRasterOutput>();
-
 	private Timestep currentTimestep;
 	private YieldRaster countryYieldSurfaces;
-	private RasterSet<IrrigationItem> irrigationCostRaster;
 
 	public CountryAgent(DemandManager demandManager, CompositeCountry country, RasterSet<LandCoverItem> initialLC,
-			RasterSet<IrrigationItem> irrigationCostRaster, Map<CropType, CropUsageData> cropUsageData) {
+			Map<CropType, CropUsageData> cropUsageData) {
 		
 		this.demandManager = demandManager;
 		this.country = country;
 		RasterSet<LandUseItem> cropAreaRaster = convertInitialLC(initialLC);
-		this.irrigationCostRaster = irrigationCostRaster;
 		
 		GamsRasterOutput initialData = new GamsRasterOutput(cropAreaRaster, cropUsageData);
 		resultsTimeseries.put(new Timestep(0), initialData);
@@ -62,7 +59,7 @@ public class CountryAgent {
 		return country;
 	}
 
-	public GamsRasterOutput determineProduction(Timestep timestep, YieldRaster countryYieldSurfaces, Map<CropType, GlobalPrice> worldPrices) {
+	public GamsRasterOutput determineProduction(Timestep timestep, YieldRaster countryYieldSurfaces, RasterSet<IrrigationItem> irrigData, Map<CropType, GlobalPrice> worldPrices) {
 		currentTimestep = timestep;
 		this.countryYieldSurfaces = countryYieldSurfaces;
 		
@@ -77,7 +74,7 @@ public class CountryAgent {
 		}
 		else {
 			// optimize areas and intensity 
-			GamsRasterInput input = getGamsRasterInput(projectedDemand, worldPrices);
+			GamsRasterInput input = getGamsRasterInput(projectedDemand, worldPrices, irrigData);
 			GamsRasterOptimiser opti = new GamsRasterOptimiser(input);
 			LogWriter.println("Running " + country.getName() + ", currentTimestep " + currentTimestep);
 			
@@ -89,7 +86,7 @@ public class CountryAgent {
 		return null;
 	}
 
-	private GamsRasterInput getGamsRasterInput(Map<CommodityType, Double> projectedDemand, Map<CropType, GlobalPrice> worldPrices) {
+	private GamsRasterInput getGamsRasterInput(Map<CommodityType, Double> projectedDemand, Map<CropType, GlobalPrice> worldPrices, RasterSet<IrrigationItem> irrigData) {
 
 		GamsRasterOutput prevOutput;
 		Map<CropType, Double> cropAdjs;
@@ -115,9 +112,9 @@ public class CountryAgent {
 			baseNetImport.put(entry.getKey(), netImports);
 			maxOfProdOrSupply.put(entry.getKey(), cropUsage.getProduction() + Math.max(netImports, 0));
 		}
-		
+				
 		GamsCountryInput countryLevelInputs = GamsCountryInput.createInput(country, projectedDemand, worldPrices, baseNetImport, maxOfProdOrSupply, cropAdjs, calibrate);	
-		GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getLandUses(), irrigationCostRaster, countryLevelInputs);
+		GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getLandUses(), irrigData, countryLevelInputs);
 
 		return input;
 	}
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
index c165b1c9d003f3fe1062497dca5d972d0b3f9f47..072d075404efb291eb62864da090441725776555 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
@@ -32,7 +32,7 @@ public class GamsRasterInput {
 		return previousLandsUses;
 	}
 	
-	public RasterSet<IrrigationItem> getIrrigationCost() {
+	public RasterSet<IrrigationItem> getIrrigationData() {
 		return irrigationCost;
 	}
 	
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index fea86a050ac898d5fd0b032cf8795dcb16cae80b..ef8ffcd5f3d2f1be7809b1e68ab0f35ad204db4a 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -268,7 +268,7 @@ public class GamsRasterOptimiser {
 		}.writeOutput(true); */
 
 
-		RasterSet<IrrigationItem> irrigRaster = rasterInputData.getIrrigationCost();
+		RasterSet<IrrigationItem> irrigRaster = rasterInputData.getIrrigationData();
 
 		{
 			//	YieldResponsesItem yresp = yieldRaster.get(new RasterKey(40,38));//getFromCoordinates(-118.0, -33.0);
@@ -462,7 +462,7 @@ public class GamsRasterOptimiser {
 		List<Double> divisions = new ArrayList<Double>();
 
 		for (int i=1; i < numCategories; i++) {
-			double d = yieldValues.get(yieldValues.size()/numCategories*i);
+			double d = yieldValues.get(yieldValues.size()*i/numCategories);
 			divisions.add(d);
 		}	
 
diff --git a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
index 60a74228c934d41b4a021fdde7bca7bfcfb5bc6b..1488acc88b02cd5dbb33d4ca82fae515e613173e 100644
--- a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
+++ b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
@@ -4,6 +4,7 @@ import java.util.Map;
 
 import ac.ed.lurg.ModelConfig;
 import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.yield.YieldRaster;
 import ac.sac.raster.AbstractTabularRasterReader;
 import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
@@ -11,18 +12,22 @@ import ac.sac.raster.RasterSet;
 public class IrrigationMaxAmountReader extends AbstractTabularRasterReader<IrrigationItem> {	
 
 	private static final int MIN_COLS = 6;
+	private YieldRaster yieldSurfaces;
 
-	public IrrigationMaxAmountReader(RasterSet<IrrigationItem> irigCosts) {
+	public IrrigationMaxAmountReader(RasterSet<IrrigationItem> irigCosts, YieldRaster yieldSurfaces) {
 		super(" +", MIN_COLS, irigCosts);
+		this.yieldSurfaces = yieldSurfaces;
 	}
 		
 	@Override
 	protected void setData(RasterKey key, IrrigationItem item, Map<String, Double> rowValues) {
 		
-		item.setMaxIrrigAmount(CropType.WHEAT, getValueForCol(rowValues, "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
+		boolean isSpringWheat = yieldSurfaces.isSpringWheat(key);
+		
+		item.setMaxIrrigAmount(CropType.WHEAT, getValueForCol(rowValues, isSpringWheat ? "TeSWi" : "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
 		item.setMaxIrrigAmount(CropType.MAIZE, getValueForCol(rowValues, "TeCoi") / ModelConfig.IRRIGIATION_EFFICIENCY);
 		item.setMaxIrrigAmount(CropType.RICE, getValueForCol(rowValues, "TrRii") / ModelConfig.IRRIGIATION_EFFICIENCY);
-		item.setMaxIrrigAmount(CropType.OILCROPS, getValueForCol(rowValues, "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
+		item.setMaxIrrigAmount(CropType.OILCROPS, getValueForCol(rowValues, isSpringWheat ? "TeSWi" : "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
 		item.setMaxIrrigAmount(CropType.PULSES, getValueForCol(rowValues, "TeSWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
 		item.setMaxIrrigAmount(CropType.STARCHY_ROOTS, getValueForCol(rowValues, "TeSWi") / ModelConfig.IRRIGIATION_EFFICIENCY);
 	}
diff --git a/src/ac/ed/lurg/output/LpjgOutputer.java b/src/ac/ed/lurg/output/LpjgOutputer.java
index 95cb591ed1fd0c6a43293fdf75194a5f2335e8c1..9d849e6be6756184e447badc57401193aad4ad82 100644
--- a/src/ac/ed/lurg/output/LpjgOutputer.java
+++ b/src/ac/ed/lurg/output/LpjgOutputer.java
@@ -13,7 +13,6 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.LandCoverType;
 import ac.ed.lurg.utils.LogWriter;
 import ac.ed.lurg.yield.YieldRaster;
-import ac.ed.lurg.yield.YieldResponsesItem;
 import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
 
@@ -68,7 +67,7 @@ public class LpjgOutputer {
 				
 				double lat = landUseRaster.getXCoordin(key);
 				double lon = landUseRaster.getYCoordin(key);
-				boolean isSpringWheat = isSpringWheat(key);
+				boolean isSpringWheat = yieldSurfaces.isSpringWheat(key);
 
 				double winterWheatIrrig = item.getIrrigationAverageRate(CropType.OILCROPS, isSpringWheat ? null : CropType.WHEAT);
 				double springWheatIrrig = item.getIrrigationAverageRate(CropType.PULSES, CropType.STARCHY_ROOTS, isSpringWheat ? CropType.WHEAT : null);
@@ -110,16 +109,6 @@ public class LpjgOutputer {
 		}
 	}
 
-	private boolean isSpringWheat(RasterKey key) {
-		boolean isSpringWheat = false;
-		YieldResponsesItem yieldItem = yieldSurfaces.get(key);
-		if (yieldItem != null)
-			isSpringWheat = yieldSurfaces.get(key).isSpringWheat();
-		else 
-			LogWriter.printlnError("LpjgOutputer: Can't find YieldResponsesItem for " + key);
-		return isSpringWheat;
-	}
-
 	public static void writeMarkerFile(int year, boolean errorStatus) {
 		File outputDir = getOutputDir(year);
 
@@ -171,10 +160,10 @@ public class LpjgOutputer {
 				landCoverWriter.write(String.format("%.2f %.2f %d %.14f %.14f %.14f %.14f", lat, lon, year, crop/area, pasture/area, (forest+otherNatural)/area, barren/area));
 				landCoverWriter.newLine();
 
-				boolean isSpringWheat = isSpringWheat(key);
+				boolean isSpringWheat = yieldSurfaces.isSpringWheat(key);
 
-				double lpjWinterWheatFrac = item.getCropFraction(CropType.OILCROPS, isSpringWheat ? null : CropType.WHEAT);
-				double lpjSpringWheatFrac = item.getCropFraction(CropType.PULSES, CropType.STARCHY_ROOTS, isSpringWheat ? CropType.WHEAT : null);
+				double lpjWinterWheatFrac = item.getCropFraction(isSpringWheat ? null : CropType.OILCROPS, isSpringWheat ? null : CropType.WHEAT);
+				double lpjSpringWheatFrac = item.getCropFraction(CropType.PULSES, CropType.STARCHY_ROOTS, isSpringWheat ? CropType.WHEAT : null, isSpringWheat ? CropType.OILCROPS : null);
 				double lpjCornFrac = item.getCropFraction(CropType.MAIZE);
 				double lpjRiceFrac = item.getCropFraction(CropType.RICE);
 				cropFractWriter.write(String.format("%.2f %.2f %d %.14f %.14f %.14f %.14f", lat, lon, year, lpjWinterWheatFrac, lpjSpringWheatFrac, lpjCornFrac, lpjRiceFrac));
diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
index 8bf5408491eab026263a01500ae55ef88f5e07b6..311497164a15c6e1b4c80cdd93e343cce0b690ad 100644
--- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
+++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
@@ -88,6 +88,10 @@ public class LPJYieldResponseMapReader extends AbstractTabularRasterReader<Yield
 						adjFactor = 10;  // 10 for kg/m2 to t/ha
 
 					String fertIrrigString = irrig.getId() + fert.getId();
+					
+					/*
+					 * WARNING:  if you can mapping below you also need to change LpjgOutputer and IrrigationMaxAmountReader to match
+					 */
 					double ww = getValueForCol(rowValues, "TeWW" + fertIrrigString) * adjFactor;
 					double sw = getValueForCol(rowValues, "TeSW" + fertIrrigString) * adjFactor;
 					double co = getValueForCol(rowValues, "TeCo" + fertIrrigString) * adjFactor;
@@ -96,10 +100,7 @@ public class LPJYieldResponseMapReader extends AbstractTabularRasterReader<Yield
 					item.setYield(yieldType, CropType.WHEAT, isSpringWheat ? sw : ww);
 					item.setYield(yieldType, CropType.MAIZE, co);
 					item.setYield(yieldType, CropType.RICE, ri);
-					
-//					item.setYield(yieldType, CropType.TROPICAL_CEREALS, co);
 					item.setYield(yieldType, CropType.OILCROPS, isSpringWheat ? sw : ww);
-//					item.setYield(yieldType, CropType.SOYBEAN, sw);
 					item.setYield(yieldType, CropType.PULSES, sw);
 					item.setYield(yieldType, CropType.STARCHY_ROOTS, sw);
 				}
diff --git a/src/ac/ed/lurg/yield/YieldRaster.java b/src/ac/ed/lurg/yield/YieldRaster.java
index 2e0c80cbb58860433f68b3a84fd9ffda02ca83e9..911ac3d4a68b1bc91e1047f0c8d0cb625d44adce 100644
--- a/src/ac/ed/lurg/yield/YieldRaster.java
+++ b/src/ac/ed/lurg/yield/YieldRaster.java
@@ -2,6 +2,7 @@ package ac.ed.lurg.yield;
 
 import java.util.Collection;
 
+import ac.ed.lurg.utils.LogWriter;
 import ac.sac.raster.RasterHeaderDetails;
 import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
@@ -25,4 +26,16 @@ public class YieldRaster extends RasterSet<YieldResponsesItem> {
 		popSubsetForKeys(subsetYieldRaster, keys);		
 		return subsetYieldRaster;
 	}
+	
+	// helper method - bit ugly particularly here - don't really like the tension between LPJ SW and WW and PLUM 'wheat'
+	public boolean isSpringWheat(RasterKey key) {
+		boolean isSpringWheat = false;
+		YieldResponsesItem yieldItem = get(key);
+		if (yieldItem != null)
+			isSpringWheat = get(key).isSpringWheat();
+		else 
+			LogWriter.printlnError("YieldRaster: Can't find YieldResponsesItem for " + key);
+		return isSpringWheat;
+	}
+
 }