diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java
index 270d9af129a59e812b81d39ad7630c7308bfb2f9..a0dc812fb8f727c7042d574d75f4acb4b0791a38 100644
--- a/src/ac/ed/lurg/ModelConfig.java
+++ b/src/ac/ed/lurg/ModelConfig.java
@@ -91,6 +91,7 @@ public class ModelConfig {
 	public static final String SSP_FILE = DATA_DIR + File.separator + "ssp.csv";
 	public static final String COUNTRY_DATA_FILE = DATA_DIR + File.separator + "country_data.csv";
 	public static final String REF_YIELD_FILE = DATA_DIR + File.separator + "ref_yields.csv";
+	public static final String BASELINE_CONSUMP_FILE = DATA_DIR + File.separator + "base_consump.csv";
 
 	
 
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index 86e2870b1f15ed500d629dbb109fa8324455e853..3b15f13e6ec015c7379a70cfc240b3ab768c5415 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -10,9 +10,6 @@ import ac.ed.lurg.country.gams.GamsLandUseOptimiser;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.utils.LogWriter;
 
-/*
- * Contains data for a country (perhaps a entire timeseries?!)
- */
 public class CountryAgent implements GamsInputData {
 	
 	private ModelContext modelContext;
@@ -24,7 +21,7 @@ public class CountryAgent implements GamsInputData {
 	private int currentTimestep;
 	private Map<CropType, Double> currentProjectedDemand;
 	private Map<CropType, Double> currentRefYield;
-	
+		
 	public CountryAgent(ModelContext modelContext, Country country, CropAreas initialCropAreas, LandCoverAreas initialLandCover) {
 		this.modelContext = modelContext;
 		this.country = country;
@@ -128,7 +125,7 @@ public class CountryAgent implements GamsInputData {
 
 	@Override
 	public double getMaxIntensity() {
-		return 8.0;
+		return 9.0;
 	}
 
 	@Override
@@ -145,4 +142,4 @@ public class CountryAgent implements GamsInputData {
 	public double getMinFeedRate() {
 		return 0.15;
 	}
-}
+}
\ No newline at end of file
diff --git a/src/ac/ed/lurg/country/LandUseData.java b/src/ac/ed/lurg/country/LandUseData.java
index 5fdcd1c86b4ab36f82864018921fae98bf7d924d..4e4e10858da48f00f77db54d3a9c8c39b0664a47 100644
--- a/src/ac/ed/lurg/country/LandUseData.java
+++ b/src/ac/ed/lurg/country/LandUseData.java
@@ -1,7 +1,5 @@
 package ac.ed.lurg.country;
 
-import ac.ed.lurg.types.CropType;
-
 public class LandUseData {
 
 	private double area;
diff --git a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
index 3094fdda814d62331656fd3df5647301da759999..17d551c9d04784b675b4abba99f82b834d35b11c 100644
--- a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
@@ -1,12 +1,10 @@
 package ac.ed.lurg.country.gams;
 
 import java.io.File;
-import java.util.Collection;
 import java.util.Map;
 
 import ac.ed.lurg.ModelConfig;
 import ac.ed.lurg.country.CropAreas;
-import ac.ed.lurg.country.LandUseData;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.utils.LogWriter;
 
@@ -111,7 +109,7 @@ public class GamsLandUseOptimiser {
 
 	private void addItemMapParm(GAMSParameter parm, Map<CropType, Double> itemMap) {
 		for (Map.Entry<CropType, Double> entry : itemMap.entrySet()) {
-			LogWriter.println("      " + entry.getKey().getGamsName() + ",\t\t" + entry.getValue());
+			LogWriter.println(String.format("     %15s,\t %.1f", entry.getKey().getGamsName(), entry.getValue()));
 			parm.addRecord(entry.getKey().getGamsName()).setValue(entry.getValue());
 		}
 	}
diff --git a/src/ac/ed/lurg/demand/BaseConsumpManager.java b/src/ac/ed/lurg/demand/BaseConsumpManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..91b8aa82173f70650c59482b80595e0001c5a099
--- /dev/null
+++ b/src/ac/ed/lurg/demand/BaseConsumpManager.java
@@ -0,0 +1,58 @@
+package ac.ed.lurg.demand;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import ac.ed.lurg.ModelConfig;
+import ac.ed.lurg.country.Country;
+import ac.ed.lurg.types.CountryCropKey;
+import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.utils.LogWriter;
+
+public class BaseConsumpManager {
+	private static final int COUNTRY_COL = 0; 
+	private static final int CROP_COL = 3; 
+	private static final int BASE_CPC_COL = 8; 
+	
+	private Map<CountryCropKey, Double> baseConsumpMap = new HashMap<CountryCropKey, Double>();
+
+	public BaseConsumpManager() {
+		super();
+		read();
+	}
+	
+	public void read() {
+		String filename = ModelConfig.BASELINE_CONSUMP_FILE;
+		try {
+			BufferedReader fitReader = new BufferedReader(new FileReader(filename)); 
+			String line, countryName, cropName;
+			double cpc;
+			fitReader.readLine(); // read header
+
+			while ((line=fitReader.readLine()) != null) {
+				String[] tokens = line.split(",");
+				
+				if (tokens.length < 9)
+					LogWriter.printlnError("Too few columns in " + filename + ", " + line);
+				
+				countryName = tokens[COUNTRY_COL];
+				cropName = tokens[CROP_COL];
+				cpc = Double.parseDouble(tokens[BASE_CPC_COL]);
+
+				baseConsumpMap.put(new CountryCropKey(Country.get(countryName), CropType.getForFaoName(cropName)), cpc);
+			} 
+			fitReader.close(); 
+		
+		} catch (Exception e) {
+			LogWriter.printlnError("Failed in reading commodity demand fits");
+			e.printStackTrace();
+		}
+		LogWriter.println("Processed " + filename + ", create " + baseConsumpMap.size() + " base consumption values");
+	}
+	
+	public double get(Country country, CropType crop) {
+		return baseConsumpMap.get(new CountryCropKey(country, crop));
+	}
+}
diff --git a/src/ac/ed/lurg/demand/DemandCurve.java b/src/ac/ed/lurg/demand/DemandCurve.java
index fe7ebd7adf2349318e715c194a4315e12d51ff87..0af0d37adf4609f9afd41518a6a5094c3482fba3 100644
--- a/src/ac/ed/lurg/demand/DemandCurve.java
+++ b/src/ac/ed/lurg/demand/DemandCurve.java
@@ -10,11 +10,11 @@ public class DemandCurve {
 	private double b;
 	private double c;
 	private ModelFitType fitType;
-	private CropType item;
+	private CropType cropType;
 
 	DemandCurve(CropType item, double a, double b, double c, ModelFitType fitType) {
 		super();
-		this.item = item;
+		this.cropType = item;
 		this.a = a;
 		this.b = b;
 		this.c = c;
@@ -37,8 +37,8 @@ public class DemandCurve {
 		return fitType;
 	}
 
-	public CropType getItem() {
-		return item;
+	public CropType getCropType() {
+		return cropType;
 	}
 
 	@Override
@@ -46,7 +46,7 @@ public class DemandCurve {
 		final int prime = 31;
 		int result = 1;
 		result = prime * result + ((fitType == null) ? 0 : fitType.hashCode());
-		result = prime * result + ((item == null) ? 0 : item.hashCode());
+		result = prime * result + ((cropType == null) ? 0 : cropType.hashCode());
 		return result;
 	}
 
@@ -64,15 +64,27 @@ public class DemandCurve {
 				return false;
 		} else if (!fitType.equals(other.fitType))
 			return false;
-		if (item == null) {
-			if (other.item != null)
+		if (cropType == null) {
+			if (other.cropType != null)
 				return false;
-		} else if (!item.equals(other.item))
+		} else if (!cropType.equals(other.cropType))
 			return false;
 		return true;
 	}
-
-	public double getConsumptionPc(double gdpPc) {
+	
+	private final static double Z = Math.log(0.1)/8;
+			
+	public double getConsumptionPc(double baseGdpPc, double baseCpc, double gdpPc) {
+		double baseExpCpc = getProjectConsumptionPc(baseGdpPc);
+		double newExpCpc = getProjectConsumptionPc(gdpPc);
+		double gapRatio = Math.exp((gdpPc-baseGdpPc)/baseGdpPc * Z);
+		if (gapRatio>1) gapRatio = 1;
+		
+		double projectedCpc = (newExpCpc+(baseCpc-baseExpCpc)*gapRatio);
+		return projectedCpc;
+	}
+	
+	private double getProjectConsumptionPc(double gdpPc) {
 		if (fitType == ModelFitType.LOGISTIC)
 			return a/(1+Math.exp((b-gdpPc)/c));
 		
diff --git a/src/ac/ed/lurg/demand/DemandManager.java b/src/ac/ed/lurg/demand/DemandManager.java
index b4b264c011856748920dca053d20f1105a17a032..8327196a366bafa841b20a0085aae4ba0b11a0c2 100644
--- a/src/ac/ed/lurg/demand/DemandManager.java
+++ b/src/ac/ed/lurg/demand/DemandManager.java
@@ -3,6 +3,7 @@ package ac.ed.lurg.demand;
 import java.util.HashMap;
 import java.util.Map;
 
+import ac.ed.lurg.ModelConfig;
 import ac.ed.lurg.country.Country;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.ModelFitType;
@@ -12,6 +13,7 @@ public class DemandManager {
 
 	private DemandCurveManager demandCurveManager;
 	private SspManager sspManager;
+	private BaseConsumpManager baseConsumpManager;
 	
 	private ModelFitType fitType;  // these could be mutable
 	private String ssp_scenario;
@@ -21,9 +23,12 @@ public class DemandManager {
 		this.ssp_scenario = ssp_scenario;
 		demandCurveManager = new DemandCurveManager();
 		sspManager = new SspManager();
+		baseConsumpManager = new BaseConsumpManager();
 	}
 	
 	public Map<CropType, Double> getDemand(Country country, int year) {
+		SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, country);
+		
 		Map<CropType, Double> demandMap = new HashMap<CropType, Double>();
 		SspData sd = sspManager.get(ssp_scenario, year, country);
 		
@@ -35,9 +40,9 @@ public class DemandManager {
 		}
 		
 		for (DemandCurve dc : demandCurveManager.get(fitType)) {
-			double cpc = dc.getConsumptionPc(sd.getGdpPc());
+			double cpc = dc.getConsumptionPc(baseSspData.getGdpPc(), baseConsumpManager.get(country, dc.getCropType()), sd.getGdpPc());
 			double d = cpc * sd.getPopulation();
-			demandMap.put(dc.getItem(), d);
+			demandMap.put(dc.getCropType(), d);
 		}
 		return demandMap;
 	}
diff --git a/src/ac/ed/lurg/types/CountryCropKey.java b/src/ac/ed/lurg/types/CountryCropKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecb72a39f952c55e31c0aa9da7d17a94d815f4a0
--- /dev/null
+++ b/src/ac/ed/lurg/types/CountryCropKey.java
@@ -0,0 +1,46 @@
+package ac.ed.lurg.types;
+
+import ac.ed.lurg.country.Country;
+
+public class CountryCropKey {
+	private Country country;
+	private CropType crop;
+	
+	public CountryCropKey(Country country, CropType crop) {
+		super();
+		this.country = country;
+		this.crop = crop;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((country == null) ? 0 : country.hashCode());
+		result = prime * result + ((crop == null) ? 0 : crop.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		CountryCropKey other = (CountryCropKey) obj;
+		if (country == null) {
+			if (other.country != null)
+				return false;
+		} else if (!country.equals(other.country))
+			return false;
+		if (crop == null) {
+			if (other.crop != null)
+				return false;
+		} else if (!crop.equals(other.crop))
+			return false;
+		return true;
+	}
+	
+}
diff --git a/src/ac/ed/lurg/types/CropType.java b/src/ac/ed/lurg/types/CropType.java
index c2406deed50c411ae747a5050282320186e7d4df..ce1630b6f857b1249f9c58503aae2c939f141b93 100644
--- a/src/ac/ed/lurg/types/CropType.java
+++ b/src/ac/ed/lurg/types/CropType.java
@@ -6,18 +6,16 @@ import java.util.Map;
 
 import ac.ed.lurg.utils.LogWriter;
 
-public class CropType {
-	private static final Map<String, CropType> faoNameCache = new HashMap<String, CropType>();
-	private static final Map<String, CropType> gamsNameCache = new HashMap<String, CropType>();
+public enum CropType {
 
-	public final static CropType MEAT_OR_PASTURE = new CropType("meatmilkeggs", "pasture_or_meat");
-	public final static CropType TREENUTS = new CropType("Treenuts + (Total)", "treenuts");
-	public final static CropType VEGETABLES = new CropType("Vegetables + (Total)", "vegetables");
-	public final static CropType PULSES = new CropType("Pulses + (Total)", "pulses");
-	public final static CropType STARCHY_ROOTS = new CropType("Starchy Roots + (Total)", "starchyRoots");
-	public final static CropType FRUIT = new CropType("Fruits - Excluding Wine + (Total)", "fruits");
-	public final static CropType OILCROPS = new CropType("Oilcrops + (Total)", "oilcrops");
-	public final static CropType CEREALS = new CropType("Cereals - Excluding Beer + (Total)", "cereals");
+	MEAT_OR_PASTURE("meatmilkeggs", "pasture_or_meat"),
+	TREENUTS("Treenuts + (Total)", "treenuts"),
+	VEGETABLES("Vegetables + (Total)", "vegetables"),
+	PULSES("Pulses + (Total)", "pulses"),
+	STARCHY_ROOTS("Starchy Roots + (Total)", "starchyRoots"),
+	FRUIT("Fruits - Excluding Wine + (Total)", "fruits"),
+	OILCROPS("Oilcrops + (Total)", "oilcrops"),
+	CEREALS("Cereals - Excluding Beer + (Total)", "cereals");
 
 	private String faoName;
 	private String gamsName;
@@ -25,9 +23,16 @@ public class CropType {
 	CropType (String faoName, String gamsName) {
 		this.faoName = faoName;
 		this.gamsName = gamsName;
-		faoNameCache.put(faoName, this);
-		gamsNameCache.put(gamsName, this);
 	}
+	
+	private static final Map<String, CropType> faoNameCache = new HashMap<String, CropType>();
+	private static final Map<String, CropType> gamsNameCache = new HashMap<String, CropType>();
+    static {
+        for (CropType c : values()) {
+        	faoNameCache.put(c.getFaoName(), c);
+        	gamsNameCache.put(c.getGamsName(), c);
+       }
+    }
 
 	public static CropType getForFaoName(String faoName) {
 		return getFromCache(faoNameCache, faoName);