diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms
index db5f3d5ff0cc7231f464108beee7e938bc358959..594cea85e4bd851c7480784df9e0ab739b2086fc 100644
--- a/GAMS/IntExtOpt.gms
+++ b/GAMS/IntExtOpt.gms
@@ -139,9 +139,7 @@ $gdxin
  PARAMETER animalProdCost(animal)
           /   ruminants       0.20
               monogastrics    0.20  /;
-              
- fertiliserUnitCost = 1.2;
-              
+
 
  PARAMETER previousNetImport(import_types);
  previousNetImport(import_types) = previousImportAmount(import_types) - previousExportAmount(import_types);
diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java
index 31c1c2ab33fdcbc13a84c4cd41a9d4cad843d728..df729dbecde18ff0c3d3255083d06119655edff5 100755
--- a/src/ac/ed/lurg/ModelConfig.java
+++ b/src/ac/ed/lurg/ModelConfig.java
@@ -1,8 +1,6 @@
 package ac.ed.lurg;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
+import java.io.*;
 import java.util.Enumeration;
 import java.util.Properties;
 import java.lang.Long;
@@ -22,6 +20,8 @@ public class ModelConfig {
 
 	private static parameterShocksReader shocksReader;
 	private static CarbonOptionsManager carbonOptionsManager;
+	private static Properties calibConfigFile;
+	private Timestep timestep;
 
 	private ModelConfig() {
 		configFile = new Properties();
@@ -36,6 +36,15 @@ public class ModelConfig {
 		}
 	}
 
+	public static void readCalibConfigFile() {
+		calibConfigFile = new Properties();
+		try {
+			calibConfigFile.load(new FileInputStream(ModelConfig.CALIB_CONFIG_FILE));
+		} catch	(IOException e) {
+			e.printStackTrace();
+		}
+	}
+
 	public static String getSetupDetails() {
 		String buildVerion = System.getProperty("BUILDVER");
 		StringBuffer sb = new StringBuffer("Build version: " + buildVerion + "\n");
@@ -50,13 +59,17 @@ public class ModelConfig {
 		return sb.toString();
 	}
 
-	private static ModelConfig getModelConfig() {
+	public static ModelConfig getModelConfig() {
 		if (modelConfig == null)
 			modelConfig = new ModelConfig();
 
 		return modelConfig;
 	}
 
+	public void setTimestep(Timestep timestep) {
+		this.timestep = timestep;
+	}
+
 	private static String getProperty(String prop) {
 		return getModelConfig().getProp(prop);
 	}
@@ -129,6 +142,46 @@ public class ModelConfig {
 		}
 		return value;
 	}
+
+	// Gradually adjust parameter from calibrated value to current value to avoid sudden shocks (except when intentionally shocked)
+	public static double getAdjParam(String param, Timestep timestep) {
+		if (ModelConfig.SHOCKS_POSSIBLE) {
+			return updateParameterForShocks(timestep.getYear(), param);
+		}
+
+		if (calibConfigFile == null & !ModelConfig.IS_CALIBRATION_RUN) {
+			readCalibConfigFile();
+		}
+
+		double endParam = Double.NaN;
+		try {
+			endParam = getModelConfig().getClass().getField(param).getDouble(param);
+		} catch (NoSuchFieldException | IllegalAccessException e) {
+			e.printStackTrace();
+		}
+
+		if (IS_CALIBRATION_RUN) {
+			return endParam;
+		} else {
+			double startParam;
+			if (calibConfigFile.getProperty(param) != null) {
+				startParam = Double.parseDouble(calibConfigFile.getProperty(param));
+			} else { // Can't find value used in calibration so use current value
+				startParam = endParam;
+			}
+
+			// Weighted average
+			double weighting = Math.min(((double) timestep.getTimestep()) / ModelConfig.CALIB_TRANSITION_TIME, 1.0);
+			return endParam * weighting + startParam * (1 - weighting);
+		}
+	}
+
+	public static double getAdjParam(String param) {
+		if (getModelConfig().timestep == null) { // need this during initial setup
+			getModelConfig().setTimestep(new Timestep(ModelConfig.START_TIMESTEP));
+		}
+		return getAdjParam(param, getModelConfig().timestep);
+	}
 	
 	public static boolean getCarbonOption(LandCoverType fromLc, LandCoverType toLc) {
 		if (IS_CARBON_ON) {
@@ -227,19 +280,18 @@ public class ModelConfig {
 	public static final String PASTURE_C4_COLUMN  = getProperty("PASTURE_C4_COLUMN", "C4G_pas");
 
 	// These are production prices in PLUM style feed equivalent terms
-	public static final double INITIAL_PRICE_SHIFT = getDoubleProperty("INITIAL_PRICE_SHIFT", 1.0);
-	public static final double INITAL_PRICE_WHEAT = getDoubleProperty("INITAL_PRICE_WHEAT", 0.144 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_MAIZE = getDoubleProperty("INITAL_PRICE_MAIZE", 0.0867 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_RICE = getDoubleProperty("INITAL_PRICE_RICE", 0.147 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_OILCROPS_NFIX = getDoubleProperty("INITAL_PRICE_OILCROPS_NFIX", 0.183 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_OILCROPS_OTHER = getDoubleProperty("INITAL_PRICE_OILCROPS_OTHER", 0.178 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_PULSES = getDoubleProperty("INITAL_PRICE_PULSES", 0.167 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_STARCHYROOTS = getDoubleProperty("INITAL_PRICE_STARCHYROOTS", 0.0405 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_MONOGASTRICS = getDoubleProperty("INITAL_PRICE_MONOGASTRICS", 0.318 * ModelConfig.INITIAL_PRICE_SHIFT); // value from calibration
-	public static final double INITAL_PRICE_RUMINANTS = getDoubleProperty("INITAL_PRICE_RUMINANTS", 0.246 * ModelConfig.INITIAL_PRICE_SHIFT); // value from calibration
-	public static final double INITAL_PRICE_ENERGYCROPS = getDoubleProperty("INITAL_PRICE_ENERGYCROPS", 0.0377 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_FRUITVEG = getDoubleProperty("INITAL_PRICE_FRUITVEG", 0.0506 * ModelConfig.INITIAL_PRICE_SHIFT);
-	public static final double INITAL_PRICE_SUGAR = getDoubleProperty("INITAL_PRICE_SUGAR", 0.0113 * ModelConfig.INITIAL_PRICE_SHIFT);
+	public static final double INITAL_PRICE_WHEAT = getDoubleProperty("INITAL_PRICE_WHEAT", 0.144);
+	public static final double INITAL_PRICE_MAIZE = getDoubleProperty("INITAL_PRICE_MAIZE", 0.0867);
+	public static final double INITAL_PRICE_RICE = getDoubleProperty("INITAL_PRICE_RICE", 0.147);
+	public static final double INITAL_PRICE_OILCROPS_NFIX = getDoubleProperty("INITAL_PRICE_OILCROPS_NFIX", 0.183);
+	public static final double INITAL_PRICE_OILCROPS_OTHER = getDoubleProperty("INITAL_PRICE_OILCROPS_OTHER", 0.178);
+	public static final double INITAL_PRICE_PULSES = getDoubleProperty("INITAL_PRICE_PULSES", 0.167);
+	public static final double INITAL_PRICE_STARCHYROOTS = getDoubleProperty("INITAL_PRICE_STARCHYROOTS", 0.0405);
+	public static final double INITAL_PRICE_MONOGASTRICS = getDoubleProperty("INITAL_PRICE_MONOGASTRICS", 0.318); // value from calibration
+	public static final double INITAL_PRICE_RUMINANTS = getDoubleProperty("INITAL_PRICE_RUMINANTS", 0.246); // value from calibration
+	public static final double INITAL_PRICE_ENERGYCROPS = getDoubleProperty("INITAL_PRICE_ENERGYCROPS", 0.0377);
+	public static final double INITAL_PRICE_FRUITVEG = getDoubleProperty("INITAL_PRICE_FRUITVEG", 0.0506);
+	public static final double INITAL_PRICE_SUGAR = getDoubleProperty("INITAL_PRICE_SUGAR", 0.0113);
 
 	// These are initial demand system prices in 2000 kcal terms
 	public static final double INITAL_DEMAND_PRICE_CEREALS_STARCHY_ROOTS = getDoubleProperty("INITAL_DEMAND_PRICE_CEREALS_STARCHY_ROOTS", 110.23);
@@ -307,9 +359,6 @@ public class ModelConfig {
 	public static final String C_FLUX_PAST_FILENAME = getProperty("C_FLUX_PAST_FILENAME", "cflux_landsymm_sts_past.dat");
 	public static final String C_FLUX_FORS_FILENAME = getProperty("C_FLUX_FORS_FILENAME", "cflux_landsymm_sts_forC.dat");
 
-	
-	public static final String LAND_COVER_AGE_DIST_FILENAME = SPATIAL_DATA_DIR + File.separator + "land_cover_age_dist.txt";
-	public static final int LAND_COVER_INIT_AGE_GROUP_SIZE = getIntProperty("LAND_COVER_INIT_AGE_GROUP_SIZE", 10); // years
 	public static final int CARBON_DATA_TIMESTEP_SIZE = getIntProperty("WOOD_AND_CARBON_TIMESTEP_SIZE", 20); // years
 	public static final double WOOD_YIELD_CALIB_FACTOR = getDoubleProperty("WOOD_YIELD_CALIB_FACTOR", 1.0); 
 	public static final int CARBON_DATA_MIN_YEAR = getIntProperty("CARBON_DATA_MIN_YEAR", 1850); // Carbon and wood data
@@ -347,6 +396,8 @@ public class ModelConfig {
 	public static final String SERIALIZED_LAND_COVER_FILE = CALIB_DIR + File.separator + SERIALIZED_LAND_COVER_FILENAME;
 	public static final String SERIALIZED_WOOD_USAGE_FILE = CALIB_DIR + File.separator + SERIALIZED_WOOD_USAGE_FILENAME;
 	public static final String SERIALIZED_CARBON_USAGE_FILE = CALIB_DIR + File.separator + SERIALIZED_CARBON_USAGE_FILENAME;
+	public static final String CALIB_CONFIG_FILENAME = "calib_config.properties";
+	public static final String CALIB_CONFIG_FILE = CALIB_DIR + File.separator + CALIB_CONFIG_FILENAME;
 	public static final String CHECKPOINT_LAND_USE_FILE = getProperty("CHECKPOINT_LAND_USE_FILE", OUTPUT_DIR + File.separator +  SERIALIZED_LAND_USE_FILENAME);
 	public static final String CHECKPOINT_DEMAND_MANAGER_FILE = getProperty("CHECKPOINT_DEMAND_MANAGER_FILE", OUTPUT_DIR + File.separator +  SERIALIZED_DEMAND_MANAGER_FILENAME);
 	public static final String CHECKPOINT_CROP_USAGE_FILE = getProperty("CHECKPOINT_CROP_USAGE_FILE", OUTPUT_DIR + File.separator +  SERIALIZED_CROP_USAGE_FILENAME);
@@ -355,7 +406,8 @@ public class ModelConfig {
 	public static final String CHECKPOINT_WOOD_USAGE_FILE = getProperty("CHECKPOINT_WOOD_USAGE_FILE", OUTPUT_DIR + File.separator +  SERIALIZED_WOOD_USAGE_FILENAME);
 	public static final String CHECKPOINT_CARBON_USAGE_FILE = getProperty("CHECKPOINT_CARBON_USAGE_FILE", OUTPUT_DIR + File.separator +  SERIALIZED_CARBON_USAGE_FILENAME);
 	public static final boolean USE_INITIAL_CROP_USAGE_DATA = getBooleanProperty("USE_INITIAL_CROP_USAGE_DATA", false); // Read crop usage from file rather than serialized
-	
+	public static final int CALIB_TRANSITION_TIME = getIntProperty("CALIB_TRANSITION_TIME", 10); // transition from calibration to current values over this time
+
 	public static final boolean MARKET_ADJ_PRICE = getBooleanProperty("MARKET_ADJ_PRICE", true);
 	public static final boolean CHANGE_YIELD_DATA_YEAR = IS_CALIBRATION_RUN ? false : getBooleanProperty("CHANGE_YIELD_DATA_YEAR", true);
 	public static final String CLUSTERED_YIELD_FILE = getProperty("CLUSTERED_YIELD_FILE", CALIB_DIR + File.separator + "cluster.asc");
@@ -400,7 +452,7 @@ public class ModelConfig {
 	
 	public static final double PASTURE_HARVEST_FRACTION = getDoubleProperty("PASTURE_HARVEST_FRACTION", 0.5);
 	public static final double MEAT_EFFICIENCY = getDoubleProperty("MEAT_EFFICIENCY", 1.0);  // 'meat' is includes feed conversion ratio already, this is tech. change or similar
-	public static final double IRRIGIATION_EFFICIENCY = getDoubleProperty("IRRIGIATION_EFFICIENCY", 0.5);
+	public static final double IRRIGATION_EFFICIENCY = getDoubleProperty("IRRIGATION_EFFICIENCY", 0.5);
 	public static final int ELLIOTT_BASEYEAR = 2010;
 	public static final double ENVIRONMENTAL_WATER_CONSTRAINT = getDoubleProperty("ENVIRONMENTAL_WATER_CONSTRAINT", 0.5); // change with care, as due to normalisation it might not have the impact you first imagine
 	public static final double OTHER_WATER_USE_FACTOR = getDoubleProperty("OTHER_WATER_USE_FACTOR", 1.0);
@@ -410,10 +462,10 @@ public class ModelConfig {
 	public static final String CONVERSION_COST_FILE = getProperty("CONVERSION_COST_FILE", DATA_DIR + File.separator + "conversion_costs.csv"); // cost of converting from one land cover to another, $1000/ha
 	public static final double LAND_CONVERSION_COST_FACTOR = getDoubleProperty("LAND_CONVERSION_COST_FACTOR", 1.0); // for monte carlo
 	public static final double AGRI_LAND_EXPANSION_COST_FACTOR = getDoubleProperty("AGRI_LAND_EXPANSION_COST_FACTOR", 1.0); // for monte carlo
-	public static final double CROPLAND_CONVERSION_COST = getDoubleProperty("CROPLAND_CONVERSION_COST", 0.3 * LAND_CONVERSION_COST_FACTOR);
-	public static final double PASTURE_CONVERSION_COST = getDoubleProperty("PASTURE_CONVERSION_COST", 0.2 * LAND_CONVERSION_COST_FACTOR);
-	public static final double FOREST_CONVERSION_COST = getDoubleProperty("FOREST_CONVERSION_COST", 0.5 * LAND_CONVERSION_COST_FACTOR);
-	public static final double NATURAL_CONVERSION_COST = getDoubleProperty("NATURAL_CONVERSION_COST", 0.02 * LAND_CONVERSION_COST_FACTOR);
+	public static final double CROPLAND_CONVERSION_COST = getDoubleProperty("CROPLAND_CONVERSION_COST", 0.3);
+	public static final double PASTURE_CONVERSION_COST = getDoubleProperty("PASTURE_CONVERSION_COST", 0.2);
+	public static final double FOREST_CONVERSION_COST = getDoubleProperty("FOREST_CONVERSION_COST", 0.5);
+	public static final double NATURAL_CONVERSION_COST = getDoubleProperty("NATURAL_CONVERSION_COST", 0.02);
 
 	public static final double TECHNOLOGY_CHANGE_ANNUAL_RATE = getDoubleProperty("TECHNOLOGY_CHANGE_ANNUAL_RATE", 0.002);
 	public static final int TECHNOLOGY_CHANGE_START_STEP = getIntProperty("TECHNOLOGY_CHANGE_START_STEP", 0);
@@ -457,7 +509,7 @@ public class ModelConfig {
 	public static final double IRRIG_COST_SCALE_FACTOR = getDoubleProperty("IRRIG_COST_SCALE_FACTOR", 0.00035);
 	public static final double IRRIG_COST_MULTIPLIER = getDoubleProperty("IRRIG_COST_MULTIPLIER", 1.0);
 	public static final double FERTILISER_COST_PER_T = getDoubleProperty("FERTILISER_COST_PER_T", 1.2); // $1000 per tonne
-	public static final double FERTILISER_MAX_COST = FERTILISER_COST_PER_T * MAX_FERT_AMOUNT/1000;
+	public static final double FERTILISER_MAX_COST = ModelConfig.getAdjParam("FERTILISER_COST_PER_T") * MAX_FERT_AMOUNT/1000;
 
 	public static final double DOMESTIC_PRICE_MARKUP = getDoubleProperty("DOMESTIC_PRICE_MARKUP", 1.0);
 	public static final double TRANSPORT_LOSSES = getDoubleProperty("TRANSPORT_LOSSES", 0.05);  // in international trade
diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index bd97461bab523679b68050fdfc2f955cc1b70bb1..6077ea732c36c9a5531821b72088bbaf1c542fe2 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -24,6 +24,7 @@ import ac.ed.lurg.yield.YieldResponsesItem;
 import ac.sac.raster.*;
 
 import java.io.*;
+import java.lang.reflect.Field;
 import java.util.*;
 import java.util.Map.Entry;
 
@@ -56,7 +57,7 @@ public class ModelMain {
 	/* setup models, reading inputs, etc. */
 	private void setup() {
 		desiredProjection = RasterHeaderDetails.getGlobalHeaderFromCellSize(ModelConfig.CELL_SIZE_X, ModelConfig.CELL_SIZE_Y, "999");
-		
+
 		BaseConsumpManager baseConsumpManager = new BaseConsumpManager();
 		CalorieManager calorieManager = new CalorieManager();
 		
@@ -79,6 +80,9 @@ public class ModelMain {
 		
 		woodYieldReader = new WoodYieldReader(desiredProjection);
 		carbonFluxReader = new CarbonFluxReader(desiredProjection);
+
+		if (ModelConfig.IS_CALIBRATION_RUN)
+			saveConfig();
 		
 		createCountryAgents(CountryManager.getInstance().getAllCompositeCountries());
 	}
@@ -98,6 +102,7 @@ public class ModelMain {
 	
 	private void doTimestep(Timestep timestep) {
 		LogWriter.println("Timestep: " + timestep.toString());
+		ModelConfig.getModelConfig().setTimestep(timestep);
 
 		if (ModelConfig.IS_CALIBRATION_RUN && timestep.isInitialTimestep()) { // initialize trade and production
 			internationalMarket.determineInternationalTrade(countryAgents.getAll(), timestep);
@@ -878,6 +883,28 @@ public class ModelMain {
 		countryAgents.serializeCarbonUsageForAll();
 		internationalMarket.serializeGlobalPrices();
 		serializeElasticDemandManager();
+		saveConfig();
+	}
+
+	private void saveConfig() {
+		try {
+			FileWriter fstream = new FileWriter(ModelConfig.CALIB_CONFIG_FILE);
+			BufferedWriter outputFile = new BufferedWriter(fstream);
+			for (Field field : ModelConfig.class.getDeclaredFields()) {
+				String parameter = field.getName();
+				Class<?> paramType = field.getType();
+				if (paramType.getName().equals("double")) {
+					Double value = field.getDouble(parameter);
+					outputFile.write(String.format("%s=%s", parameter, value));
+					outputFile.newLine();
+				}
+			}
+			outputFile.close();
+		} catch (IOException i) {
+			i.printStackTrace();
+		} catch (IllegalAccessException e) {
+			throw new RuntimeException(e);
+		}
 	}
 
 	// Checks for data coverage. Fills missing data with defaults. Currently this is zeroes but plan to use
diff --git a/src/ac/ed/lurg/Timestep.java b/src/ac/ed/lurg/Timestep.java
index ff72acc40800b3e32296d79b519c5e9744ad9d11..f50550ac7baba9bf80a4d91800578ad21834eab8 100644
--- a/src/ac/ed/lurg/Timestep.java
+++ b/src/ac/ed/lurg/Timestep.java
@@ -18,6 +18,10 @@ public class Timestep implements Serializable {
 	public int getTimestep() {
 		return timestep;
 	}
+
+	public static Timestep getTimestepFromYear(int year) {
+		return new Timestep(year - ModelConfig.BASE_YEAR);
+	}
 	
 	private static int getYear(int tstep) {
 		return ModelConfig.TIMESTEP_SIZE * tstep + ModelConfig.BASE_YEAR;
diff --git a/src/ac/ed/lurg/country/GlobalPrice.java b/src/ac/ed/lurg/country/GlobalPrice.java
index e08cfa84bd3241ac48b563812ba6e5daf33e5200..9d9cbfeb49098897601e273d632a26795ed7f14c 100644
--- a/src/ac/ed/lurg/country/GlobalPrice.java
+++ b/src/ac/ed/lurg/country/GlobalPrice.java
@@ -101,14 +101,18 @@ public class GlobalPrice implements Serializable {
 			LogWriter.println(String.format("     updatedStock %.2f, previous %.2f (last timestep %.2f), stockChange %.2f, oldDiff %.2f", updatedStock, stockLevel, stockLevel-oldDiff, stockChange, oldDiff), 2);
 			
 			double adjustment = 1;
+			double marketLambda = ModelConfig.getAdjParam( "MARKET_LAMBDA");
 
-			if (!ModelConfig.MARKET_ADJ_PRICE || (ModelConfig.IS_CALIBRATION_RUN && thisTimeStep.getTimestep() <= ModelConfig.END_FIRST_STAGE_CALIBRATION)) {
+			if (!ModelConfig.MARKET_ADJ_PRICE
+					|| (ModelConfig.IS_CALIBRATION_RUN && thisTimeStep.getTimestep() <= ModelConfig.END_FIRST_STAGE_CALIBRATION)
+					|| thisTimeStep.isInitialTimestep()) {
 				adjustment = 1;
 			}
 			else if (ModelConfig.PRICE_UPDATE_METHOD.equals("StockFlow")) {
 				// Market lambda lower when the rate of change in stock is decreasing
 				// Acts as a damping mechanism to reduce price fluctuation
-				double lambda = Math.atan2(Math.abs(stockChange), Math.abs(prevStockChange)) / (0.5 * Math.PI) * ModelConfig.MARKET_LAMBDA;
+
+				double lambda = Math.atan2(Math.abs(stockChange), Math.abs(prevStockChange)) / (0.5 * Math.PI) * marketLambda;
 
 				// Prices decrease more slowly than they increase (20% slower according to FAO food price index)
 				if (stockChange > 0)
@@ -122,21 +126,21 @@ public class GlobalPrice implements Serializable {
 				// If below target stock and stocks not already increasing, nudge prices up to increase stock.
 				// If above target stock and stocks not already decreasing, nudge prices down to decrease stock.
 				if ((updatedStock < targetStock & stockChange < 0 & stockChange < prevStockChange) | (updatedStock > targetStock & stockChange > 0 & stockChange > prevStockChange)) {
-					adjustment *= 1 - 0.5 * ModelConfig.MARKET_LAMBDA * (updatedStock - targetStock) / production;
+					adjustment *= 1 - 0.5 * marketLambda * (updatedStock - targetStock) / production;
 				}
 			}
 
 			else if (ModelConfig.PRICE_UPDATE_METHOD.equals("MarketImbalance")) {
 				double ratio = stockChange/(production-stockChange);
-				adjustment =  Math.exp(-ratio * ModelConfig.MARKET_LAMBDA);
+				adjustment =  Math.exp(-ratio * marketLambda);
 			}
 			else if (ModelConfig.PRICE_UPDATE_METHOD.equals("StockChange")) {
 				if (stockChange == 0 && production == 0)
 					adjustment=1;
 				else if (stockChange >= 0) // stock increasing, so decrease price.  stockChange is positive so adjustment < 1
-					adjustment = 1 - ModelConfig.MARKET_LAMBDA * stockChange/production;
+					adjustment = 1 - marketLambda * stockChange/production;
 				else // stock decreasing, so increase price.  stockChange is negative so adjustment > 1
-					adjustment = 1 - ModelConfig.MARKET_LAMBDA * stockChange/Math.max(0, stockLevel);
+					adjustment = 1 - marketLambda * stockChange/Math.max(0, stockLevel);
 			}
 			else {
 				LogWriter.printlnError("Price adjustment method not set!");
diff --git a/src/ac/ed/lurg/country/TradeConstraint.java b/src/ac/ed/lurg/country/TradeConstraint.java
index ffa912c0d8982e264962cf6dd20f0bb01ad3a678..3418525c9771788a24bc0fd51f522fed39c09e40 100644
--- a/src/ac/ed/lurg/country/TradeConstraint.java
+++ b/src/ac/ed/lurg/country/TradeConstraint.java
@@ -6,7 +6,6 @@ import ac.ed.lurg.utils.LogWriter;
 public class TradeConstraint {
 	private double minValue;
 	private double maxValue;
-	private double tradeAdjustmentCost = ModelConfig.TRADE_ADJUSTMENT_COST_RATE;
 
 	public TradeConstraint(double min, double max) {
 		minValue = min;
@@ -49,14 +48,6 @@ public class TradeConstraint {
 		return maxValue;
 	}
 
-	public void setTradeAdjustmentCost(double cost) {
-		tradeAdjustmentCost = cost;
-	}
-
-	public double getTradeAdjustmentCost() {
-		return tradeAdjustmentCost;
-	}
-
 	@Override
 	public String toString() {
 		return "TradeConstraint [minValue=" + minValue + ", maxValue=" + maxValue + "]";
diff --git a/src/ac/ed/lurg/country/gams/GamsCountryInput.java b/src/ac/ed/lurg/country/gams/GamsCountryInput.java
index 9dcc791bd0962c7e7a964a684cd50b77b49e2d85..428df985bb32a94543d9736a9030b39b888a28a3 100644
--- a/src/ac/ed/lurg/country/gams/GamsCountryInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsCountryInput.java
@@ -74,12 +74,6 @@ public class GamsCountryInput {
 		return previousCropUsageData;
 	}
 
-	public double getMeatEfficiency() {
-		
-		
-		return ModelConfig.MEAT_EFFICIENCY;  // this is already handled by the feed conversion efficiency for each animal product
-	}
-
 	public Map<CropType, Double> getMinTrade() {
 		Map<CropType, Double> netImport = new HashMap<CropType, Double>();
 		for (Map.Entry<CropType, TradeConstraint> entry : tradeConstraints.entrySet()) {
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
index 05f69af971860b8fc675044489b141d1b00a1d05..256ba17c5c381f3336fce87ab951f3bef939cae1 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
@@ -209,7 +209,7 @@ public class GamsLocationOptimiser {
 		GAMSParameter irrigConstraintP = inDB.addParameter("irrigConstraint", 1);
 		Map<Integer, ? extends IrrigationItem> irrigationData = inputData.getIrrigationCosts();
 		
-		double irrigCostMultiplier = ModelConfig.updateParameterForShocks(inputData.getTimestep().getYear(),"IRRIG_COST_MULTIPLIER");
+		double irrigCostMultiplier = ModelConfig.getAdjParam("IRRIG_COST_MULTIPLIER");
 		
 		for (Entry<Integer, ? extends IrrigationItem> entry : irrigationData.entrySet()) {
 			Integer locationId = entry.getKey();
@@ -360,27 +360,28 @@ public class GamsLocationOptimiser {
 
 		//below in case running without shocks to use original values in model config 
 		
-		double meatEff = ModelConfig.updateParameterForShocks(inputData.getTimestep().getYear(), "MEAT_EFFICIENCY");
-		double fertCost = ModelConfig.updateParameterForShocks(inputData.getTimestep().getYear(), "FERTILISER_COST_PER_T");
-		double otherIntCost = ModelConfig.updateParameterForShocks(inputData.getTimestep().getYear(), "OTHER_INTENSITY_COST");
+		double meatEff = ModelConfig.getAdjParam("MEAT_EFFICIENCY");
+		double fertCost = ModelConfig.getAdjParam("FERTILISER_COST_PER_T");
+		double otherIntCost = ModelConfig.getAdjParam("OTHER_INTENSITY_COST");
 
 		LogWriter.print("\n", 3);	
-		addScalar(inDB, "meatEfficency", meatEff, 3);		
-		addScalar(inDB, "fertiliserUnitCost", fertCost, 3);
-		addScalar(inDB, "otherICost",otherIntCost, 3);
-		addScalar(inDB, "otherIParam", ModelConfig.OTHER_INTENSITY_PARAM, 3);
-		addScalar(inDB, "unhandledCropRate", ModelConfig.UNHANDLED_CROP_RATE, 3);
+		addScalar(inDB, "meatEfficency", meatEff, 6);
+		addScalar(inDB, "fertiliserUnitCost", fertCost, 6);
+		addScalar(inDB, "otherICost",otherIntCost, 6);
+		addScalar(inDB, "otherIParam", ModelConfig.OTHER_INTENSITY_PARAM, 6);
+		addScalar(inDB, "unhandledCropRate", ModelConfig.UNHANDLED_CROP_RATE, 6);
 		addScalar(inDB, "setAsideRate", ModelConfig.SETASIDE_RATE, 5);
-		addScalar(inDB, "domesticPriceMarkup", ModelConfig.DOMESTIC_PRICE_MARKUP, 3);
-		addScalar(inDB, "maxGrossLccRate", ModelConfig.MAX_GROSS_LCC_RATE, 5);
+		addScalar(inDB, "domesticPriceMarkup", ModelConfig.DOMESTIC_PRICE_MARKUP, 6);
+		addScalar(inDB, "maxGrossLccRate", ModelConfig.getAdjParam("MAX_GROSS_LCC_RATE"), 6);
 		// We don't have fertilizer/irrigation levels for initial timestep so relaxing constraint;
 		addScalar(inDB, "maxFertChange", (ModelConfig.IS_CALIBRATION_RUN
-				&& inputData.getTimestep().isInitialTimestep()) ? 1 : ModelConfig.MAX_FERT_CHANGE, 5);
+				&& inputData.getTimestep().isInitialTimestep()) ? 1 : ModelConfig.MAX_FERT_CHANGE, 6);
 		addScalar(inDB, "maxIrrigChange", (ModelConfig.IS_CALIBRATION_RUN
-				&& inputData.getTimestep().isInitialTimestep()) ? 1 : ModelConfig.MAX_IRRIG_CHANGE, 5);
+				&& inputData.getTimestep().isInitialTimestep()) ? 1 : ModelConfig.MAX_IRRIG_CHANGE, 6);
+
+		double tradeAdjCost = ModelConfig.getAdjParam("TRADE_ADJUSTMENT_COST_RATE");
+		addScalar(inDB, "tradeAdjustmentCostRate", tradeAdjCost, 6);
 
-		addScalar(inDB, "tradeAdjustmentCostRate", ModelConfig.TRADE_ADJUSTMENT_COST_RATE, 5);
-		
 		// Forestry
 		GAMSParameter maxRotaIntensityP = inDB.addParameter("maxRotationIntensity", 1);
 
diff --git a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java
index 871c9be6ae3700a5c6e00f07e99cecd9047faa63..d4a53c79f89395447d0cc676fdfb729423a19041 100644
--- a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java
+++ b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java
@@ -70,7 +70,7 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager {
 		SspData usaSd = sspManager.get(ssp_scenario, year, usa);
 
 		LogWriter.println("Got ssp data for " + c.getCountryName() + " of " + sd, 3);
-		foodDemandMap = getFoodDemandMap(c, year, gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR, sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR, prices, usaSd.getGdpPc(), outputGamsDemand);
+		foodDemandMap = getFoodDemandMap(c, year, gdpPcYear, sd.getPopulation(), prices, usaSd.getGdpPc(), outputGamsDemand);
 
 		return foodDemandMap;
 	}
@@ -101,10 +101,10 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager {
 			return woodDemandMap;
 		}
 		
-		double baseGdpPc = baseSd.getGdpPc() * ModelConfig.SSP_GDP_PC_FACTOR;
-		double gdpPc = sd.getGdpPc() * ModelConfig.SSP_GDP_PC_FACTOR;
-		double basePopulation = baseSd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR;
-		double population = sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR;
+		double baseGdpPc = baseSd.getGdpPc();
+		double gdpPc = sd.getGdpPc();
+		double basePopulation = baseSd.getPopulation();
+		double population = sd.getPopulation();
 		
 		woodDemandMap = getWoodDemandMap(country, gdpPc, baseGdpPc, population, basePopulation);
 		return woodDemandMap;
diff --git a/src/ac/ed/lurg/demand/BioenergyDemandManager.java b/src/ac/ed/lurg/demand/BioenergyDemandManager.java
index 3a99cb5a317463b300317da7a1c1dfafcd18743d..df4bd2d5231e53860a85f244b9e4b095eb8e0706 100644
--- a/src/ac/ed/lurg/demand/BioenergyDemandManager.java
+++ b/src/ac/ed/lurg/demand/BioenergyDemandManager.java
@@ -175,7 +175,7 @@ public class BioenergyDemandManager {
 				int yearsOfChange = Math.min(ModelConfig.BIOENERGY_CHANGE_END_YEAR - ModelConfig.BIOENERGY_CHANGE_START_YEAR, year - ModelConfig.BIOENERGY_CHANGE_START_YEAR);
 				bioenergyDemandAdj = yearsOfChange > 0 ?  (1.0 +  yearsOfChange * ModelConfig.BIOENERGY_CHANGE_ANNUAL_RATE) : 1.0 ;
 			}
-			return d == null ? 0 : d.doubleValue() * bioenergyDemandAdj * ModelConfig.BIOENERGY_DEMAND_SHIFT;
+			return d == null ? 0 : d.doubleValue() * bioenergyDemandAdj * ModelConfig.getAdjParam("BIOENERGY_DEMAND_SHIFT");
 		}
 		return 0.0;
 	}
@@ -183,7 +183,7 @@ public class BioenergyDemandManager {
 	public double getSecondGenBioenergyDemand(SingleCountry country, int year) {	
 		
 		if (ModelConfig.ENABLE_GEN2_BIOENERGY && secondGenMass.containsKey(country))
-			return interpolateDemand(secondGenMass.get(country), year, 10) * ModelConfig.BIOENERGY_DEMAND_SHIFT;
+			return interpolateDemand(secondGenMass.get(country), year, 10) * ModelConfig.getAdjParam("BIOENERGY_DEMAND_SHIFT");
 		else
 			return 0.0;
 	}
diff --git a/src/ac/ed/lurg/demand/DemandManagerFromFile.java b/src/ac/ed/lurg/demand/DemandManagerFromFile.java
index 4a97829dba7372de18acc842d38ea2d36d579a99..6b04309b44f27e8830ebe12171fe693fc2f9f44c 100644
--- a/src/ac/ed/lurg/demand/DemandManagerFromFile.java
+++ b/src/ac/ed/lurg/demand/DemandManagerFromFile.java
@@ -41,7 +41,7 @@ public class DemandManagerFromFile extends AbstractDemandManager {
 				String cpcS = row.get("cpc");
 				Double pop = Double.valueOf(popS);
 				Double cpc = Double.valueOf(cpcS);
-				double d = cpc * pop * ModelConfig.SSP_POPULATION_FACTOR;
+				double d = cpc * pop;
 				foodDemandMap.put(commodity, d);
 			}
 			catch (Exception e) {
diff --git a/src/ac/ed/lurg/demand/SspData.java b/src/ac/ed/lurg/demand/SspData.java
index e400f16fa8872b2005e96029d16a319ec09234ac..fee8d46290531acc36dfcce2af1684dce8183cc6 100644
--- a/src/ac/ed/lurg/demand/SspData.java
+++ b/src/ac/ed/lurg/demand/SspData.java
@@ -1,6 +1,8 @@
 package ac.ed.lurg.demand;
 
 
+import ac.ed.lurg.ModelConfig;
+
 public class SspData {
 	
 	private double population;
diff --git a/src/ac/ed/lurg/demand/SspManager.java b/src/ac/ed/lurg/demand/SspManager.java
index b766b468ee84cbe21d19141d317759b60fad0eca..21b8d7cec98da4aaf508882e2e0769d8dd81191d 100644
--- a/src/ac/ed/lurg/demand/SspManager.java
+++ b/src/ac/ed/lurg/demand/SspManager.java
@@ -91,8 +91,12 @@ public class SspManager {
 			
 			double pop = interpolate(upYearData.getPopulation(), downYearData.getPopulation(), factor);
 			double gdp = interpolate(upYearData.getGdp(), downYearData.getGdp(), factor);
+
+			// Adjust population and GDP for Monte Carlo
+			double popFactor = ModelConfig.getAdjParam("SSP_POPULATION_FACTOR");
+			double gdpFactor = ModelConfig.getAdjParam("SSP_GDP_PC_FACTOR");
 			
-			return new SspData(pop, gdp);
+			return new SspData(pop * popFactor, gdp * gdpFactor);
 		}
 		else {
 			LogWriter.println("Warning: Can't find straddling year for " + year + ", " + scenario + ", " + country.getCountryName(), 3);
diff --git a/src/ac/ed/lurg/landuse/ConversionCostReader.java b/src/ac/ed/lurg/landuse/ConversionCostReader.java
index 8315101b1347c93e5e2004174d318d7e35f0a379..f14cd0b252e41aefb30eca7b74656b607598ffd8 100644
--- a/src/ac/ed/lurg/landuse/ConversionCostReader.java
+++ b/src/ac/ed/lurg/landuse/ConversionCostReader.java
@@ -3,7 +3,6 @@ package ac.ed.lurg.landuse;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
-import java.sql.Time;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -62,7 +61,8 @@ public class ConversionCostReader {
 		LogWriter.println("Processed " + filename, 2);
 	}
 	
-	public void calcFromConfig() {	
+	public void calcFromConfig() {
+		double costAdjFactor = ModelConfig.getAdjParam("LAND_CONVERSION_COST_FACTOR");
 		for (LandCoverType fromLc : LandCoverType.getConvertibleTypes()) {
 			for (LandCoverType toLc : LandCoverType.getConvertibleTypes()) {
 				if (fromLc.equals(toLc)) { // skip
@@ -71,29 +71,30 @@ public class ConversionCostReader {
 				LccKey key = new LccKey(fromLc, toLc);
 				switch(fromLc) {
 				case CROPLAND:
-					conversionCosts.put(key, ModelConfig.CROPLAND_CONVERSION_COST);
+					conversionCosts.put(key, ModelConfig.getAdjParam("CROPLAND_CONVERSION_COST") * costAdjFactor);
 					break;
 				case PASTURE:
-					conversionCosts.put(key, ModelConfig.PASTURE_CONVERSION_COST);
+					conversionCosts.put(key, ModelConfig.getAdjParam("PASTURE_CONVERSION_COST") * costAdjFactor);
 					break;
 				case TIMBER_FOREST:
-					conversionCosts.put(key, ModelConfig.FOREST_CONVERSION_COST);
+					conversionCosts.put(key, ModelConfig.getAdjParam("FOREST_CONVERSION_COST") * costAdjFactor);
 					break;
 				case CARBON_FOREST:
-					conversionCosts.put(key, ModelConfig.FOREST_CONVERSION_COST);
+					conversionCosts.put(key, ModelConfig.getAdjParam("FOREST_CONVERSION_COST") * costAdjFactor);
 					break;
 				case NATURAL:
-					conversionCosts.put(key, ModelConfig.NATURAL_CONVERSION_COST);
+					conversionCosts.put(key, ModelConfig.getAdjParam("NATURAL_CONVERSION_COST") * costAdjFactor);
 					break;
 				default:
-					conversionCosts.put(key, 0.2 * ModelConfig.LAND_CONVERSION_COST_FACTOR);
+					conversionCosts.put(key, 0.2 * costAdjFactor);
 					break;
 				}
 
+
 				// Agricultural expansion cost factor
 				if (fromLc.isNatural() && !toLc.isNatural()) {
 					double baseCost = conversionCosts.get(key);
-					conversionCosts.put(key, baseCost * ModelConfig.AGRI_LAND_EXPANSION_COST_FACTOR);
+					conversionCosts.put(key, baseCost * ModelConfig.getAdjParam("AGRI_LAND_EXPANSION_COST_FACTOR"));
 				}
 
 				// Allow countries to adjust trade without changing land cover too much
diff --git a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
index 08ba4982e09c7e426269fde45121e44b8b6519b3..7367a805db33895e7bee65eb3b2fe38ac8a09435 100644
--- a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
+++ b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java
@@ -27,17 +27,18 @@ public class IrrigationMaxAmountReader extends AbstractTabularRasterReader<Irrig
 	protected void setData(RasterKey key, IrrigationItem item, Map<String, Double> rowValues) {
 		
 		String highFertIrrigString = YieldType.getYieldType(FertiliserRate.MAX_FERT, IrrigationRate.MAX_IRRIG).getFertIrrigString();
+		double irrigEfficiency = ModelConfig.getAdjParam("IRRIGATION_EFFICIENCY");
 		
-		double c3Cereals = getValueForCol(rowValues, LPJCropTypes.C3_CEREALS + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;		
-		double c4Cereals = getValueForCol(rowValues, LPJCropTypes.C4_CEREALS + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double rice = getValueForCol(rowValues, LPJCropTypes.RICE + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double oilcropsNFix = getValueForCol(rowValues, LPJCropTypes.OILCROPS_NFIX + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double oilcropsOther = getValueForCol(rowValues, LPJCropTypes.OILCROPS_OTHER + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double pulses = getValueForCol(rowValues, LPJCropTypes.PULSES + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double starchy_roots = getValueForCol(rowValues, LPJCropTypes.STARCHY_ROOTS + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
-		double fruitveg = getValueForCol(rowValues, LPJCropTypes.FRUITVEG + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
+		double c3Cereals = getValueForCol(rowValues, LPJCropTypes.C3_CEREALS + highFertIrrigString) / irrigEfficiency;
+		double c4Cereals = getValueForCol(rowValues, LPJCropTypes.C4_CEREALS + highFertIrrigString) / irrigEfficiency;
+		double rice = getValueForCol(rowValues, LPJCropTypes.RICE + highFertIrrigString) / irrigEfficiency;
+		double oilcropsNFix = getValueForCol(rowValues, LPJCropTypes.OILCROPS_NFIX + highFertIrrigString) / irrigEfficiency;
+		double oilcropsOther = getValueForCol(rowValues, LPJCropTypes.OILCROPS_OTHER + highFertIrrigString) / irrigEfficiency;
+		double pulses = getValueForCol(rowValues, LPJCropTypes.PULSES + highFertIrrigString) / irrigEfficiency;
+		double starchy_roots = getValueForCol(rowValues, LPJCropTypes.STARCHY_ROOTS + highFertIrrigString) / irrigEfficiency;
+		double fruitveg = getValueForCol(rowValues, LPJCropTypes.FRUITVEG + highFertIrrigString) / irrigEfficiency;
 		LPJCropTypes sugarCrop = yieldRaster.get(key).getSugarCrop();
-		double sugar = getValueForCol(rowValues, sugarCrop + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY;
+		double sugar = getValueForCol(rowValues, sugarCrop + highFertIrrigString) / irrigEfficiency;
 
 		item.setMaxIrrigAmount(CropType.WHEAT, c3Cereals);
 		item.setMaxIrrigAmount(CropType.MAIZE, c4Cereals);
diff --git a/src/ac/ed/lurg/landuse/IrrigationRasterSet.java b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java
index df2d8b9fac50296c78e8220ae94b03fd1ef00185..621a579ef9ab5e74a404b62fc467b8784e683189 100644
--- a/src/ac/ed/lurg/landuse/IrrigationRasterSet.java
+++ b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java
@@ -79,7 +79,7 @@ public class IrrigationRasterSet extends RasterSet<IrrigationItem> {
 			}
 			
 			Double fpuRunOffAvailable = basinRunOff * ModelConfig.ENVIRONMENTAL_WATER_CONSTRAINT; 
-			otherUses = fpuManager.getOtherWaterUse(basin, otherWaterUseYear) * ModelConfig.OTHER_WATER_USE_FACTOR;
+			otherUses = fpuManager.getOtherWaterUse(basin, otherWaterUseYear) * ModelConfig.getAdjParam("OTHER_WATER_USE_FACTOR");
 			double waterAvailabileMm = (fpuRunOffAvailable - otherUses) / areaOfBasin / 0.01;
 			
 			for (RasterKey rasterKey : irrigData.keySet()) {
diff --git a/src/ac/ed/lurg/landuse/IrrigiationCostReader.java b/src/ac/ed/lurg/landuse/IrrigiationCostReader.java
index 598acaf9dbdef8e485eed4d287a03e31b8b84f1a..4196ad6ff998714d1a88548be366d93a5762df2c 100644
--- a/src/ac/ed/lurg/landuse/IrrigiationCostReader.java
+++ b/src/ac/ed/lurg/landuse/IrrigiationCostReader.java
@@ -14,7 +14,7 @@ public class IrrigiationCostReader extends AbstractRasterReader<IrrigationItem>
 	public void setData(IrrigationItem item, String token) {
 		if (!"nan".equals(token)) {	
 			double irrigCost = Double.parseDouble(token);
-			item.setIrrigCost(irrigCost * ModelConfig.IRRIG_COST_SCALE_FACTOR);
+			item.setIrrigCost(irrigCost * ModelConfig.getAdjParam("IRRIG_COST_SCALE_FACTOR"));
 		}
 	}
 }
diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
index 7791e296c180aa3dcd12ea19f4d38075e0f860c7..6302f6fc189e4494d7ab4bf4b80867163c438fe7 100644
--- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
+++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java
@@ -44,7 +44,7 @@ public class LPJYieldResponseMapReader {
 		int timeStepForTechChange = ModelConfig.IS_CALIBRATION_RUN ? ModelConfig.START_TIMESTEP : timestep.getTimestep();  // we don't want technology to change in calibration, but sometime we run tech change backwards
 		int yearsOfTech = (timeStepForTechChange - ModelConfig.TECHNOLOGY_CHANGE_START_STEP) * ModelConfig.TIMESTEP_SIZE;
 		
-		double techChangeAnnualRate = ModelConfig.updateParameterForShocks(timestep.getYear(), "TECHNOLOGY_CHANGE_ANNUAL_RATE");
+		double techChangeAnnualRate = ModelConfig.getAdjParam("TECHNOLOGY_CHANGE_ANNUAL_RATE");
 		
 		techYieldAdj = 1.0 +  yearsOfTech * techChangeAnnualRate;
 		LogWriter.println("Yield adjustment for technology for " + timestep + " is " + techYieldAdj);
@@ -62,7 +62,8 @@ public class LPJYieldResponseMapReader {
 		
 		AbstractTabularRasterReader<YieldResponsesItem> nppReader = new AbstractTabularRasterReader<YieldResponsesItem>("\\s+", 4, yieldRaster) {
 			protected void setData(RasterKey key, YieldResponsesItem item, Map<String, Double> rowValues) {
-				double adjFactor = 10 * ModelConfig.PASTURE_HARVEST_FRACTION / 0.446;  // 10 for kg/m2 to t/ha, 0.446 carbon units / dry matter, from Osaki, M., Shinano, T., Tadano, T., 1992. Carbon-nitrogen interaction in field crop production. Soil Science and Plant Nutrition 38, 553-564.
+				double pastHarvFract = ModelConfig.getAdjParam("PASTURE_HARVEST_FRACTION");
+				double adjFactor = 10 * pastHarvFract / 0.446;  // 10 for kg/m2 to t/ha, 0.446 carbon units / dry matter, from Osaki, M., Shinano, T., Tadano, T., 1992. Carbon-nitrogen interaction in field crop production. Soil Science and Plant Nutrition 38, 553-564.
 				adjFactor *= ModelConfig.CALIB_FACTOR_PASTURE;
 				for (FertiliserRate fert : FertiliserRate.values()) {
 					double pastureYield;