diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms
index 35bdcdc5070ca0bdad8f065c44b166f9c2a0d972..64029a6a85526750b2fc1e54b0346969b9ae464b 100644
--- a/GAMS/IntExtOpt.gms
+++ b/GAMS/IntExtOpt.gms
@@ -5,6 +5,7 @@
  SET not_feed_crops(crop)  / fruits, starchyRoots, treenuts, vegetables, pulses, pasture_or_meat /;
  SET location / 1*5 /;    
      
+ PARAMETER landArea(location)                areas of land in ha;
  PARAMETER previous_area(crop, location)     areas for previous timestep in ha;
  PARAMETER yieldNone(crop, location)         yield in t per ha;
  PARAMETER yieldFertOnly(crop, location)     yield in t per ha;
@@ -24,7 +25,7 @@
  SCALAR minFeedRate                  minimum rate of feed for producing animal products;
  
 $gdxin %gdxincname%
-$load previous_area, demand, yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, fertParam, irrigParam, world_input_energy, maxNetImport, minNetImport, meatEfficency, maxLandUseChange, tradeBarrier, landChangeEnergy, minFeedRate
+$load landArea, previous_area, demand, yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, fertParam, irrigParam, world_input_energy, maxNetImport, minNetImport, meatEfficency, maxLandUseChange, tradeBarrier, landChangeEnergy, minFeedRate
 $gdxin
   
  SCALAR delta use to smooth power function see 7.5 www.gams.com dd docs solversconopt.pdf / 0.00000000001 /  
@@ -59,6 +60,7 @@ $gdxin
        MEAT_DEMAND_CONSTRAINT                           satisfy demand for crop
        MAX_FERT_INTENSITY_CONSTRAINT(crop, location)    constraint on maximum fertilizer intensity
        MAX_IRRIG_INTENSITY_CONSTRAINT(crop, location)   constraint on maximum irrigation intensity
+       TOTAL_LAND_CHANGE_CONSTRAINT(location)           constraint on the rate of land use change 
        CROPLAND_CHANGE_CONSTRAINT(location)             constraint on the rate of land use change 
        PASTURE_CHANGE_CONSTRAINT(location)              constraint on the rate of land use change 
        AGRI_LAND_INCREASE_CONSTRAINT(location)          constraint expansion of agricultural land
@@ -96,6 +98,8 @@ $gdxin
  
  MAX_IRRIG_INTENSITY_CONSTRAINT(crop, location) .. irrigI(crop, location) =L= 1;
  
+ TOTAL_LAND_CHANGE_CONSTRAINT(location) .. landArea(location) =G= sum(crop, area(crop, location));
+ 
  CROPLAND_CHANGE_CONSTRAINT(location) .. 1 - sum(crop_less_pasture, area(crop_less_pasture, location))/sum(crop_less_pasture, previous_area(crop_less_pasture, location)) =L= maxLandUseChange;
  
  PASTURE_CHANGE_CONSTRAINT(location) ..  1 - area('pasture_or_meat', location)/previous_area('pasture_or_meat', location) =L= maxLandUseChange;
diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index cbde493f792cba63cf707bf84795014fb3f4b292..d13f045004bc2e7d7bb022ffbeb344b3f52c90a3 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -10,7 +10,7 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.ModelFitType;
 import ac.ed.lurg.types.YieldType;
 import ac.ed.lurg.yield.YieldManager;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.yield.YieldResponsesItem;
 import ac.ed.lurg.yield.YieldResponseMapReader;
 import ac.sac.raster.RasterSet;
 
@@ -43,7 +43,7 @@ public class ModelMain {
 	}
 
 	private void doTimestep(int timestep) {
-		RasterSet<YieldResponses> yieldSurfaces = getYieldSurfaces(timestep);
+		RasterSet<YieldResponsesItem> yieldSurfaces = getYieldSurfaces(timestep);
 		
 		for (CountryAgent ca : countryAgents) {
 			ca.determineProduction(timestep);
@@ -52,9 +52,9 @@ public class ModelMain {
 		// examine global trade balance
 	}
 
-	private RasterSet<YieldResponses> getYieldSurfaces(int timestep) {
+	private RasterSet<YieldResponsesItem> getYieldSurfaces(int timestep) {
 		String rootDir = ModelConfig.YIELD_DIR + File.separator + (timestep + ModelConfig.START_TIMESTEP) + File.separator;
-		RasterSet<YieldResponses> yieldSurfaces = null;
+		RasterSet<YieldResponsesItem> yieldSurfaces = null;
 		
 		for (CropType cropType : CropType.values()) {
 			for (YieldType yieldType : YieldType.values()) {
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index 8d05fd3308b7e24d200924b0cbed909c557e100f..c5b97f3935884f6b4653355bec66804d0e335f03 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -9,28 +9,29 @@ import ac.ed.lurg.country.gams.GamsCountryInput;
 import ac.ed.lurg.country.gams.GamsInput;
 import ac.ed.lurg.country.gams.GamsLandUseOptimiser;
 import ac.ed.lurg.country.gams.GamsOutput;
-import ac.ed.lurg.landuse.CropAreas;
+import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.types.LandDataType;
 import ac.ed.lurg.utils.LogWriter;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.yield.YieldResponsesItem;
 
 public class CountryAgent {
 	
 	private ModelContext modelContext;
 	private Country country;
 	
-	private Map<Integer, CropAreas> cropAreasTimeseries = new HashMap<Integer, CropAreas>();
-	private Map<Integer, LandCoverAreas> landUseAreasTimeseries = new HashMap<Integer, LandCoverAreas>();
+	private Map<Integer, AreasItem> cropAreasTimeseries = new HashMap<Integer, AreasItem>();
+//	private Map<Integer, LandCoverAreas> landUseAreasTimeseries = new HashMap<Integer, LandCoverAreas>();
 
 	private int currentTimestep;
 	private Map<CropType, Double> currentProjectedDemand;
 	private Map<CropType, Double> currentRefYield;
 		
-	public CountryAgent(ModelContext modelContext, Country country, CropAreas initialCropAreas, LandCoverAreas initialLandCover) {
+	public CountryAgent(ModelContext modelContext, Country country, AreasItem initialCropAreas) {
 		this.modelContext = modelContext;
 		this.country = country;
 		cropAreasTimeseries.put(0, initialCropAreas);
-		landUseAreasTimeseries.put(0, initialLandCover);
+//		landUseAreasTimeseries.put(0, initialLandCover);
 	}
 	
 	public Country getCountry() {
@@ -38,7 +39,7 @@ public class CountryAgent {
 	}
 
 	public double getCropArea(int timestep, CropType item) {
-		CropAreas cd = cropAreasTimeseries.get(timestep);
+		AreasItem cd = cropAreasTimeseries.get(timestep);
 		if (cd == null) {
 			LogWriter.printlnError("Asked for timestep that we don't have " + timestep);
 			return Double.NaN;
@@ -60,7 +61,7 @@ public class CountryAgent {
 		
 		// optimise areas and intensity 
 		GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport());
-		GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs);
+		GamsInput gamsInput = new GamsInput(getYields(), getPreviousAreas(), countryLevelInputs);
 
 		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);
 		LogWriter.println("Running " + country.getCountryName() + ", year " + year);
@@ -73,7 +74,7 @@ public class CountryAgent {
 		return currentProjectedDemand;
 	}
 
-	public Map<Integer, YieldResponses> getYields() {
+	public Map<Integer, YieldResponsesItem> getYields() {
 	//	Map<Integer, Map<CropType, YieldResponse>> returnMap = new HashMap<Integer, Map<CropType, YieldResponse>>();
 
 	//	for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++)
@@ -82,15 +83,20 @@ public class CountryAgent {
 		return null;  // this should be from LPJ data
 	}
 
-	public Map<Integer, CropAreas> getPreviousCropArea() {		
-		CropAreas previousCropAreas = new CropAreas();
+	public Map<Integer, AreasItem> getPreviousAreas() {		
+		AreasItem previousCropAreas = new AreasItem();
 		int previousTimestep = currentTimestep==0 ? 0 : currentTimestep-1;
-		CropAreas cd = cropAreasTimeseries.get(previousTimestep);
+		AreasItem cd = cropAreasTimeseries.get(previousTimestep);
 		
-		for (CropType crop : CropType.getAllItems())
+		double totalCropArea = 0;
+		for (CropType crop : CropType.getAllItems()) {
 			previousCropAreas.setCropArea(crop, cd.getCropArea(crop));
+			totalCropArea += cd.getCropArea(crop);
+		}
+		
+		previousCropAreas.setLandCoverArea(LandDataType.LAND, totalCropArea*2);
 		
-		Map<Integer, CropAreas> returnMap = new HashMap<Integer, CropAreas>();
+		Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>();
 
 		for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++)
 			returnMap.put(i, previousCropAreas);
diff --git a/src/ac/ed/lurg/country/CountryAgentCreator.java b/src/ac/ed/lurg/country/CountryAgentCreator.java
index 3200c2e110f0a3dc6001235fef907dee836db20c..93a21f376c7ca62258e703927b75c17152cfb28c 100644
--- a/src/ac/ed/lurg/country/CountryAgentCreator.java
+++ b/src/ac/ed/lurg/country/CountryAgentCreator.java
@@ -7,9 +7,9 @@ import java.util.HashSet;
 
 import ac.ed.lurg.ModelConfig;
 import ac.ed.lurg.ModelContext;
-import ac.ed.lurg.landuse.CropAreas;
+import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.types.CropType;
-import ac.ed.lurg.types.LandCoverType;
+import ac.ed.lurg.types.LandDataType;
 import ac.ed.lurg.utils.LogWriter;
 
 public class CountryAgentCreator {
@@ -55,18 +55,18 @@ public class CountryAgentCreator {
 
 		//		double intensity = Math.sqrt(Double.parseDouble(tokens[FERT_N_COL])/arableArea);
 
-				LandCoverAreas initialLandCover = new LandCoverAreas();
-				initialLandCover.setLandCoverArea(LandCoverType.LAND, Double.parseDouble(tokens[LAND_COL])/1000);
-				initialLandCover.setLandCoverArea(LandCoverType.ARABLE, arableArea);
-				initialLandCover.setLandCoverArea(LandCoverType.FOREST, Double.parseDouble(tokens[FOREST_COL])/1000);
-				initialLandCover.setLandCoverArea(LandCoverType.PERM_CROP, Double.parseDouble(tokens[PERM_CROP_COL])/1000);
-				initialLandCover.setLandCoverArea(LandCoverType.PASTURE, pastureArea);
-				
-				CropAreas initialCropData = new CropAreas();
+	/*			LandCoverAreas initialLandCover = new LandCoverAreas();
+				initialLandCover.setLandCoverArea(LandDataType.LAND, Double.parseDouble(tokens[LAND_COL])/1000);
+				initialLandCover.setLandCoverArea(LandDataType.ARABLE, arableArea);
+				initialLandCover.setLandCoverArea(LandDataType.FOREST, Double.parseDouble(tokens[FOREST_COL])/1000);
+				initialLandCover.setLandCoverArea(LandDataType.PERM_CROP, Double.parseDouble(tokens[PERM_CROP_COL])/1000);
+				initialLandCover.setLandCoverArea(LandDataType.PASTURE, pastureArea);
+		*/		
+				AreasItem initialCropData = new AreasItem();
 				initialCropData.setCropArea(CropType.CEREALS, arableArea); // at the moment can substitute freely between arable crops so this is ok-ish
 				initialCropData.setCropArea(CropType.MEAT_OR_PASTURE, pastureArea);
 
-				CountryAgent ca = new CountryAgent(modelContext, Country.get(countryName), initialCropData, initialLandCover);
+				CountryAgent ca = new CountryAgent(modelContext, Country.get(countryName), initialCropData);
 						
 				countryAgents.add(ca);
 			} 
diff --git a/src/ac/ed/lurg/country/LandCoverAreas.java b/src/ac/ed/lurg/country/LandCoverAreas.java
deleted file mode 100644
index 39fb3c6651d6577c1ea88d3860f8e9dd731c2d0d..0000000000000000000000000000000000000000
--- a/src/ac/ed/lurg/country/LandCoverAreas.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package ac.ed.lurg.country;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import ac.ed.lurg.types.LandCoverType;
-
-public class LandCoverAreas {
-	private Map<LandCoverType, Double> landCoverAreas = new HashMap<LandCoverType, Double>();
-
-	public double getLandCoverArea(LandCoverType c) {
-		Double d = landCoverAreas.get(c);
-		return d == null ? Double.NaN : d;
-	}
-	
-	public void setLandCoverArea(LandCoverType c, double d) {
-		landCoverAreas.put(c, d);
-	}
-
-}
diff --git a/src/ac/ed/lurg/country/gams/GamsInput.java b/src/ac/ed/lurg/country/gams/GamsInput.java
index f60adfdef28ea8ab86ac3f7f8d5c1b90c5be6d95..88d305cdc4765eb9e754901b80595dc9d6535e7c 100644
--- a/src/ac/ed/lurg/country/gams/GamsInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsInput.java
@@ -2,27 +2,27 @@ package ac.ed.lurg.country.gams;
 
 import java.util.Map;
 
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.yield.YieldResponsesItem;
 
 public class GamsInput {
 	
-	private Map<Integer, ? extends YieldResponses> yields;
-	private Map<Integer, ? extends CropAreas> previousCropArea;
+	private Map<Integer, ? extends YieldResponsesItem> yields;
+	private Map<Integer, ? extends AreasItem> previousAreas;
 	private GamsCountryInput countryInput;
 		
-	public GamsInput(Map<Integer, ? extends YieldResponses> yields, Map<Integer, ? extends CropAreas> previousCropArea, GamsCountryInput countryInput) {
+	public GamsInput(Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends AreasItem> previousAreas, GamsCountryInput countryInput) {
 		super();
 		this.yields = yields;
-		this.previousCropArea = previousCropArea;
+		this.previousAreas = previousAreas;
 		this.countryInput = countryInput;
 	}
 	
-	public Map<Integer, ? extends YieldResponses> getYields() {
+	public Map<Integer, ? extends YieldResponsesItem> getYields() {
 		return yields;
 	}
-	public Map<Integer, ? extends CropAreas> getPreviousCropArea() {
-		return previousCropArea;
+	public Map<Integer, ? extends AreasItem> getPreviousAreas() {
+		return previousAreas;
 	}
 	
 	public GamsCountryInput getCountryInput() {
diff --git a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
index c30f97434e576a97697c940b960e896561be1e08..a1759eba155e4d79ed62c2175e0220b644d42661 100644
--- a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java
@@ -7,12 +7,13 @@ import java.util.Map.Entry;
 import java.util.Vector;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.landuse.Intensities;
+import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.IntensitiesItem;
 import ac.ed.lurg.landuse.Intensity;
 import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.types.LandDataType;
 import ac.ed.lurg.utils.LogWriter;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.yield.YieldResponsesItem;
 
 import com.gams.api.GAMSDatabase;
 import com.gams.api.GAMSGlobals;
@@ -58,12 +59,12 @@ public class GamsLandUseOptimiser {
 	}
 
 	private void setupInDB(GAMSDatabase inDB) {
+		
 		LogWriter.println("\nPrevious areas");
-		GAMSParameter param = inDB.addParameter("previous_area", 2, "the previous area for each land use");
-		addLocationMapParm(param, inputData.getPreviousCropArea());
+		addAreaParms(inDB, inputData.getPreviousAreas());
 
 		LogWriter.println("\nDemand");
-		param = inDB.addParameter("demand", 1, "demand for crop");
+		GAMSParameter param = inDB.addParameter("demand", 1);
 		addItemMapParm(param, inputData.getCountryInput().getProjectedDemand());
 
 		LogWriter.println("\nYieldNone");
@@ -74,16 +75,17 @@ public class GamsLandUseOptimiser {
 		GAMSParameter fert_p = inDB.addParameter("fertParam", 2);
 		GAMSParameter irrig_p = inDB.addParameter("irrigParam", 2);
 
-		for (Entry<Integer, ? extends YieldResponses> cropsForALocation : inputData.getYields().entrySet()) {
+		for (Entry<Integer, ? extends YieldResponsesItem> cropsForALocation : inputData.getYields().entrySet()) {
 			Integer locationId = cropsForALocation.getKey();
-			YieldResponses yresp = cropsForALocation.getValue();
+			String locString = Integer.toString(locationId);
+			YieldResponsesItem yresp = cropsForALocation.getValue();
 
 			for (CropType crop : CropType.values()) {
 				LogWriter.println(String.format("     %15s,\t %.1f", crop.getGamsName(), yresp.getYieldNone(crop)));
 				
 				Vector<String> v = new Vector<String>();
 				v.add(crop.getGamsName());
-				v.add(Integer.toString(locationId));
+				v.add(locString);
 
 				yNoneP.addRecord(v).setValue(yresp.getYieldNone(crop));
 				y_fert.addRecord(v).setValue(yresp.getYieldFertOnly(crop));
@@ -129,8 +131,8 @@ public class GamsLandUseOptimiser {
 		double totalArea = 0;
 		double area, fertIntensity, irrigIntensity, otherIntensity, feedAmount, netImport;
 
-		Map<Integer, Intensities> intensities = new HashMap<Integer, Intensities>();
-		Map<Integer, CropAreas> cropAreas = new HashMap<Integer, CropAreas>();
+		Map<Integer, IntensitiesItem> intensities = new HashMap<Integer, IntensitiesItem>();
+		Map<Integer, AreasItem> cropAreas = new HashMap<Integer, AreasItem>();
 		Map<CropType, Double> feedAmounts = new HashMap<CropType, Double>();
 		Map<CropType, Double> netImports = new HashMap<CropType, Double>();
 
@@ -156,16 +158,16 @@ public class GamsLandUseOptimiser {
 				LogWriter.println(String.format("\t location %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", 
 						locationName, area, fertIntensity, irrigIntensity, otherIntensity)); 
 
-				Intensities intensityItem = intensities.get(locId);
+				IntensitiesItem intensityItem = intensities.get(locId);
 				if (intensityItem == null) {
-					intensityItem = new Intensities();
+					intensityItem = new IntensitiesItem();
 					intensities.put(locId, intensityItem);
 				}
 				intensityItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity));
 
-				CropAreas areaItem = cropAreas.get(locId);
+				AreasItem areaItem = cropAreas.get(locId);
 				if (areaItem == null) {
-					areaItem = new CropAreas();
+					areaItem = new AreasItem();
 					cropAreas.put(locId, areaItem);
 				}
 				areaItem.setCropArea(cropType, area);
@@ -192,19 +194,27 @@ public class GamsLandUseOptimiser {
 		}
 	}
 
-	private void addLocationMapParm(GAMSParameter parm, Map<Integer, ? extends CropAreas> locationItemMap) {
-		for (Map.Entry<Integer, ? extends CropAreas> cropsForALocation : locationItemMap.entrySet()) {
+	private void addAreaParms(GAMSDatabase inDB, Map<Integer, ? extends AreasItem> locationItemMap) {
+		
+		GAMSParameter prevCropP = inDB.addParameter("previous_area", 2);
+		GAMSParameter landP = inDB.addParameter("landArea", 1);
+
+		for (Map.Entry<Integer, ? extends AreasItem> cropsForALocation : locationItemMap.entrySet()) {
 			Integer locationId = cropsForALocation.getKey();
-			CropAreas itemMap = cropsForALocation.getValue();
+			String locString = Integer.toString(locationId);
+			AreasItem areasItem = cropsForALocation.getValue();
 
 			for (CropType cropType : CropType.values()) {
-				double d = itemMap.getCropArea(cropType);
+				double d = areasItem.getCropArea(cropType);
 				LogWriter.println(String.format("     %15s,\t %.1f", cropType.getGamsName(), d));
 				Vector<String> v = new Vector<String>();
 				v.add(cropType.getGamsName());
-				v.add(Integer.toString(locationId));
-				parm.addRecord(v).setValue(d);
+				v.add(locString);
+				prevCropP.addRecord(v).setValue(d);
 			}
+			
+			landP.addRecord(locString).setValue(areasItem.getLandCoverArea(LandDataType.LAND));
+
 		}
 	}
 
diff --git a/src/ac/ed/lurg/country/gams/GamsOutput.java b/src/ac/ed/lurg/country/gams/GamsOutput.java
index b5956d83307602113b20fb4671f61da34f7762f5..199b2ab8c21f5e6888a6a926d108cfa803215056 100644
--- a/src/ac/ed/lurg/country/gams/GamsOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsOutput.java
@@ -2,21 +2,21 @@ package ac.ed.lurg.country.gams;
 
 import java.util.Map;
 
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.landuse.Intensities;
+import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.IntensitiesItem;
 import ac.ed.lurg.types.CropType;
 
 public class GamsOutput {
 	int status;
 	
-	Map<Integer, Intensities> intensities;  // data mapped from id (not raster)
-	Map<Integer, CropAreas> cropAreas;
+	Map<Integer, IntensitiesItem> intensities;  // data mapped from id (not raster)
+	Map<Integer, AreasItem> cropAreas;
 	Map<CropType, Double> feedAmounts;
 	Map<CropType, Double> netImports;
 	
 	public GamsOutput(int status, 
-			Map<Integer, Intensities> intensities, 
-			Map<Integer, CropAreas> cropAreas, 
+			Map<Integer, IntensitiesItem> intensities, 
+			Map<Integer, AreasItem> cropAreas, 
 			Map<CropType, Double> feedAmounts,
 			Map<CropType, Double> netImports) {
 		super();
@@ -30,10 +30,10 @@ public class GamsOutput {
 	public int getStatus() {
 		return status;
 	}
-	public Map<Integer, Intensities> getIntensities() {
+	public Map<Integer, IntensitiesItem> getIntensities() {
 		return intensities;
 	}
-	public Map<Integer, CropAreas> getCropAreas() {
+	public Map<Integer, AreasItem> getCropAreas() {
 		return cropAreas;
 	}
 	public Map<CropType, Double> getFeedAmounts() {
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
index 2e0d3891afc17903b91fe007111900574f4811c6..e912d57741dd22c505e20614864acd3940af9cec 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
@@ -1,21 +1,20 @@
 package ac.ed.lurg.country.gams;
 
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.landuse.Intensities;
+import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.yield.YieldRaster;
 import ac.sac.raster.RasterSet;
 
 public class GamsRasterInput {
 	
 	private YieldRaster yields;
-	private RasterSet<CropAreas> previousCropAreas;
+	private RasterSet<AreasItem> previousAreas;
 	private GamsCountryInput countryInput;
 	
 	public GamsRasterInput(YieldRaster yields,
-			RasterSet<CropAreas> previousCropAreas, GamsCountryInput countryInput) {
+			RasterSet<AreasItem> previousAreas, GamsCountryInput countryInput) {
 		super();
 		this.yields = yields;
-		this.previousCropAreas = previousCropAreas;
+		this.previousAreas = previousAreas;
 		this.countryInput = countryInput;
 	}
 
@@ -23,8 +22,8 @@ public class GamsRasterInput {
 		return yields;
 	}
 
-	public RasterSet<CropAreas> getPreviousCropAreas() {
-		return previousCropAreas;
+	public RasterSet<AreasItem> getPreviousAreas() {
+		return previousAreas;
 	}
 
 	public GamsCountryInput getCountryInput() {
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index 7d8d42214df15c9a9bf7d52afbd6c4490bad37de..34730bfad7232b72cc02468ff0e8437e2cc5e0d4 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -9,14 +9,14 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.landuse.Intensities;
+import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.IntensitiesItem;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.YieldType;
 import ac.ed.lurg.utils.LogWriter;
-import ac.ed.lurg.yield.AveragingYieldResponses;
+import ac.ed.lurg.yield.AveragingYieldResponsesItem;
 import ac.ed.lurg.yield.YieldRaster;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.yield.YieldResponsesItem;
 import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
 
@@ -43,15 +43,15 @@ public class GamsRasterOptimiser {
 	
 	private GamsRasterOutput convertToRaster(GamsInput gamsInput, GamsOutput gamsOutput) {		
 		// intensities - constant over single category?
-		RasterSet<Intensities> intensityRaster = new RasterSet<Intensities>();
+		RasterSet<IntensitiesItem> intensityRaster = new RasterSet<IntensitiesItem>();
 		
-		for (Map.Entry<Integer, Intensities> entry : gamsOutput.getIntensities().entrySet()) {
+		for (Map.Entry<Integer, IntensitiesItem> entry : gamsOutput.getIntensities().entrySet()) {
 			for (RasterKey key : mapping.get(entry.getKey())) {
 				intensityRaster.put(key, entry.getValue());
 			}
 		}
 		
-		RasterSet<CropAreas> areaRaster = new RasterSet<CropAreas>();
+		RasterSet<AreasItem> areaRaster = new RasterSet<AreasItem>();
 
 		// crop areas - need some allocation process
 		 
@@ -62,7 +62,7 @@ public class GamsRasterOptimiser {
 	private GamsInput convertFromRaster(GamsRasterInput rasterInputData) {
 		// as a first attempt only going to look at pasture and cereal yields, assuming other yields will be correlated to one or the other.
 		YieldRaster yieldRaster = rasterInputData.getYields();
-		RasterSet<CropAreas> cropAreaRaster = rasterInputData.getPreviousCropAreas();
+		RasterSet<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas();
 		
 		List<Double> cerealDivisions = getDivisions(yieldRaster, CropType.CEREALS, 2);
 		List<Double> pastureDivisions = getDivisions(yieldRaster, CropType.MEAT_OR_PASTURE, 2);
@@ -70,20 +70,20 @@ public class GamsRasterOptimiser {
 		int numCerealCats = (1+cerealDivisions.size());
 		LogWriter.println("Making " + numCerealCats * (1+pastureDivisions.size()) + " categories");
 		
-		Map<Integer, AveragingYieldResponses> aggregatedYield = new HashMap<Integer, AveragingYieldResponses>();
-		Map<Integer, CropAreas> aggregatedAreas = new HashMap<Integer, CropAreas>();
+		Map<Integer, AveragingYieldResponsesItem> aggregatedYield = new HashMap<Integer, AveragingYieldResponsesItem>();
+		Map<Integer, AreasItem> aggregatedAreas = new HashMap<Integer, AreasItem>();
 		mapping = new HashMap<Integer, Set<RasterKey>>();
 
-		for (Entry<RasterKey, YieldResponses> entry : yieldRaster.entrySet()) {
-			YieldResponses yresp = entry.getValue();
-			CropAreas cropAreas  = cropAreaRaster.get(entry.getKey());
+		for (Entry<RasterKey, YieldResponsesItem> entry : yieldRaster.entrySet()) {
+			YieldResponsesItem yresp = entry.getValue();
+			AreasItem cropAreas  = cropAreaRaster.get(entry.getKey());
 		
 			int cerealCat = findCategory(cerealDivisions, yresp.getYieldMax(CropType.CEREALS));
 			int pastureCat = findCategory(pastureDivisions, yresp.getYieldMax(CropType.MEAT_OR_PASTURE));
 			int id = cerealCat + pastureCat * numCerealCats;
 
-			AveragingYieldResponses avgYResp = getAverageYieldsForLocation(aggregatedYield, id);
-			CropAreas aggAreas = getAggregatedAreaForLocation(aggregatedAreas, id);
+			AveragingYieldResponsesItem avgYResp = getAverageYieldsForLocation(aggregatedYield, id);
+			AreasItem aggAreas = getAggregatedAreaForLocation(aggregatedAreas, id);
 			getMappingForLocation(mapping, id).add(entry.getKey()); 
 
 			for (CropType crop : CropType.values()) {
@@ -106,19 +106,19 @@ public class GamsRasterOptimiser {
 		return keys;
 	}
 
-	private CropAreas getAggregatedAreaForLocation(Map<Integer, CropAreas> aggregatedAreas, int id) {
-		CropAreas aggAreas = aggregatedAreas.get(id);
+	private AreasItem getAggregatedAreaForLocation(Map<Integer, AreasItem> aggregatedAreas, int id) {
+		AreasItem aggAreas = aggregatedAreas.get(id);
 		if (aggAreas == null) {
-			aggAreas = new CropAreas();
+			aggAreas = new AreasItem();
 			aggregatedAreas.put(id, aggAreas);	
 		}
 		return aggAreas;
 	}
 
-	private AveragingYieldResponses getAverageYieldsForLocation(Map<Integer, AveragingYieldResponses> aggregatedYield, int id) {
-		AveragingYieldResponses avgYResp = aggregatedYield.get(id);
+	private AveragingYieldResponsesItem getAverageYieldsForLocation(Map<Integer, AveragingYieldResponsesItem> aggregatedYield, int id) {
+		AveragingYieldResponsesItem avgYResp = aggregatedYield.get(id);
 		if (avgYResp == null) {
-			avgYResp = new AveragingYieldResponses();
+			avgYResp = new AveragingYieldResponsesItem();
 			aggregatedYield.put(id, avgYResp);	
 		}
 		return avgYResp;
@@ -139,7 +139,7 @@ public class GamsRasterOptimiser {
 	private List<Double> getDivisions(YieldRaster yieldRaster, CropType crop, int numCategories) {
 		List<Double> yieldValues = new ArrayList<Double>();
 
-		for (YieldResponses yresp : yieldRaster.values()) {
+		for (YieldResponsesItem yresp : yieldRaster.values()) {
 			yieldValues.add(yresp.getYieldMax(crop));
 		}
 		
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
index d5f7c61cd2a5323f51be9db80d3a042d883ca8de..ba94d2d5effdf225ddb821c178ef721131c99a10 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
@@ -2,20 +2,20 @@ package ac.ed.lurg.country.gams;
 
 import java.util.Map;
 
-import ac.ed.lurg.landuse.CropAreas;
-import ac.ed.lurg.landuse.Intensities;
+import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.IntensitiesItem;
 import ac.ed.lurg.types.CropType;
 import ac.sac.raster.RasterSet;
 
 public class GamsRasterOutput {
 	int status;
 	
-	RasterSet<Intensities> intensityRaster;
-	RasterSet<CropAreas> cropAreaRaster;
+	RasterSet<IntensitiesItem> intensityRaster;
+	RasterSet<AreasItem> cropAreaRaster;
 	Map<CropType, Double> feedAmounts;
 	Map<CropType, Double> netImports;
 	
-	public GamsRasterOutput(int status, RasterSet<Intensities> intensityRaster, RasterSet<CropAreas> cropAreaRaster, 
+	public GamsRasterOutput(int status, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, 
 			Map<CropType, Double> feedAmounts, Map<CropType, Double> netImports) {
 		super();
 		this.status = status;
@@ -28,10 +28,10 @@ public class GamsRasterOutput {
 	public int getStatus() {
 		return status;
 	}
-	public RasterSet<Intensities> getIntensityRaster() {
+	public RasterSet<IntensitiesItem> getIntensityRaster() {
 		return intensityRaster;
 	}
-	public RasterSet<CropAreas> getCropAreaRaster() {
+	public RasterSet<AreasItem> getCropAreaRaster() {
 		return cropAreaRaster;
 	}
 	public Map<CropType, Double> getFeedAmounts() {
diff --git a/src/ac/ed/lurg/country/gams/GamsTest.java b/src/ac/ed/lurg/country/gams/GamsTest.java
index f6b5a4f6ba6e1d19f1e7ab00be9e8d4641ff3404..befa8f060f8b809f86205c5bd30e06efe5d975c7 100644
--- a/src/ac/ed/lurg/country/gams/GamsTest.java
+++ b/src/ac/ed/lurg/country/gams/GamsTest.java
@@ -4,10 +4,11 @@ import java.util.HashMap;
 import java.util.Map;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.landuse.CropAreas;
+import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.types.LandDataType;
 import ac.ed.lurg.types.YieldType;
-import ac.ed.lurg.yield.YieldResponses;
+import ac.ed.lurg.yield.YieldResponsesItem;
 
 public class GamsTest {
 	
@@ -18,7 +19,7 @@ public class GamsTest {
 	
 	private void run() {
 		GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport());
-		GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs);
+		GamsInput gamsInput = new GamsInput(getYields(), getPreviousArea(), countryLevelInputs);
 		
 		GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);		
 		GamsOutput gamsOutput = opti.run();
@@ -38,9 +39,9 @@ public class GamsTest {
 	}
 
 	
-	public Map<Integer, YieldResponses> getYields() {
+	public Map<Integer, YieldResponsesItem> getYields() {
 		
-		YieldResponses yresp = new YieldResponses();
+		YieldResponsesItem yresp = new YieldResponsesItem();
 		
 		for (CropType crop : CropType.getAllItems()) {
 			yresp.setYield(YieldType.NONE, crop, 1);
@@ -51,7 +52,7 @@ public class GamsTest {
 			yresp.setYield(YieldType.FERT_IRRIG_MAX, crop, 4);
 		}
 		
-		Map<Integer, YieldResponses> returnMap = new HashMap<Integer, YieldResponses>();
+		Map<Integer, YieldResponsesItem> returnMap = new HashMap<Integer, YieldResponsesItem>();
 		
 		for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++)
 			returnMap.put(i, yresp);
@@ -59,8 +60,8 @@ public class GamsTest {
 		return returnMap;
 	}
 	
-	public Map<Integer, CropAreas> getPreviousCropArea() {
-		CropAreas dummyMap = new CropAreas();
+	public Map<Integer, AreasItem> getPreviousArea() {
+		AreasItem dummyMap = new AreasItem();
 		dummyMap.setCropArea(CropType.CEREALS, 9.0);
 		dummyMap.setCropArea(CropType.FRUIT, 5.0);
 		dummyMap.setCropArea(CropType.OILCROPS, 10.0);
@@ -70,7 +71,9 @@ public class GamsTest {
 		dummyMap.setCropArea(CropType.MEAT_OR_PASTURE, 80.0);
 		dummyMap.setCropArea(CropType.TREENUTS, 5.0);
 		
-		Map<Integer, CropAreas> returnMap = new HashMap<Integer, CropAreas>();
+		dummyMap.setLandCoverArea(LandDataType.LAND, 300);
+		
+		Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>();
 		
 		for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++)
 			returnMap.put(i, dummyMap);
diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/AreasItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4cdd72471db8ea9a520476bc7c8d73a916a0f36
--- /dev/null
+++ b/src/ac/ed/lurg/landuse/AreasItem.java
@@ -0,0 +1,36 @@
+package ac.ed.lurg.landuse;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import ac.ed.lurg.types.CropType;
+import ac.ed.lurg.types.LandDataType;
+import ac.sac.raster.RasterItem;
+
+/*
+ * Data for one year and country, but it does not know which one
+ */
+public class AreasItem implements RasterItem {
+
+	private Map<CropType, Double> cropAreas = new HashMap<CropType, Double>();
+	private Map<LandDataType, Double> landCoverAreas = new HashMap<LandDataType, Double>();
+
+	public double getCropArea(CropType c) {
+		Double d = cropAreas.get(c);
+		return d == null ? Double.NaN : d;
+	}
+	
+	public void setCropArea(CropType c, double area) {
+		cropAreas.put(c, area);
+	}
+	
+
+	public double getLandCoverArea(LandDataType c) {
+		Double d = landCoverAreas.get(c);
+		return d == null ? Double.NaN : d;
+	}
+	
+	public void setLandCoverArea(LandDataType c, double d) {
+		landCoverAreas.put(c, d);
+	}
+}
diff --git a/src/ac/ed/lurg/landuse/CropAreas.java b/src/ac/ed/lurg/landuse/CropAreas.java
deleted file mode 100644
index ea90b32791373e332bdb03f4034cb4f835877e08..0000000000000000000000000000000000000000
--- a/src/ac/ed/lurg/landuse/CropAreas.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package ac.ed.lurg.landuse;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import ac.ed.lurg.types.CropType;
-import ac.sac.raster.RasterItem;
-
-/*
- * Data for one year and country, but it does not know which one
- */
-public class CropAreas implements RasterItem {
-
-	private Map<CropType, Double> cropAreas = new HashMap<CropType, Double>();
-
-	public double getCropArea(CropType c) {
-		Double lu = cropAreas.get(c);
-		
-		if (lu != null)
-			return lu;
-		else
-			return 0;
-	}
-	
-	public void setCropArea(CropType c, double area) {
-		cropAreas.put(c, area);
-	}
-
-	public int size() {
-		return cropAreas.size();
-	}
-}
diff --git a/src/ac/ed/lurg/landuse/Intensities.java b/src/ac/ed/lurg/landuse/IntensitiesItem.java
similarity index 88%
rename from src/ac/ed/lurg/landuse/Intensities.java
rename to src/ac/ed/lurg/landuse/IntensitiesItem.java
index 218c6e10212c75c5943fcc1be7fad0b1adc36088..c7006850a54b0b7bad13a07489d125fdec4e760d 100644
--- a/src/ac/ed/lurg/landuse/Intensities.java
+++ b/src/ac/ed/lurg/landuse/IntensitiesItem.java
@@ -6,7 +6,7 @@ import java.util.Map;
 import ac.ed.lurg.types.CropType;
 import ac.sac.raster.RasterItem;
 
-public class Intensities implements RasterItem {
+public class IntensitiesItem implements RasterItem {
 
 	Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>();
 	
diff --git a/src/ac/ed/lurg/types/LandCoverType.java b/src/ac/ed/lurg/types/LandDataType.java
similarity index 56%
rename from src/ac/ed/lurg/types/LandCoverType.java
rename to src/ac/ed/lurg/types/LandDataType.java
index 4a4230acf271e9142b390897a3e98e7f01967512..b1b1b9c6cdc00ef9abc5877ddb618b64edd4824e 100644
--- a/src/ac/ed/lurg/types/LandCoverType.java
+++ b/src/ac/ed/lurg/types/LandDataType.java
@@ -1,16 +1,14 @@
 package ac.ed.lurg.types;
 
-public enum LandCoverType {
+public enum LandDataType {
 	
 	LAND ("land"),
-	ARABLE ("cropland"),
 	FOREST ("forest"),
-	PERM_CROP ("perm_crop"),
-	PASTURE ("pasture");
+	OTHER_NATURAL ("perm_crop");
 	
 	private String name;
 	
-	LandCoverType(String name) {
+	LandDataType(String name) {
 		this.name = name;
 	}
 	
diff --git a/src/ac/ed/lurg/yield/AveragingYieldResponses.java b/src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java
similarity index 81%
rename from src/ac/ed/lurg/yield/AveragingYieldResponses.java
rename to src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java
index 0a5f857f15aad3bb27317b8c8fc2b6cad0c206ec..3999ed311911880144d81fbbcbc4b0f3c92e77a2 100644
--- a/src/ac/ed/lurg/yield/AveragingYieldResponses.java
+++ b/src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java
@@ -2,7 +2,7 @@ package ac.ed.lurg.yield;
 
 import ac.ed.lurg.types.CropType;
 
-public class AveragingYieldResponses extends YieldResponses {
+public class AveragingYieldResponsesItem extends YieldResponsesItem {
 	
 	@Override
 	YieldResponse getYieldResponseForCrop(CropType crop) {
diff --git a/src/ac/ed/lurg/yield/YieldRaster.java b/src/ac/ed/lurg/yield/YieldRaster.java
index 2642384190469d19500ccb5a49c784847464b621..6876bbf820cedd9a0f6ba0f1cf05e25082d53fd6 100644
--- a/src/ac/ed/lurg/yield/YieldRaster.java
+++ b/src/ac/ed/lurg/yield/YieldRaster.java
@@ -4,7 +4,7 @@ import ac.ed.lurg.country.Country;
 import ac.sac.raster.RasterHeaderDetails;
 import ac.sac.raster.RasterSet;
 
-public class YieldRaster extends RasterSet<YieldResponses> {
+public class YieldRaster extends RasterSet<YieldResponsesItem> {
 
 	private static final long serialVersionUID = -4483319360580776344L;
 	
@@ -12,8 +12,8 @@ public class YieldRaster extends RasterSet<YieldResponses> {
 		super(header);
 	}
 	
-	protected YieldResponses createRasterData() {
-		return new YieldResponses();
+	protected YieldResponsesItem createRasterData() {
+		return new YieldResponsesItem();
 	}
 	
 	public YieldRaster getRasterForCountry(Country c) {
diff --git a/src/ac/ed/lurg/yield/YieldResponseMapReader.java b/src/ac/ed/lurg/yield/YieldResponseMapReader.java
index 6a19695eb886b98c197b7a38225a8db4b7caa965..549975d9485612cbf1528d191af0f155dd825446 100644
--- a/src/ac/ed/lurg/yield/YieldResponseMapReader.java
+++ b/src/ac/ed/lurg/yield/YieldResponseMapReader.java
@@ -7,12 +7,12 @@ import ac.sac.raster.AbstractRasterReader;
 import ac.sac.raster.RasterHeaderDetails;
 import ac.sac.raster.RasterSet;
 
-public class YieldResponseMapReader extends AbstractRasterReader<YieldResponses> {	
+public class YieldResponseMapReader extends AbstractRasterReader<YieldResponsesItem> {	
 
 	private YieldType yieldType;
 	private CropType cropType;
 	
-	public YieldResponseMapReader (RasterSet<YieldResponses> dataset, YieldType yieldType, CropType cropType) {
+	public YieldResponseMapReader (RasterSet<YieldResponsesItem> dataset, YieldType yieldType, CropType cropType) {
 		super(dataset);
 		this.yieldType = yieldType;
 		this.cropType = cropType;
@@ -27,7 +27,7 @@ public class YieldResponseMapReader extends AbstractRasterReader<YieldResponses>
 	}
 
 	@Override
-	public void setData(YieldResponses item, String token) {
+	public void setData(YieldResponsesItem item, String token) {
 		double d = Double.parseDouble(token);
 		item.setYield(yieldType, cropType, d);
 	}
diff --git a/src/ac/ed/lurg/yield/YieldResponses.java b/src/ac/ed/lurg/yield/YieldResponsesItem.java
similarity index 96%
rename from src/ac/ed/lurg/yield/YieldResponses.java
rename to src/ac/ed/lurg/yield/YieldResponsesItem.java
index 799ec7a6cd71581652e5deba0fc533315af5ca85..db6a2776fd8d02469becc8e828020a5dd3cffafd 100644
--- a/src/ac/ed/lurg/yield/YieldResponses.java
+++ b/src/ac/ed/lurg/yield/YieldResponsesItem.java
@@ -7,7 +7,7 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.YieldType;
 import ac.sac.raster.RasterItem;
 
-public class YieldResponses implements RasterItem {
+public class YieldResponsesItem implements RasterItem {
 	Map<CropType, YieldResponse> yieldResponses = new HashMap<CropType, YieldResponse>();
 
 	public void setYield(YieldType type, CropType crop, double yield) {