diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms
index d7bb4bf9482983e9dbf6f2275700df5fd841977d..23de53504e77f0e24e1bf4beab9a19ee97f1e83c 100644
--- a/GAMS/IntExtOpt.gms
+++ b/GAMS/IntExtOpt.gms
@@ -22,6 +22,7 @@
  PARAMETER yieldFertOnly(crop, location)     yield in t per ha;
  PARAMETER yieldIrrigOnly(crop, location)    yield in t per ha;
  PARAMETER yieldBoth(crop, location)         yield in t per ha;
+ PARAMETER yieldShock(crop, location)        rate of yield shock;
  PARAMETER fertParam(crop, location)         yield response to fertilizer parameter;
  PARAMETER irrigParam(crop, location)        yield response to irrigation parameter;
  PARAMETER demand(all_types)                 in t;
@@ -57,7 +58,7 @@
 $gdxin %gdxincname% 
 $load location, suitableLandArea, demand, agriExpansionCost, cropIncCost, pastureIncCost, cropDecCost, pastureDecCost
 $load previousArea, previousFertIntensity, previousIrrigIntensity, previousOtherIntensity, previousRuminantFeed, previousMonogastricFeed, previousImportAmount, previousExportAmount
-$load yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth
+$load yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, yieldShock
 $load fertParam, irrigParam, otherIParam, exportPrices, importPrices, maxNetImport, minNetImport, unhandledCropRate, setAsideRate, maxLandExpansionRate, subsidyRate
 $load meatEfficency, otherICost, irrigCost, irrigMaxRate, irrigConstraint, fertiliserUnitCost, domesticPriceMarkup, minDemandPerCereal, minDemandPerOilcrop, seedAndWasteRate, animalFeedFromOtherSources
 $gdxin    
@@ -248,9 +249,11 @@ $gdxin
  parameter netImportAmount(all_types);
  parameter netImportCost(all_types);
  parameter feedCostRate(feed_crop);
+ parameter productionShock(all_types);
  
 * Production quantities based on smaller area (before unhandledCropArea adjustment applied)
  totalProd(crop) = sum(location, area.l(crop, location) * yield.l(crop, location));
+ productionShock(crop) = sum(location, area.l(crop, location) * yield.l(crop, location) * yieldShock(crop, location));
  totalProd('ruminants') = meatEfficency*(sum(feed_crop, ruminantFeed.l(feed_crop) * cropDM(feed_crop)) + ruminantOtherFeed);
  totalProd('monogastrics') = meatEfficency*(sum(feed_crop, monogastricFeed.l(feed_crop) * cropDM(feed_crop)) + monogastricOtherFeed);
  
diff --git a/debug_config.properties b/debug_config.properties
index 73b3dc21b578011f48ac77b4b6dd653bfe1bac77..1b2a6f3461ce037b51973c35f48f6bbc4ebb667a 100644
--- a/debug_config.properties
+++ b/debug_config.properties
@@ -6,8 +6,8 @@ YIELD_FILENAME=yield.out
 DEBUG_LIMIT_COUNTRIES=false
 DEBUG_COUNTRY_NAME=Mongolia
 
-IS_CALIBRATION_RUN = false
-GENERATE_NEW_YIELD_CLUSTERS = false
+IS_CALIBRATION_RUN = true
+GENERATE_NEW_YIELD_CLUSTERS = true
 NUM_YIELD_CLUSTERS=8000
 
 END_TIMESTEP=0
@@ -17,9 +17,9 @@ INTERPOLATE_OUTPUT_YEARS = false
 
 CHANGE_YIELD_DATA_YEAR=false
 
-ORIG_LEAST_COST_MIN=false
+ORIG_LEAST_COST_MIN=true
 
-DEBUG_JUST_DEMAND_OUTPUT=true
+DEBUG_JUST_DEMAND_OUTPUT=false
 PRICE_ELASTIC_DEMAND=true
 
 GAMS_COUNTRY_TO_SAVE=Brazil
diff --git a/src/ac/ed/lurg/InternationalMarket.java b/src/ac/ed/lurg/InternationalMarket.java
index 47a1f0c68cf76f7a745940b282e3951ef450992c..8315add3c592f3b5fbbdfb1bbbe9116677ee0aeb 100644
--- a/src/ac/ed/lurg/InternationalMarket.java
+++ b/src/ac/ed/lurg/InternationalMarket.java
@@ -48,7 +48,8 @@ public class InternationalMarket {
 			
 			for (Entry<CropType, CropUsageData> entry : cropUsage.entrySet()) {
 				CropType c = entry.getKey();
-				double countryNetImports = entry.getValue().getShockedNetImports() != null ? entry.getValue().getShockedNetImports() : entry.getValue().getNetImports();
+
+				double countryNetImports = entry.getValue().getShockedNetImports();
 				
 				if (countryNetImports > 0)
 					totalImportCommodities.incrementValue(c, countryNetImports);
diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index dacfeac8e2504f8214edf0da534dd01cfabef0f7..af3bbfe7bac314baa610345c87b134530d4e49f7 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -197,7 +197,7 @@ public class ModelMain {
 					Map<CropType, CropUsageData> allCropUsage = ca.getCropUsageData();
 					CropUsageData cropUsage = allCropUsage.get(crop);
 					if (cropUsage != null) {
-						prod += cropUsage.getProduction();
+						prod += cropUsage.getProductionExpected();
 						prodArea += cropUsage.getArea();
 						feedMonogastrics += cropUsage.getMonogastricFeed();
 						feedRuminants += cropUsage.getRuminantFeed();
@@ -265,7 +265,7 @@ public class ModelMain {
 
 	private void writeDomesticProductionFile(Timestep timestep) {
 		try {
-			StringBuffer sbHeadings = new StringBuffer("Year, Country, Crop, Area, Production, Production_cost, Import_price, Export_price, Net_imports, Net_import_cost, Rum_feed_amount, Mon_feed_amount");
+			StringBuffer sbHeadings = new StringBuffer("Year, Country, Crop, Area, Production, Production_cost, Import_price, Export_price, Net_imports, Net_import_cost, Prod_shock, Rum_feed_amount, Mon_feed_amount");
 			BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.DOMESTIC_OUTPUT_FILE, sbHeadings.toString());
 
 			for (CropType crop : CropType.getAllItems()) {
@@ -277,28 +277,29 @@ public class ModelMain {
 					if (cropUsage == null) 
 						continue;
 					
-					Double prodCosts = cropUsage.getProdCost();
-					Double prod = cropUsage.getProduction();
-					Double area = cropUsage.getArea();
-					Double rumFeedAmount = cropUsage.getRuminantFeed();
-					Double monFeedAmount = cropUsage.getMonogastricFeed();
+					double prodCosts = cropUsage.getProdCost();
+					double prod = cropUsage.getProductionExpected();
+					double prodShock = cropUsage.getProductionShock();
+					double area = cropUsage.getArea();
+					double rumFeedAmount = cropUsage.getRuminantFeed();
+					double monFeedAmount = cropUsage.getMonogastricFeed();
 					
-					Double importPrice = null;
-					Double exportPrice = null;
-					Double netImports = null;
-					Double netImportCost = null;
+					double importPrice = 0;
+					double exportPrice = 0 ;
+					double netImports = 0;
+					double netImportCost = 0;
 
 					if (crop.isImportedCrop()) {
 						CountryPrice px = country.getCurrentCountryPrices().get(crop);
 						importPrice = px.getImportPrice(); 
 						exportPrice = px.getExportPrice();
-						netImports = cropUsage.getNetImports();	//this isn't accounting for transport losses in exports 
-						netImportCost = cropUsage.getNetImportCost();
+						netImports = cropUsage.getNetImportsExpected();	//this isn't accounting for transport losses in exports 
+						netImportCost = cropUsage.getNetImportCostExpected();
 					}
 	
 					StringBuffer sbData = new StringBuffer();
 					sbData.append(String.format("%d,%s,%s", timestep.getYear(), country.getCountry(), crop.getGamsName()));
-					sbData.append(String.format(",%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", area, prod, prodCosts, importPrice, exportPrice, netImports, netImportCost, rumFeedAmount, monFeedAmount));
+					sbData.append(String.format(",%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", area, prod, prodCosts, importPrice, exportPrice, netImports, netImportCost, prodShock, rumFeedAmount, monFeedAmount));
 
 					outputFile.write(sbData.toString());
 					outputFile.newLine();
@@ -348,7 +349,7 @@ public class ModelMain {
 					CropUsageData cropusage = cropUsageAllCrops.get(crop);
 					if (cropusage == null)
 						continue;
-					double prod = cropusage.getProduction();
+					double prod = cropusage.getProductionExpected();
 					
 					Map<String, Double> animalRates = animalRateManager.getAnimalRates(country.getCountry(), crop);
 					for (Entry<String, Double> entry : animalRates.entrySet()) {
@@ -553,7 +554,7 @@ public class ModelMain {
 	}
 
 	private YieldRaster getYieldSurfaces(Timestep timestep) {
-		return lpjYieldReader.getShockedRasterData(timestep);
+		return lpjYieldReader.getRasterData(timestep);
 	}
 
 	/** Get irrigation data that does not change with time, should only be called once */
diff --git a/src/ac/ed/lurg/country/AbstractCountryAgent.java b/src/ac/ed/lurg/country/AbstractCountryAgent.java
index 37a709956278ef5f3c75d593abb3fbf16af9f0d4..33d81da774f648e9c4093b17e55496bbc95f6425 100644
--- a/src/ac/ed/lurg/country/AbstractCountryAgent.java
+++ b/src/ac/ed/lurg/country/AbstractCountryAgent.java
@@ -121,7 +121,7 @@ public abstract class AbstractCountryAgent {
 
 				for (CropType crop : commodity.getCropTypes()) {
 					CropUsageData cropUsage = cropUsages.get(crop);
-					double prod = cropUsage.getProduction() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed();
+					double prod = cropUsage.getProductionExpected() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed();
 					totalProd += prod;
 					double minFract = minDemandFracts.get(commodity).containsKey(crop) ? minDemandFracts.get(commodity).get(crop) : 0.0;
 					double netImportsFromMinDemand = minFract * demand - prod;
@@ -158,7 +158,7 @@ public abstract class AbstractCountryAgent {
 				// simple 1-1 commodity to cereal mappings
 				for (CropType crop : commodity.getCropTypes()) {
 					CropUsageData cropUsage = cropUsages.get(crop);
-					double prod =  cropUsage.getProduction() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed();
+					double prod =  cropUsage.getProductionExpected() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed();
 					double netImports = demand - prod;
 					LogWriter.println("Updating net imports " + crop + " to " + netImports);
 					cropUsage.updateNetImports(netImports);
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index 1ab0bae7bd5af0801462f251fef50ea94e647042..3fff02ae45e1e66903eb4e253e4254b8334e4135 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -102,7 +102,7 @@ public class CountryAgent extends AbstractCountryAgent {
 	}
 
 	public GamsRasterOutput determineProduction(Timestep timestep, YieldRaster countryYieldSurfaces, RasterSet<IrrigationItem> irrigData, 
-			Map<CropType, GlobalPrice> worldPrices, double globalGen2EcIncrease, Map<CropType,Double> productionShocks) {
+			Map<CropType, GlobalPrice> worldPrices, double globalGen2EcIncrease) {
 		currentTimestep = timestep;
 
 		calculateCountryPrices(worldPrices, currentTimestep);
@@ -137,14 +137,6 @@ public class CountryAgent extends AbstractCountryAgent {
 
 			GamsRasterOutput result = opti.run();
 
-				for (Entry<CropType, Double> entry : productionShocks.entrySet()) {
-					if(entry != null) {
-						CropType crop = entry.getKey();
-						double shockValue = entry.getValue();
-						result.getCropUsageData().get(crop).updateForShock(shockValue);
-					}
-					
-				}
 	// No longer need this as even profit max calcs imports in GAMS now		
 	//		if (!ModelConfig.ORIG_LEAST_COST_MIN) {
 	//			GamsCountryInput countryInput = input.getCountryInput();
@@ -188,12 +180,12 @@ public class CountryAgent extends AbstractCountryAgent {
 		for (Map.Entry<CropType, CropUsageData> entry : previousGamsRasterOutput.getCropUsageData().entrySet()) {
 			CropUsageData cropUsage = entry.getValue();
 			CropType crop = entry.getKey();
-			double baseTrade = cropUsage.getNetImports();
+			double baseTrade = cropUsage.getNetImportsExpected();
 			double changeUp = 0.0;
 			double changeDown = 0.0;
 
 			if (allowedImportChange > 0.0) {
-				double maxOfProdOrSupply = cropUsage.getProduction() + Math.max(baseTrade, 0);  //max of supply for food
+				double maxOfProdOrSupply = cropUsage.getProductionExpected() + Math.max(baseTrade, 0);  //max of supply for food
 
 				// max of supply overall, needed for when imports are supplying feed and change is zero to allow for production to replace imports
 		// CONFUSING NOT SURE IF NEEDED		if (maxOfProdOrSupply == 0) maxOfProdOrSupply = Math.max(cropUsage.getNetImports() + cropUsage.getProduction() , cropUsage.getProduction());  
diff --git a/src/ac/ed/lurg/country/CountryAgentManager.java b/src/ac/ed/lurg/country/CountryAgentManager.java
index faae8d2aae50c875f01f4d4561f96c4cb53c1bb2..3c59266712c3800427b72d0b7068906098dee646 100644
--- a/src/ac/ed/lurg/country/CountryAgentManager.java
+++ b/src/ac/ed/lurg/country/CountryAgentManager.java
@@ -15,7 +15,6 @@ import ac.ed.lurg.landuse.CropUsageData;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.IrrigationRasterSet;
 import ac.ed.lurg.landuse.LandUseItem;
-import ac.ed.lurg.shock.ProductionShockManager;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.utils.LogWriter;
 import ac.ed.lurg.yield.YieldRaster;
@@ -27,7 +26,6 @@ public class CountryAgentManager {
 	private AbstractDemandManager demandManager;
 	private TradeManager tradeBarrierManager;
 	private SubsidyRateManager subsidyRateManager;
-	private ProductionShockManager productionShockManager;
 	private InternationalMarket internationalMarket;
 	private CountryBoundaryRaster countryBoundaryRaster;
 	private RasterSet<IntegerRasterItem> clusterIdRaster;
@@ -47,7 +45,6 @@ public class CountryAgentManager {
 		this.internationalMarket = internationalMarket;
 		this.globalLandUseRaster = globalLandUseRaster;
 		tradeBarrierManager = new TradeManager(compositeCountryManager);
-		productionShockManager = new ProductionShockManager();
 		subsidyRateManager = new SubsidyRateManager(compositeCountryManager);
 		craftyManager = new CraftyProdManager();
 	}
@@ -111,11 +108,10 @@ public class CountryAgentManager {
 		Collection<RasterKey> countryKeys = countryBoundaryRaster.getKeysFor(ca.getCountry());
 		YieldRaster countryYieldSurfaces = yieldSurfaces.createSubsetForKeys(countryKeys);
 		RasterSet<IrrigationItem> irrigData = currentIrrigationData.createSubsetForKeys(countryKeys);
-		Map<CropType, Double> productionShocks=productionShockManager.getShocksForCountry(timestep, ca.getCountry());
 		
 		// do the optimization
 		try {
-			ca.determineProduction(timestep, countryYieldSurfaces, irrigData, internationalMarket.getWorldPrices(), gen2Increase, productionShocks);
+			ca.determineProduction(timestep, countryYieldSurfaces, irrigData, internationalMarket.getWorldPrices(), gen2Increase);
 			
 			// update global rasters
 			globalLandUseRaster.putAll(ca.getLandUses());
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
index dfd245c294d12c03654f0105b90532901eb200ac..b08f26f1a4e0dbfa248a3e516953f8e5dbdc0ca3 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
@@ -197,11 +197,12 @@ public class GamsLocationOptimiser {
 			}
 		}
 
-		if (DEBUG) LogWriter.println("\nYield (fert/irrig) None/None, Max/None, None/Max, Max/Max,\t [fert p],\t [irrig p],\t {max irrig}");
+		if (DEBUG) LogWriter.println("\nYield (fert/irrig) None/None, Max/None, None/Max, Max/Max, Shock,\t [fert p],\t [irrig p],\t {max irrig}");
 		GAMSParameter yNoneP = inDB.addParameter("yieldNone", 2);
 		GAMSParameter y_fert = inDB.addParameter("yieldFertOnly", 2);
 		GAMSParameter y_irrig = inDB.addParameter("yieldIrrigOnly", 2);
 		GAMSParameter y_both = inDB.addParameter("yieldBoth", 2);
+		GAMSParameter y_shock = inDB.addParameter("yieldShock", 2);
 		GAMSParameter fert_p = inDB.addParameter("fertParam", 2);
 		GAMSParameter irrig_p = inDB.addParameter("irrigParam", 2);
 		GAMSParameter irrigMaxP = inDB.addParameter("irrigMaxRate", 2);
@@ -224,14 +225,15 @@ public class GamsLocationOptimiser {
 				
 				double maxIrrig = irrigationItem.getMaxIrrigAmount(crop);
 				
-				if (DEBUG) LogWriter.println(String.format("%d     %15s,\t %.1f,\t %.1f, \t %.1f,\t %.1f,\t\t [%.2f],\t [%.2f],\t {%.2f}", 
-						locationId, crop.getGamsName(), yresp.getYieldNone(crop), yresp.getYieldFertOnly(crop), yresp.getYieldIrrigOnly(crop), yresp.getYieldMax(crop), 
+				if (DEBUG) LogWriter.println(String.format("%d      %15s,\t %.1f,\t %.1f, \t %.1f,\t %.1f,\t %.2f,\t\t [%.2f],\t [%.2f],\t {%.2f}", 
+						locationId, crop.getGamsName(), yresp.getYieldNone(crop), yresp.getYieldFertOnly(crop), yresp.getYieldIrrigOnly(crop), yresp.getYieldMax(crop), yresp.getShockRate(crop), 
 						yresp.getFertParam(crop), yresp.getIrrigParam(crop), maxIrrig));
 
 				setGamsParamValue(yNoneP.addRecord(v), yresp.getYieldNone(crop), 4);
 				setGamsParamValue(y_fert.addRecord(v), yresp.getYieldFertOnly(crop), 4);
 				setGamsParamValue(y_irrig.addRecord(v), yresp.getYieldIrrigOnly(crop), 4);
 				setGamsParamValue(y_both.addRecord(v), yresp.getYieldMax(crop), 4);
+				setGamsParamValue(y_shock.addRecord(v), yresp.getShockRate(crop), 4);
 				setGamsParamValue(fert_p.addRecord(v), yresp.getFertParam(crop), 4);
 				setGamsParamValue(irrig_p.addRecord(v), yresp.getIrrigParam(crop), 4);
 				setGamsParamValue(irrigMaxP.addRecord(v), maxIrrig, 3);
@@ -266,7 +268,7 @@ public class GamsLocationOptimiser {
 			double exportPrice = gp.getExportPrice();
 			
 			CropUsageData cu = countryInput.getPreviousCropUsageData().get(crop);
-			double netImports = cu.getNetImports();
+			double netImports = cu.getNetImportsExpected();
 			double imports = netImports>0 ? netImports : 0;
 			double exports = netImports<0 ? -netImports : 0;
 
@@ -356,6 +358,7 @@ public class GamsLocationOptimiser {
 		GAMSParameter parmProdCost = outDB.getParameter("totalProdCost");
 		GAMSParameter parmCroplandArea = outDB.getParameter("totalCropland");
 		GAMSParameter parmTotalArea = outDB.getParameter("totalArea");
+		GAMSParameter parmProdShock = outDB.getParameter("productionShock");
 		
 		double totalCropArea = 0;
 		double totalPastureArea = 0;
@@ -390,9 +393,10 @@ public class GamsLocationOptimiser {
 				prod =  getParmValue(parmProd, itemName);
 				prodCost = getParmValue(parmProdCost, itemName);
 				double totalArea = getParmValue(parmTotalArea, itemName);
+				double prodShock = getParmValue(parmProdShock, itemName);
 
-				cropUsageData.put(cropType, new CropUsageData(ruminantFeed, monogastricFeed, netImport, netImportCost, prod, prodCost, totalArea));
-				if (DEBUG) LogWriter.println(String.format("\n%s:\tarea= %.1f,\tmonogastricFeed= %.1f,\truminantFeed= %.1f,\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f,\tprodCost= %.3f,\tprodCostRate= %.3f", itemName, totalArea, monogastricFeed, ruminantFeed, netImport, netImportCost, prod, prodCost, prodCost/prod)); 
+				cropUsageData.put(cropType, new CropUsageData(ruminantFeed, monogastricFeed, netImport, netImportCost, prod, prodCost, totalArea, prodShock));
+				if (DEBUG) LogWriter.println(String.format("\n%s:\tarea= %.1f,\tmonogastricFeed= %.1f,\truminantFeed= %.1f,\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f, \tprodCost= %.3f,\tprodCostRate= %.3f,\tprodShock= %.3f", itemName, totalArea, monogastricFeed, ruminantFeed, netImport, netImportCost, prod, prodCost, prodCost/prod, prodShock)); 
 			
 			}
 
@@ -424,14 +428,14 @@ public class GamsLocationOptimiser {
 			prod = getParmValue(parmProd, meatTypes.getGamsName());
 			prodCost = getParmValue(parmProdCost, meatTypes.getGamsName());
 
-			cropUsageData.put(meatTypes, new CropUsageData(0.0, 0.0, netImport, netImportCost, prod, prodCost, Double.NaN));
+			cropUsageData.put(meatTypes, new CropUsageData(0.0, 0.0, netImport, netImportCost, prod, prodCost, Double.NaN, 0));
 			if (DEBUG) LogWriter.println(String.format("\n%s:\t\t\t\t\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f,\tprodCost= %.3f", meatTypes.getGamsName(), netImport, netImportCost, prod, prodCost)); 
 		}
 		LogWriter.println(String.format("\n%s %s: Total area= %.1f (crop=%.1f, pasture %.1f)", 
 				inputData.getCountryInput().getCountry(), inputData.getTimestep().getYear(), 
 				totalCropArea+totalPastureArea, totalCropArea, totalPastureArea));
 
-		GamsLocationOutput results = new GamsLocationOutput(modelStatus, landUses, cropUsageData, null);
+		GamsLocationOutput results = new GamsLocationOutput(modelStatus, landUses, cropUsageData);
 		return results;
 	}
 
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
index 5e8d1abf4dd69e54987a4a4fd4263fece059b4bf..df3ed1a1ea10d85f142bcbf29993035e978c90ad 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
@@ -14,8 +14,7 @@ public class GamsLocationOutput {
 	
 	public GamsLocationOutput(int status, 
 			Map<Integer, LandUseItem> landUses, 
-			Map<CropType, CropUsageData> cropUsageData,
-			Map<CropType, Double> cropAdjustments) {
+			Map<CropType, CropUsageData> cropUsageData) {
 		super();
 		this.status = status;
 		this.landUses = landUses;
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index e222e515c3681c47c76ab412d5d40d9f053f27a2..b6602c587c6356b96f3672708019d982c47bd8a2 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -366,6 +366,13 @@ public class GamsRasterOptimiser {
 								aggYResp.setYield(yieldType, crop, updatedYield);
 							}
 						}
+						
+						double s = yresp.getShockRate(crop);
+						if (!Double.isNaN(s)) {
+							double shockSoFar = aggYResp.getShockRate(crop);
+							double updatedShock = aggregateMean(shockSoFar, suitableAreaSoFar, s, suitableAreaThisTime);
+							aggYResp.setShockRate(crop, updatedShock);
+						}
 					}
 					
 					double areaSoFar = aggLandUse.getCropArea(crop);
diff --git a/src/ac/ed/lurg/landuse/CropUsageData.java b/src/ac/ed/lurg/landuse/CropUsageData.java
index 1299392bb2643ad1dcebc578a2f617c5cc54c1c7..4f6049ae0ae97dfcbad5fc2d4ae3e9e80115317b 100644
--- a/src/ac/ed/lurg/landuse/CropUsageData.java
+++ b/src/ac/ed/lurg/landuse/CropUsageData.java
@@ -4,26 +4,26 @@ public class CropUsageData {
 	
 	private double ruminantFeed;
 	private double monogastricFeed;
-	private double netImports;
-	private double netImportCost;
+	private double netImportsExpected;
+	private double prodShock;
+	private double netImportCostExpected;
 	private double prod;
 	private double prodCost;
 	private double area;
-	private Double shockedNetImports;
-	private Double shockedProd;
 
 	public CropUsageData(double prod) {
 		this.prod = prod;
 	}
 	
-	public CropUsageData(double ruminantFeed, double monogastricFeed, double netImports, double netImportCost, double prod, double prodCost, double area) {
+	public CropUsageData(double ruminantFeed, double monogastricFeed, double netImportsExpected, double netImportCost, double prod, double prodCost, double area, double prodShock) {
 		this.ruminantFeed = ruminantFeed;
 		this.monogastricFeed = monogastricFeed;
-		this.netImports = netImports;
-		this.netImportCost = netImportCost;
+		this.netImportsExpected = netImportsExpected;
+		this.netImportCostExpected = netImportCost;
 		this.prod = prod;
 		this.prodCost = prodCost;
 		this.area= area;
+		this.prodShock = prodShock;
 	}
 		
 	public double getRuminantFeed() {
@@ -34,24 +34,24 @@ public class CropUsageData {
 		return monogastricFeed;
 	}
 
-	public double getNetImportCost() {
-		return netImportCost;
+	public double getNetImportCostExpected() {
+		return netImportCostExpected;
 	}
 	
-	public double getNetImports() {
-		return netImports;
+	public double getNetImportsExpected() {
+		return netImportsExpected;
 	}
 	
-	public double getProduction() {
+	public double getProductionExpected() {
 		return prod;
 	}
 	
-	public Double getShockedNetImports() {
-		return shockedNetImports;
+	public double getShockedNetImports() {
+		return netImportsExpected + prodShock;
 	}
 	
-	public Double getShockedProduction() {
-		return shockedProd;
+	public double getProductionShock() {
+		return prodShock;
 	}
 	
 	public double getProdCost() {
@@ -59,20 +59,10 @@ public class CropUsageData {
 	}
 
 	public void updateNetImports(double netImports) {
-		this.netImports = netImports;
+		this.netImportsExpected = netImports;
 	}
 	
 	public double getArea(){
 		return area;
 	}
-	
-	public void updateForShock(double shockValue) {
-		
-		double productionLoss = prod*shockValue;
-		this.shockedProd = prod - productionLoss;
-		this.shockedNetImports = netImports + productionLoss;
-
-	}
-	
-	
-}
+}
\ No newline at end of file
diff --git a/src/ac/ed/lurg/landuse/CropUsageReader.java b/src/ac/ed/lurg/landuse/CropUsageReader.java
index 8882fb170899f426ab4db5a49cdf9017cdcb4527..195475162e0fe17cf77c44cfde047dd75a2aa9f4 100644
--- a/src/ac/ed/lurg/landuse/CropUsageReader.java
+++ b/src/ac/ed/lurg/landuse/CropUsageReader.java
@@ -33,7 +33,7 @@ public class CropUsageReader {
 		LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>> commodityMap = new LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>>() {
 			protected Map<CropType, CropUsageData> createValue() { 
 				Map<CropType, CropUsageData> countryData = new HashMap<CropType, CropUsageData>();
-				countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN)); // 2nd generation energy crops not in FAO data, so adding zero values.
+				countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN, 0)); // 2nd generation energy crops not in FAO data, so adding zero values.
 				return countryData;
 			}
 		};
@@ -66,11 +66,11 @@ public class CropUsageReader {
 				
 				// aggregate if multiple countries for cc
 				if (oldData != null) {
-					netImports += oldData.getNetImports();
-					production += oldData.getProduction();
+					netImports += oldData.getNetImportsExpected();
+					production += oldData.getProductionExpected();
 				}
 				
-				CropUsageData newData = new CropUsageData(0, 0, netImports, Double.NaN, production, Double.NaN, Double.NaN);
+				CropUsageData newData = new CropUsageData(0, 0, netImports, Double.NaN, production, Double.NaN, Double.NaN, 0);
 				countryData.put(crop, newData);
 			} 
 			fitReader.close(); 
diff --git a/src/ac/ed/lurg/shock/YieldShockManager.java b/src/ac/ed/lurg/shock/YieldShockManager.java
index 76f6d87cf09c5a524e4faa0d07ed2f869f1a5686..00f0858664ada4baf2289de1c026884efdc81b2d 100644
--- a/src/ac/ed/lurg/shock/YieldShockManager.java
+++ b/src/ac/ed/lurg/shock/YieldShockManager.java
@@ -55,7 +55,7 @@ public class YieldShockManager {
 		return yieldShockMap;
 	}
 
-	public void applyShock(YieldRaster yieldRaster, Timestep timestep) {
+	public void setShocks(YieldRaster yieldRaster, Timestep timestep) {
 		Map<String, String> queryMap = new HashMap<String, String>();
 		queryMap.put("year", Integer.toString(timestep.getYear()));
 
@@ -87,9 +87,8 @@ public class YieldShockManager {
 			if (value.isShocked()) {
 				YieldResponsesItem yieldRespItem = yieldRaster.get(entry.getKey());
 				if (yieldRespItem != null)
-					yieldRespItem.adjustYields(crop, yieldAdjustment);
+					yieldRespItem.setShockRate(crop, yieldAdjustment);
 			}
 		}
-		return ;
 	}
-}
+}
\ No newline at end of file
diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
index ed9832d766114f3bc0a4164fba3c0d8a839ad94e..19263fe102b462bd54e11801be7f819f3cc01aad 100644
--- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
+++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
@@ -24,16 +24,10 @@ public class LPJYieldResponseMapReader {
 	private YieldShockManager yieldShockManager;
 
 	public LPJYieldResponseMapReader(RasterHeaderDetails rasterProj) {
-		this.rasterProj = rasterProj; 
+		this.rasterProj = rasterProj;
 		yieldShockManager = new YieldShockManager(rasterProj);
 	}
 
-	public YieldRaster getShockedRasterData(Timestep timestep) {
-		YieldRaster yieldRaster = getRasterData(timestep);
-		yieldShockManager.applyShock(yieldRaster, timestep);
-		return yieldRaster;
-	}
-		
 	public YieldRaster getRasterData(Timestep timestep) {
 		String rootDir = timestep.getYearSubDir(ModelConfig.YIELD_DIR);
 		
@@ -60,6 +54,8 @@ public class LPJYieldResponseMapReader {
 		readNppFile(yieldRaster, rootDir+File.separator+ModelConfig.ANPP_FILENAME);
 		readYieldFile(yieldRaster, rootDir+File.separator+ModelConfig.YIELD_FILENAME);
 		
+		yieldShockManager.setShocks(yieldRaster, timestep);
+
 		return yieldRaster;
 	}
 	
diff --git a/src/ac/ed/lurg/yield/YieldResponse.java b/src/ac/ed/lurg/yield/YieldResponse.java
index 66c9272c1b86c5614feef1c7606b007bdd45cff7..86e1e9b2a66110c20f554b4cfd9a50422a2d7230 100644
--- a/src/ac/ed/lurg/yield/YieldResponse.java
+++ b/src/ac/ed/lurg/yield/YieldResponse.java
@@ -7,7 +7,8 @@ import ac.ed.lurg.ModelConfig;
 import ac.ed.lurg.types.YieldType;
 
 public class YieldResponse {
-	Map<YieldType, Double> yields = new HashMap<YieldType, Double>();
+	private Map<YieldType, Double> yields = new HashMap<YieldType, Double>();
+	private double yieldShock;
 	private double fertParm;
 	private double irrigParm;
 
@@ -62,9 +63,11 @@ public class YieldResponse {
 	//	return Math.log((yMid - yMin)/(yMax - yMin)) / Math.log((xMid - xMin)/(xMax - xMin)) / xMax;  	// Cobb-Douglas
 	}
 	
-	public void adjustYields(double adjustment) {
-		for (Map.Entry<YieldType, Double> entry : yields.entrySet()) {
-			yields.put(entry.getKey(), entry.getValue() * (1-adjustment));
-		}
+	public void setShock(double yieldShock) {
+		this.yieldShock = yieldShock;
+	}
+	
+	public double getShock() {
+		return yieldShock;
 	}
 }
\ No newline at end of file
diff --git a/src/ac/ed/lurg/yield/YieldResponsesItem.java b/src/ac/ed/lurg/yield/YieldResponsesItem.java
index 97b2a5d3a3068e916bb05f40541704f70b344f4a..e78fa2ff79316084cd243949d99aa0d0a9265720 100644
--- a/src/ac/ed/lurg/yield/YieldResponsesItem.java
+++ b/src/ac/ed/lurg/yield/YieldResponsesItem.java
@@ -57,8 +57,11 @@ public class YieldResponsesItem implements RasterItem {
 		return getYieldResponseForCrop(crop).getIrrigParam();
 	}
 	
-	public void adjustYields(CropType crop, double adjustment) {
-		YieldResponse yresp = getYieldResponseForCrop(crop);
-		yresp.adjustYields(adjustment);
+	public void setShockRate(CropType crop, double yieldShock) {
+		getYieldResponseForCrop(crop).setShock(yieldShock);
+	}
+	
+	public double getShockRate(CropType crop) {
+		return getYieldResponseForCrop(crop).getShock();
 	}
 }
\ No newline at end of file