diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index 6991c744ae186a8b03d216e1df443d604c9973c3..88353ad8fbf2386873a3c5033f3c8d62bde5acf3 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -18,10 +18,9 @@ import ac.ed.lurg.country.CountryBoundaryReader;
 import ac.ed.lurg.country.gams.GamsRasterOutput;
 import ac.ed.lurg.demand.BaseConsumpManager;
 import ac.ed.lurg.demand.DemandManager;
-import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.landuse.CropUsageData;
 import ac.ed.lurg.landuse.CropUsageReader;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationConstraintReader;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.IrrigationMaxAmountReader;
@@ -52,9 +51,7 @@ public class ModelMain {
 	private RasterHeaderDetails desiredProjection;
 
 	private Map<CropType, Double> prevWorldPrices;
-	private RasterSet<IntensitiesItem> prevIntensityRaster;
-	private RasterSet<AreasItem> prevCropAreaRaster;
-
+	private RasterSet<LandUseItem> prevIntensityRaster;
 
 	public static void main(String[] args)  {
 		ModelMain theModel = new ModelMain();
@@ -106,8 +103,7 @@ public class ModelMain {
 		CropToDoubleMap totalImportCommodities = new CropToDoubleMap();
 		CropToDoubleMap totalExportCommodities = new CropToDoubleMap();
 
-		RasterSet<IntensitiesItem> globalIntensityRaster = new RasterSet<IntensitiesItem>(desiredProjection);
-		RasterSet<AreasItem> globalCropAreaRaster = new RasterSet<AreasItem>(desiredProjection);
+		RasterSet<LandUseItem> globalIntensityRaster = new RasterSet<LandUseItem>(desiredProjection);
 		RasterSet<IntegerRasterItem> globalLocationIdRaster = new RasterSet<IntegerRasterItem>(desiredProjection);
 
 		for (CountryAgent ca : countryAgents) {
@@ -135,7 +131,6 @@ public class ModelMain {
 
 			// update global rasters
 			globalIntensityRaster.putAll(result.getIntensityRaster());
-			globalCropAreaRaster.putAll(result.getCropAreaRaster());
 			globalLocationIdRaster.putAll(result.getLocationIdRaster());
 
 			// Get values for world input costs
@@ -170,11 +165,10 @@ public class ModelMain {
 
 
 		// output results
-		outputTimestepResults(timestep, globalIntensityRaster, globalCropAreaRaster, globalLocationIdRaster, yieldSurfaces);
+		outputTimestepResults(timestep, globalIntensityRaster, globalLocationIdRaster, yieldSurfaces);
 
 		// keep last to allow interpolation
 		prevIntensityRaster = globalIntensityRaster;
-		prevCropAreaRaster = globalCropAreaRaster;
 	}
 
 	public double updateMarketPrices(double previousPrice, double demand, double supply) {
@@ -208,7 +202,7 @@ public class ModelMain {
 		}
 	}
 
-	private void writeMarketFile(Timestep timestep, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster) {
+	private void writeMarketFile(Timestep timestep, RasterSet<LandUseItem> intensityRaster) {
 		try {
 			StringBuffer sbHeadings = new StringBuffer("Year, Cropland (Mha), Pasture (Mha), Natural (Mha), Fert crop (Mt), Fert pasture (Mt), Fert crop (M litre), Fert pasture (M litre)");
 			for (CropType crop : CropType.getImportedTypes())
@@ -219,15 +213,15 @@ public class ModelMain {
 			StringBuffer sbData = new StringBuffer();
 			sbData.append(String.format("%d, %.1f, %.1f, %.1f", 
 					timestep.getYear(), 
-					AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.CROPLAND),
-					AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.PASTURE),
-					AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.OTHER_NATURAL)));
+					LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.CROPLAND),
+					LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.PASTURE),
+					LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.OTHER_NATURAL)));
 
-			sbData.append(String.format(", %.1f", IntensitiesItem.getFertiliserTotal(intensityRaster.values(), CropType.getCropsLessPasture())/1000));
-			sbData.append(String.format(", %.1f", IntensitiesItem.getFertiliserTotal(intensityRaster.values(), CropType.PASTURE)/1000));
+			sbData.append(String.format(", %.1f", LandUseItem.getFertiliserTotal(intensityRaster.values(), CropType.getCropsLessPasture())/1000));
+			sbData.append(String.format(", %.1f", LandUseItem.getFertiliserTotal(intensityRaster.values(), CropType.PASTURE)/1000));
 			
-			sbData.append(String.format(", %.1f", IntensitiesItem.getIrrigationTotal(intensityRaster.values(), CropType.getCropsLessPasture())));
-			sbData.append(String.format(", %.1f", IntensitiesItem.getIrrigationTotal(intensityRaster.values(), CropType.PASTURE)));
+			sbData.append(String.format(", %.1f", LandUseItem.getIrrigationTotal(intensityRaster.values(), CropType.getCropsLessPasture())));
+			sbData.append(String.format(", %.1f", LandUseItem.getIrrigationTotal(intensityRaster.values(), CropType.PASTURE)));
 
 			for (CropType crop : CropType.getImportedTypes() )
 				sbData.append(String.format(", %.3f", prevWorldPrices.get(crop)));
@@ -241,44 +235,43 @@ public class ModelMain {
 		}
 	}
 
-	private void outputTimestepResults(Timestep timestep, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, 
-			RasterSet<IntegerRasterItem> locationIdRaster, YieldRaster yieldSurfaces) {
+	private void outputTimestepResults(Timestep timestep, RasterSet<LandUseItem> intensityRaster, RasterSet<IntegerRasterItem> locationIdRaster, YieldRaster yieldSurfaces) {
 
-		writeMarketFile(timestep, intensityRaster, cropAreaRaster);
+		writeMarketFile(timestep, intensityRaster);
 
 		if (ModelConfig.OUTPUT_FOR_LPJG) {
 			for (int outputYear : timestep.getYearsFromLast()) {
 				LogWriter.printlnError("Outputing Year: " + outputYear);
-				RasterSet<AreasItem> areasToOutput;
+				RasterSet<LandUseItem> areasToOutput;
 
 				if (outputYear == timestep.getYear()) {
-					areasToOutput = cropAreaRaster;
+					areasToOutput = intensityRaster;
 				}
 				else {
-					InterpolatingRasterSet<AreasItem> intermediateAreas = new InterpolatingRasterSet<AreasItem>(cropAreaRaster.getHeaderDetails()) {
+					InterpolatingRasterSet<LandUseItem> intermediateAreas = new InterpolatingRasterSet<LandUseItem>(intensityRaster.getHeaderDetails()) {
 						private static final long serialVersionUID = 1306045141011047760L;
-						protected AreasItem createRasterData() {
-							return new AreasItem();
+						protected LandUseItem createRasterData() {
+							return new LandUseItem();
 						}
 					};
-					intermediateAreas.setup(prevCropAreaRaster, cropAreaRaster, timestep.getPreviousTimestep().getYear(), timestep.getYear(), outputYear);
+					intermediateAreas.setup(prevIntensityRaster, intensityRaster, timestep.getPreviousTimestep().getYear(), timestep.getYear(), outputYear);
 					areasToOutput = intermediateAreas;
 				}
 
-				LpjgOutputer lpjOutputer = new LpjgOutputer(outputYear, intensityRaster, areasToOutput, yieldSurfaces);
+				LpjgOutputer lpjOutputer = new LpjgOutputer(outputYear, areasToOutput, yieldSurfaces);
 				lpjOutputer.writeOutput();
 			}
 		}
 
-		outputLandCover(timestep.getYear(), cropAreaRaster, LandCoverType.CROPLAND);
-		outputLandCover(timestep.getYear(), cropAreaRaster, LandCoverType.PASTURE); 
+		outputLandCover(timestep.getYear(), intensityRaster, LandCoverType.CROPLAND);
+		outputLandCover(timestep.getYear(), intensityRaster, LandCoverType.PASTURE); 
 	}
 
-	private void outputLandCover(int year, RasterSet<AreasItem> cropAreaRaster, final LandCoverType lcType) {
-		new RasterOutputer<AreasItem>(cropAreaRaster, lcType.getName() + "Area" + year) {
+	private void outputLandCover(int year, RasterSet<LandUseItem> cropAreaRaster, final LandCoverType lcType) {
+		new RasterOutputer<LandUseItem>(cropAreaRaster, lcType.getName() + "Area" + year) {
 			@Override
 			public Double getValue(RasterKey location) {
-				AreasItem area = results.get(location);
+				LandUseItem area = results.get(location);
 				if (area == null)
 					return null;
 
@@ -299,7 +292,7 @@ public class ModelMain {
 		Collection<CountryAgent> countryAgents = new HashSet<CountryAgent>();
 
 		RasterSet<LandCoverItem> initLC = getInitialLandCover();
-		RasterSet<IrrigationItem> allIrrigationCosts = getIrrigationCosts();
+		RasterSet<IrrigationItem> allIrrigationCosts = getIrrigationData();
 		Map<CompositeCountry, Map<CropType, CropUsageData>> cropUsageDataMap = new CropUsageReader(compositeCountryManager).getCommodityData();
 
 		for (CompositeCountry cc : countryGrouping) {
@@ -343,8 +336,8 @@ public class ModelMain {
 		return yieldReader.getRasterData(timestep); 
 	}
 
-	private RasterSet<IrrigationItem> getIrrigationCosts() {
-		RasterSet<IrrigationItem> irigCosts = new RasterSet<IrrigationItem>(desiredProjection) {
+	private RasterSet<IrrigationItem> getIrrigationData() {
+		RasterSet<IrrigationItem> irigData = new RasterSet<IrrigationItem>(desiredProjection) {
 			private static final long serialVersionUID = 8393130687550888654L;
 
 			protected IrrigationItem createRasterData() {
@@ -352,11 +345,10 @@ public class ModelMain {
 			}
 		};
 
-		new IrrigiationCostReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); 
-		new IrrigationConstraintReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE); 
-		new IrrigationMaxAmountReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE);
+		new IrrigiationCostReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); 
+		new IrrigationConstraintReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE); 
+		new IrrigationMaxAmountReader(irigData).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE);
 
-		
-		return irigCosts;
+		return irigData;
 	}
 }
\ No newline at end of file
diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java
index e81e6aab2aeaa89516f53bf304a2933567859871..f2139364506bb5f275c685b876805a285b1af4fa 100644
--- a/src/ac/ed/lurg/country/CountryAgent.java
+++ b/src/ac/ed/lurg/country/CountryAgent.java
@@ -9,8 +9,8 @@ import ac.ed.lurg.country.gams.GamsRasterInput;
 import ac.ed.lurg.country.gams.GamsRasterOptimiser;
 import ac.ed.lurg.country.gams.GamsRasterOutput;
 import ac.ed.lurg.demand.DemandManager;
-import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.landuse.CropUsageData;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.landuse.LandCoverItem;
 import ac.ed.lurg.types.CommodityType;
@@ -36,18 +36,18 @@ public class CountryAgent {
 		
 		this.demandManager = demandManager;
 		this.country = country;
-		RasterSet<AreasItem> cropAreaRaster = convertInitialLC(initialLC);
+		RasterSet<LandUseItem> cropAreaRaster = convertInitialLC(initialLC);
 		this.irrigationCostRaster = irrigationCostRaster;
 		
 		GamsRasterOutput initialData = new GamsRasterOutput(cropAreaRaster, cropUsageData);
 		resultsTimeseries.put(new Timestep(0), initialData);
 	}
 
-	private RasterSet<AreasItem> convertInitialLC(RasterSet<LandCoverItem> initialLC) {
-		RasterSet<AreasItem> cropAreaRaster = new RasterSet<AreasItem>(initialLC.getHeaderDetails());
+	private RasterSet<LandUseItem> convertInitialLC(RasterSet<LandCoverItem> initialLC) {
+		RasterSet<LandUseItem> cropAreaRaster = new RasterSet<LandUseItem>(initialLC.getHeaderDetails());
 		
 		for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet()) {
-			AreasItem areasItem = new AreasItem();
+			LandUseItem areasItem = new LandUseItem();
 			RasterKey key = entry.getKey();
 			areasItem.setLandCoverAreas(entry.getValue());
 			areasItem.setCropFraction(CropType.WHEAT, 0.5); // random start, better if we could get data, but free substitution between crops so not critical
@@ -117,7 +117,7 @@ public class CountryAgent {
 		}
 		
 		GamsCountryInput countryLevelInputs = GamsCountryInput.createInput(country, projectedDemand, worldInputPrices, baseNetImport, maxOfProdOrSupply, cropAdjs, calibrate);	
-		GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getCropAreaRaster(), irrigationCostRaster, countryLevelInputs);
+		GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getIntensityRaster(), irrigationCostRaster, countryLevelInputs);
 
 		return input;
 	}
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationInput.java b/src/ac/ed/lurg/country/gams/GamsLocationInput.java
index 5ec01267f01396bb6948ee17c2624e7c5fee9c09..bfd808f1431c7d9edbb61814a798a7e236345cac 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationInput.java
@@ -3,7 +3,7 @@ package ac.ed.lurg.country.gams;
 import java.util.Map;
 
 import ac.ed.lurg.Timestep;
-import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.yield.YieldResponsesItem;
@@ -12,11 +12,11 @@ public class GamsLocationInput {
 	
 	private Timestep timestep;
 	private Map<Integer, ? extends YieldResponsesItem> yields;
-	private Map<Integer, ? extends AreasItem> previousAreas;
+	private Map<Integer, ? extends LandUseItem> previousAreas;
 	private Map<Integer, ? extends IrrigationItem> irrigationCosts;
 	private GamsCountryInput countryInput;
 	
-	public GamsLocationInput(Timestep timestep, Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends AreasItem> previousAreas,
+	public GamsLocationInput(Timestep timestep, Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends LandUseItem> previousAreas,
 			Map<Integer, ? extends IrrigationItem> irrigationCosts, GamsCountryInput countryInput) {
 		super();
 		this.timestep = timestep;
@@ -35,7 +35,7 @@ public class GamsLocationInput {
 		return yields;
 	}
 	
-	public Map<Integer, ? extends AreasItem> getPreviousAreas() {
+	public Map<Integer, ? extends LandUseItem> getPreviousAreas() {
 		return previousAreas;
 	}
 	
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
index 2bb0e6b8f39e34677dd3a4e43e1ea256028d166e..b935e34a51edc87680fbc203e9330ff1fc35fc0f 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java
@@ -7,9 +7,8 @@ import java.util.Map.Entry;
 import java.util.Vector;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.landuse.CropUsageData;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.Intensity;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.types.CommodityType;
@@ -93,10 +92,10 @@ public class GamsLocationOptimiser {
 
 		double totalAgriLand = 0;
 
-		for (Map.Entry<Integer, ? extends AreasItem> entry : inputData.getPreviousAreas().entrySet()) {
+		for (Map.Entry<Integer, ? extends LandUseItem> entry : inputData.getPreviousAreas().entrySet()) {
 			Integer locationId = entry.getKey();
 			String locString = Integer.toString(locationId);
-			AreasItem areasItem = entry.getValue();
+			LandUseItem areasItem = entry.getValue();
 			
 			double suitableLand = areasItem.getSuitableLand();
 			if (DEBUG) LogWriter.println(String.format("  %d   %15s,\t %.1f", locationId, "suitableLand", suitableLand));
@@ -219,12 +218,9 @@ public class GamsLocationOptimiser {
 		double totalPastureArea = 0;
 		double area, fertIntensity, irrigIntensity, otherIntensity = Double.NaN, feedAmount, netImport, yield, unitEnergy, cropAdj, prod, prodCost;
 
-		final LazyHashMap<Integer, AreasItem> cropAreas = new LazyHashMap<Integer, AreasItem>() { 
-			protected AreasItem createValue() { return new AreasItem(); }
-		};
-		
-		HashMap<Integer, IntensitiesItem> intensities = new HashMap<Integer, IntensitiesItem>();
-		
+		final LazyHashMap<Integer, LandUseItem> cropAreas = new LazyHashMap<Integer, LandUseItem>() { 
+			protected LandUseItem createValue() { return new LandUseItem(); }
+		};		
 		
 		Map<CropType, CropUsageData> cropUsageData = new HashMap<CropType, CropUsageData>();
 		Map<CropType, Double> cropAdjs = new HashMap<CropType, Double>();
@@ -254,20 +250,14 @@ public class GamsLocationOptimiser {
 				if (DEBUG) LogWriter.println(String.format("\n%s:\tfeedAmount= %.1f,\tnetImports= %.3f,\tprod= %.3f,\tprodCost= %.3f,\tcropAdj= %.3f", itemName, feedAmount, netImport, prod, prodCost, cropAdj)); 
 			}
 
+			LandUseItem areasItem = cropAreas.lazyGet(locId);
+
 			if (area > 0) { 
-				if (DEBUG) LogWriter.println(String.format("\t location %s, %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", locationName, itemName, area, fertIntensity, irrigIntensity, otherIntensity));
-				
-				IntensitiesItem intensityItem = intensities.get(locId);
-				if (intensityItem == null) {
-					intensityItem = new IntensitiesItem(cropAreas.lazyGet(locId));
-					intensities.put(locId, intensityItem);
-				}
-				
-				intensityItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity, yield, unitEnergy));
+				if (DEBUG) LogWriter.println(String.format("\t location %s, %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", locationName, itemName, area, fertIntensity, irrigIntensity, otherIntensity));				
+				areasItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity, yield, unitEnergy));
 			}
 
 			double croplandArea = getParmValue(parmCroplandArea, locationName);
-			AreasItem areasItem = cropAreas.lazyGet(locId);
 			if (cropType.equals(CropType.PASTURE)) {
 				areasItem.setLandCoverArea(LandCoverType.PASTURE, area);
 				totalPastureArea += area;
@@ -290,7 +280,7 @@ public class GamsLocationOptimiser {
 			LogWriter.println(String.format("\nTotal area= %.1f (crop=%.1f, pasture %.1f)", totalCropArea+totalPastureArea, totalCropArea, totalPastureArea));
 		}
 
-		GamsLocationOutput results = new GamsLocationOutput(modelStatus, intensities, cropAreas, cropUsageData, cropAdjs);
+		GamsLocationOutput results = new GamsLocationOutput(modelStatus, cropAreas, cropUsageData, cropAdjs);
 		return results;
 	}
 
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
index 327662bb21ffa2770852e3151613063251bf92c4..34c0992e6518ee2f5449f8321cce4cf3575a03b2 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java
@@ -2,28 +2,24 @@ package ac.ed.lurg.country.gams;
 
 import java.util.Map;
 
-import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.landuse.CropUsageData;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.types.CropType;
 
 public class GamsLocationOutput {
 	int status;
 	
-	Map<Integer, IntensitiesItem> intensities;  // data mapped from id (not raster)
-	Map<Integer, AreasItem> cropAreas;
+	Map<Integer, LandUseItem> intensities;  // data mapped from id (not raster)
 	private Map<CropType, CropUsageData> cropUsageData;
 	Map<CropType, Double> cropAdjustments;
 	
 	public GamsLocationOutput(int status, 
-			Map<Integer, IntensitiesItem> intensities, 
-			Map<Integer, AreasItem> cropAreas, 
+			Map<Integer, LandUseItem> intensities, 
 			Map<CropType, CropUsageData> cropUsageData,
 			Map<CropType, Double> cropAdjustments) {
 		super();
 		this.status = status;
 		this.intensities = intensities;
-		this.cropAreas = cropAreas;
 		this.cropUsageData = cropUsageData;
 		this.cropAdjustments = cropAdjustments;
 	}
@@ -31,12 +27,10 @@ public class GamsLocationOutput {
 	public int getStatus() {
 		return status;
 	}
-	public Map<Integer, IntensitiesItem> getIntensities() {
+	public Map<Integer, LandUseItem> getIntensities() {
 		return intensities;
 	}
-	public Map<Integer, AreasItem> getCropAreas() {
-		return cropAreas;
-	}
+
 	public Map<CropType, CropUsageData> getCommoditiesData() {
 		return cropUsageData;
 	}
diff --git a/src/ac/ed/lurg/country/gams/GamsLocationTest.java b/src/ac/ed/lurg/country/gams/GamsLocationTest.java
index b47779cdd47e1b7408491fde0a04733970993f60..aac6c0de67b46f7c02a5104636f219babde3348c 100644
--- a/src/ac/ed/lurg/country/gams/GamsLocationTest.java
+++ b/src/ac/ed/lurg/country/gams/GamsLocationTest.java
@@ -5,7 +5,7 @@ import java.util.Map;
 
 import ac.ed.lurg.Timestep;
 import ac.ed.lurg.country.CompositeCountry;
-import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.types.CommodityType;
 import ac.ed.lurg.types.CropType;
@@ -82,9 +82,9 @@ public class GamsLocationTest {
 		return returnMap;
 	}
 	
-	private Map<Integer, AreasItem> getPreviousArea() {
-		AreasItem dummyMap = getAreaItem(0,0);
-		Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>();
+	private Map<Integer, LandUseItem> getPreviousArea() {
+		LandUseItem dummyMap = getAreaItem(0,0);
+		Map<Integer, LandUseItem> returnMap = new HashMap<Integer, LandUseItem>();
 		
 		for (int i= 1; i<=NUM_LOCATIONS_PER_COUNTRY; i++)
 			returnMap.put(i, dummyMap);
@@ -92,8 +92,8 @@ public class GamsLocationTest {
 		return returnMap;
 	}
 
-	AreasItem getAreaItem(double cereal, double pasture) {
-		AreasItem dummyMap = new AreasItem();
+	LandUseItem getAreaItem(double cereal, double pasture) {
+		LandUseItem dummyMap = new LandUseItem();
 		
 		dummyMap.setCropFraction(CropType.WHEAT, 0.2);
 		dummyMap.setCropFraction(CropType.MAIZE, 0.2);
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
index af3d8d073dd2b919cef22f5774a0a8695aa6f18b..b093c51df3295ba92cfec1f72ac5d8f0323e9b60 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java
@@ -1,7 +1,7 @@
 package ac.ed.lurg.country.gams;
 
 import ac.ed.lurg.Timestep;
-import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.yield.YieldRaster;
 import ac.sac.raster.RasterSet;
@@ -10,16 +10,16 @@ public class GamsRasterInput {
 	
 	private Timestep timestep;
 	private YieldRaster yields;
-	private RasterSet<AreasItem> previousAreas;
+	private RasterSet<LandUseItem> previousIntensityAreas;
 	private RasterSet<IrrigationItem> irrigationCost;
 	private GamsCountryInput countryInput;
 
-	public GamsRasterInput(Timestep timestep, YieldRaster yields, RasterSet<AreasItem> previousAreas, 
+	public GamsRasterInput(Timestep timestep, YieldRaster yields, RasterSet<LandUseItem> previousIntensityAreas, 
 			RasterSet<IrrigationItem> irrigationCost, GamsCountryInput countryInput) {
 		super();
 		this.timestep = timestep;
 		this.yields = yields;
-		this.previousAreas = previousAreas;
+		this.previousIntensityAreas = previousIntensityAreas;
 		this.irrigationCost = irrigationCost;
 		this.countryInput = countryInput;
 	}
@@ -28,8 +28,8 @@ public class GamsRasterInput {
 		return yields;
 	}
 
-	public RasterSet<AreasItem> getPreviousAreas() {
-		return previousAreas;
+	public RasterSet<LandUseItem> getPreviousAreas() {
+		return previousIntensityAreas;
 	}
 	
 	public RasterSet<IrrigationItem> getIrrigationCost() {
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index 19d76b6f9e44510821c00d070f65253d05e9352c..90a3931a1af97841d772b8fca7380275fee0d200 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -10,8 +10,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.landuse.AreasItem;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.LandCoverType;
@@ -62,8 +61,8 @@ public class GamsRasterOptimiser {
 				cropAdjustments.put(c, 1.0);
 			}
 
-			double baseCropland = AreasItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.CROPLAND);
-			double basePasture = AreasItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.PASTURE);
+			double baseCropland = LandUseItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.CROPLAND);
+			double basePasture = LandUseItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.PASTURE);
 
 			LogWriter.println("baseCropland=" + baseCropland + ", basePasture=" + basePasture);
 
@@ -74,7 +73,7 @@ public class GamsRasterOptimiser {
 				result = opti.run();
 
 				if (baseCropland > 0) {
-					double cropAdjSingle = AreasItem.getTotalLandCover(result.getCropAreas(), LandCoverType.CROPLAND) / baseCropland;
+					double cropAdjSingle = LandUseItem.getTotalLandCover(result.getIntensities(), LandCoverType.CROPLAND) / baseCropland;
 					cropAdjSingle = Math.min(Math.max(cropAdjSingle, 0.5), 2);
 
 					for (CropType c : CropType.getCropsLessPasture()) {
@@ -83,7 +82,7 @@ public class GamsRasterOptimiser {
 				}
 
 				if (basePasture > 0) {
-					double pastureAdjSingle = AreasItem.getTotalLandCover(result.getCropAreas(), LandCoverType.PASTURE) / basePasture;
+					double pastureAdjSingle = LandUseItem.getTotalLandCover(result.getIntensities(), LandCoverType.PASTURE) / basePasture;
 					pastureAdjSingle = Math.min(Math.max(pastureAdjSingle, 0.5), 2);
 					cropAdjustments.put(CropType.PASTURE, Math.min(Math.max(cropAdjustments.get(CropType.PASTURE) * pastureAdjSingle, 0.2), 5));
 				}
@@ -98,8 +97,7 @@ public class GamsRasterOptimiser {
 
 
 	private GamsRasterOutput convertToRaster(GamsLocationInput gamsInput, GamsLocationOutput gamsOutput) {		
-		RasterSet<AreasItem> newAreaRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput);
-		RasterSet<IntensitiesItem> newIntensityRaster = allocIntensities(gamsOutput);
+		RasterSet<LandUseItem> newIntensityRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput);
 
 		RasterSet<IntegerRasterItem> locationIdRaster = new RasterSet<IntegerRasterItem>(rasterInputData.getPreviousAreas().getHeaderDetails());
 		for (Entry<Integer, Set<RasterKey>> entry : mapping.entrySet()) {
@@ -108,14 +106,14 @@ public class GamsRasterOptimiser {
 				locationIdRaster.put(key, new IntegerRasterItem(locId));
 		}
 
-		return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, newAreaRaster, gamsOutput.getCommoditiesData(), gamsOutput.getCropAdjustments(), locationIdRaster);
+		return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, gamsOutput.getCommoditiesData(), gamsOutput.getCropAdjustments(), locationIdRaster);
 	}
 
-	private RasterSet<AreasItem> createWithSameLandCovers(RasterSet<AreasItem> toCopy) {
-		RasterSet<AreasItem> theCopy = new RasterSet<AreasItem>(toCopy.getHeaderDetails());
+	private RasterSet<LandUseItem> createWithSameLandCovers(RasterSet<LandUseItem> toCopy) {
+		RasterSet<LandUseItem> theCopy = new RasterSet<LandUseItem>(toCopy.getHeaderDetails());
 
-		for (Entry<RasterKey, AreasItem> entry : toCopy.entrySet()) {
-			AreasItem newAreasItem = new AreasItem();
+		for (Entry<RasterKey, LandUseItem> entry : toCopy.entrySet()) {
+			LandUseItem newAreasItem = new LandUseItem();
 			newAreasItem.setLandCoverAreas(entry.getValue());
 			theCopy.put(entry.getKey(), newAreasItem);
 		}
@@ -123,10 +121,10 @@ public class GamsRasterOptimiser {
 		return theCopy;
 	}
 
-	private void checkedTotalAreas(RasterSet<AreasItem> areaRaster, String comment) {
+	private void checkedTotalAreas(RasterSet<LandUseItem> areaRaster, String comment) {
 		for (LandCoverType l : LandCoverType.values()) {
 			double total = 0;
-			for (AreasItem a : areaRaster.values()) {
+			for (LandUseItem a : areaRaster.values()) {
 				total += a.getLandCoverArea(l);
 			}
 
@@ -134,20 +132,20 @@ public class GamsRasterOptimiser {
 		}
 	}
 
-	private RasterSet<AreasItem> allocAreas(Map<Integer, ? extends AreasItem> prevAreasAgg, GamsLocationOutput gamsOutput) {
-		RasterSet<AreasItem> newAreaRaster = createWithSameLandCovers(rasterInputData.getPreviousAreas());
+	private RasterSet<LandUseItem> allocAreas(Map<Integer, ? extends LandUseItem> prevAreasAgg, GamsLocationOutput gamsOutput) {
+		RasterSet<LandUseItem> newAreaRaster = createWithSameLandCovers(rasterInputData.getPreviousAreas());
 
 		//checkedTotalAreas(rasterInputData.getPreviousAreas(), "old");
 		//checkedTotalAreas(newAreaRaster, "new");
 
-		for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) {
+		for (Map.Entry<Integer, LandUseItem> entry : gamsOutput.getIntensities().entrySet()) {
 			Integer locId = entry.getKey();
-			AreasItem newAreaAggItem = entry.getValue();
-			AreasItem prevAreaAggItem = prevAreasAgg.get(locId);
+			LandUseItem newAreaAggItem = entry.getValue();
+			LandUseItem prevAreaAggItem = prevAreasAgg.get(locId);
 			Set<RasterKey> keys = mapping.get(locId);
 
 			if (DEBUG) 
-				checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<AreasItem>(newAreaRaster.getHeaderDetails()), keys), locId + " before");
+				checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<LandUseItem>(newAreaRaster.getHeaderDetails()), keys), locId + " before");
 
 			double pastureChange = newAreaAggItem.getLandCoverArea(LandCoverType.PASTURE) - prevAreaAggItem.getLandCoverArea(LandCoverType.PASTURE);
 			double croplandChange = newAreaAggItem.getLandCoverArea(LandCoverType.CROPLAND) - prevAreaAggItem.getLandCoverArea(LandCoverType.CROPLAND);
@@ -189,12 +187,13 @@ public class GamsRasterOptimiser {
 				LogWriter.printlnError("This should never happen, due to GAMS constraint. Not able to incorporate all changes, as not enough forest or natural areas left: " + locId + ": " + shortfall);
 
 			if (DEBUG) 
-				checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<AreasItem>(newAreaRaster.getHeaderDetails()), keys), locId + " after");
+				checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<LandUseItem>(newAreaRaster.getHeaderDetails()), keys), locId + " after");
 
 			for (RasterKey key : keys) {
-				AreasItem newAreasRasterItem = newAreaRaster.get(key);
+				LandUseItem newAreasRasterItem = newAreaRaster.get(key);
 				for (CropType crop : CropType.values()) {
 					newAreasRasterItem.setCropFraction(crop, newAreaAggItem.getCropFraction(crop));
+					newAreasRasterItem.setIntensity(crop, newAreaAggItem.getIntensity(crop)); // intensities constant over single aggregated land category
 				}
 			}
 		}
@@ -202,7 +201,7 @@ public class GamsRasterOptimiser {
 		return newAreaRaster;
 	}
 
-	private double allocAllLandCrops(RasterSet<AreasItem> newAreaRaster, Set<RasterKey> keys, LandCoverType toLC, LandCoverType fromLC, double change) {
+	private double allocAllLandCrops(RasterSet<LandUseItem> newAreaRaster, Set<RasterKey> keys, LandCoverType toLC, LandCoverType fromLC, double change) {
 		LandCoverType toType = toLC;
 		LandCoverType fromType = fromLC;
 
@@ -219,7 +218,7 @@ public class GamsRasterOptimiser {
 
 		for (RasterKey key : keys) {
 			//if (DEBUG) LogWriter.println("  Processing raster key " + key);
-			AreasItem newAreasRasterItem = newAreaRaster.get(key);
+			LandUseItem newAreasRasterItem = newAreaRaster.get(key);
 
 			double shortfall = newAreasRasterItem.moveAreas(toType, fromType, avgChange);
 			if (shortfall == 0)
@@ -236,26 +235,11 @@ public class GamsRasterOptimiser {
 		return totalShortfall;
 	}
 
-	private RasterSet<IntensitiesItem> allocIntensities(GamsLocationOutput gamsOutput) {
-
-		RasterSet<IntensitiesItem> newIntensityRaster = new RasterSet<IntensitiesItem>(rasterInputData.getPreviousAreas().getHeaderDetails());
-
-		for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) {
-			Integer locId = entry.getKey();
-			IntensitiesItem newIntensitiesItem = gamsOutput.getIntensities().get(locId);
-
-			for (RasterKey key : mapping.get(locId)) {
-				newIntensityRaster.put(key, newIntensitiesItem); // intensities constant over single aggregated land category
-			}
-		}
-		return newIntensityRaster;
-	}
-
 	@SuppressWarnings("serial")
 	private GamsLocationInput 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<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas();
+		RasterSet<LandUseItem> cropAreaRaster = rasterInputData.getPreviousAreas();
 
 		/*	checkedTotalAreas(cropAreaRaster, "before");
 		new RasterOutputer<AreasItem>(cropAreaRaster, "BeforeLandCover") {
@@ -319,8 +303,8 @@ public class GamsRasterOptimiser {
 		LazyTreeMap<Integer, AveragingYieldResponsesItem> aggregatedYields = new LazyTreeMap<Integer, AveragingYieldResponsesItem>() { 
 			protected AveragingYieldResponsesItem createValue() { return new AveragingYieldResponsesItem(); }
 		};
-		LazyTreeMap<Integer, AreasItem> aggregatedAreas = new LazyTreeMap<Integer, AreasItem>() { 
-			protected AreasItem createValue() { return new AreasItem(); }
+		LazyTreeMap<Integer, LandUseItem> aggregatedAreas = new LazyTreeMap<Integer, LandUseItem>() { 
+			protected LandUseItem createValue() { return new LandUseItem(); }
 		};
 		LazyTreeMap<Integer, IrrigationItem> aggregatedIrrigCosts = new LazyTreeMap<Integer, IrrigationItem>() { 
 			protected IrrigationItem createValue() { return new IrrigationItem(); }
@@ -345,7 +329,7 @@ public class GamsRasterOptimiser {
 				countFound++;
 				//LogWriter.println("YieldResponsesItem found for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key));
 
-				AreasItem cropAreas  = cropAreaRaster.get(key);
+				LandUseItem cropAreas  = cropAreaRaster.get(key);
 				if (cropAreas == null) {
 					LogWriter.printlnError("GamsRasterOptimiser: Can't find cropAreas for " + key);
 					continue;
@@ -358,7 +342,7 @@ public class GamsRasterOptimiser {
 				Integer id = cerealCat + pastureCat * numCerealCats;
 
 				AveragingYieldResponsesItem avgYResp = aggregatedYields.lazyGet(id);
-				AreasItem aggAreas = aggregatedAreas.lazyGet(id);
+				LandUseItem aggAreas = aggregatedAreas.lazyGet(id);
 				IrrigationItem avgIrigCost = aggregatedIrrigCosts.lazyGet(id);
 				mapping.lazyGet(id).add(key); 
 
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
index 30c2eb072c061c08852d2d25addd480f0f1beff4..1787e2b1b9752dafa2d1b6450917585b03bbf51e 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java
@@ -2,9 +2,8 @@ package ac.ed.lurg.country.gams;
 
 import java.util.Map;
 
-import ac.ed.lurg.landuse.AreasItem;
 import ac.ed.lurg.landuse.CropUsageData;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.types.CropType;
 import ac.sac.raster.IntegerRasterItem;
 import ac.sac.raster.RasterSet;
@@ -13,24 +12,22 @@ public class GamsRasterOutput {
 	
 	private int status;
 	
-	private RasterSet<IntensitiesItem> intensityRaster;
-	private RasterSet<AreasItem> cropAreaRaster;
+	private RasterSet<LandUseItem> intensityRaster;
 	private RasterSet<IntegerRasterItem> locationIdRaster;
 	
 	private Map<CropType, CropUsageData> cropUsageData;
 	private Map<CropType, Double> cropAdjustments;
 
-	public GamsRasterOutput(RasterSet<AreasItem> cropAreaRaster, Map<CropType, CropUsageData> cropUsageData) {
+	public GamsRasterOutput(RasterSet<LandUseItem> intensityRaster, Map<CropType, CropUsageData> cropUsageData) {
 		super();
-		this.cropAreaRaster = cropAreaRaster;
-		this.cropUsageData = cropUsageData;
+		this.intensityRaster = intensityRaster;
+        this.cropUsageData = cropUsageData;
 	}
 
-	public GamsRasterOutput(int status, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, Map<CropType, CropUsageData> cropUsageData, 
+	public GamsRasterOutput(int status, RasterSet<LandUseItem> intensityRaster, Map<CropType, CropUsageData> cropUsageData, 
 			Map<CropType, Double> cropAdjustments, RasterSet<IntegerRasterItem> locationIdRaster) {
-		this(cropAreaRaster, cropUsageData);
+		this(intensityRaster, cropUsageData);
 		this.status = status;
-		this.intensityRaster = intensityRaster;
 		this.cropAdjustments = cropAdjustments;
 		this.locationIdRaster = locationIdRaster;
 	}
@@ -39,14 +36,10 @@ public class GamsRasterOutput {
 		return status;
 	}
 	
-	public RasterSet<IntensitiesItem> getIntensityRaster() {
+	public RasterSet<LandUseItem> getIntensityRaster() {
 		return intensityRaster;
 	}
-	
-	public RasterSet<AreasItem> getCropAreaRaster() {
-		return cropAreaRaster;
-	}
-	
+		
 	public RasterSet<IntegerRasterItem> getLocationIdRaster() {
 		return locationIdRaster;
 	}
diff --git a/src/ac/ed/lurg/country/gams/GamsRasterTest.java b/src/ac/ed/lurg/country/gams/GamsRasterTest.java
index ec5c5e048934d7b3caf0339b59c597f06056a310..8b1c1b7e84f9a130cd71f19766b967e31baba65d 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterTest.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterTest.java
@@ -2,7 +2,7 @@ package ac.ed.lurg.country.gams;
 
 import ac.ed.lurg.Timestep;
 import ac.ed.lurg.country.CompositeCountry;
-import ac.ed.lurg.landuse.AreasItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.landuse.IrrigationItem;
 import ac.ed.lurg.utils.LogWriter;
 import ac.ed.lurg.yield.YieldRaster;
@@ -63,13 +63,13 @@ public class GamsRasterTest extends GamsLocationTest {
 	}
 
 	
-	public RasterSet<AreasItem> getPreviousAreaRaster() {
-		RasterSet<AreasItem> testAreaRaster= new RasterSet<AreasItem>(null);
+	public RasterSet<LandUseItem> getPreviousAreaRaster() {
+		RasterSet<LandUseItem> testAreaRaster= new RasterSet<LandUseItem>(null);
 		
 		for (int i = 0; i<X_RANGE; i++) {
 			for (int j = 0; j<Y_RANGE; j++) {
 				RasterKey key = new RasterKey(i,j);
-				AreasItem areaItem = getAreaItem(i * 20, j * 30);
+				LandUseItem areaItem = getAreaItem(i * 20, j * 30);
 				testAreaRaster.put(key, areaItem);
 			}
 		}
diff --git a/src/ac/ed/lurg/landuse/IntensitiesItem.java b/src/ac/ed/lurg/landuse/IntensitiesItem.java
deleted file mode 100644
index 37ec5897af921908ffa350523889cb7d62cd597b..0000000000000000000000000000000000000000
--- a/src/ac/ed/lurg/landuse/IntensitiesItem.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package ac.ed.lurg.landuse;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import ac.ed.lurg.types.CropType;
-import ac.sac.raster.RasterItem;
-
-public class IntensitiesItem implements RasterItem {
-
-	private Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>();
-	private AreasItem areaItem;
-	
-	public IntensitiesItem(AreasItem areaItem) {
-		this.areaItem = areaItem;
-	}
-	
-	public Intensity getIntensity(CropType crop) {
-		return intensityMap.get(crop);
-	}
-	
-	public void setIntensity(CropType crop, Intensity intensityData) {
-		intensityMap.put(crop, intensityData);
-	}
-	
-	/** Fertiliser rate in kg/ha */
-	public double getFertiliserRate(CropType crop) {
-		Intensity i = getIntensity(crop);
-		return (i == null) ? 0 : i.getFertiliserAmount();
-	}
-	
-	/** Fertiliser amount in kt (1000 tonnes), for this location */
-	public double getFertiliserAmount(CropType c) {
-		double rate = getFertiliserRate(c);
-		double area = areaItem.getCropArea(c);
-		return rate * area;
-	}
-	
-	public double getFertiliserAverageRate(CropType... crops) {
-		double fertTotal = 0;
-		double areaTotal = 0;
-		
-		for (CropType c : crops) {
-			fertTotal += getFertiliserAmount(c);
-			areaTotal = areaItem.getCropArea(c);
-		}
-		
-		return areaTotal > 0 ? fertTotal / areaTotal : 0;
-	}
-
-	
-	public static double getFertiliserTotal(Collection<? extends IntensitiesItem> items, CropType... crops) {			
-		double total = 0;
-		for (IntensitiesItem a : items) {
-			if (a == null)
-				continue;
-			
-			for (CropType c : crops)
-				total += a.getFertiliserAmount(c);
-		}
-			
-		return total;
-	}
-
-	public static double getFertiliserTotal(Collection<? extends IntensitiesItem> items, Collection<CropType> crops) {
-		return getFertiliserTotal(items, crops.toArray(new CropType[crops.size()]));
-	}
-
-	/** Irrigation rate in litre/ha */
-	public double getIrrigationRate(CropType crop) {
-		Intensity i = getIntensity(crop);
-		
-		return (i == null) ? 0 : i.getIrrigationRate(999);
-	}
-
-	/** Irrigation amount in M litres, for this location */
-	public double getIrrigationAmount(CropType c) {
-		double rate = getIrrigationRate(c);
-		double area = areaItem.getCropArea(c);
-		return rate * area;
-	}
-
-	public double getIrrigationAverageRate(CropType... crops) {
-		double irrigTotal = 0;
-		double areaTotal = 0;
-		
-		for (CropType c : crops) {
-			irrigTotal += getIrrigationAmount(c);
-			areaTotal = areaItem.getCropArea(c);
-		}
-		
-		return areaTotal > 0 ? irrigTotal / areaTotal : 0;
-	}
-	
-	public static double getIrrigationTotal(Collection<? extends IntensitiesItem> items, CropType... crops) {			
-		double total = 0;
-		for (IntensitiesItem a : items) {
-			if (a == null)
-				continue;
-			
-			for (CropType c : crops)
-				total += a.getIrrigationAmount(c);
-		}
-			
-		return total;
-	}
-
-	public static double getIrrigationTotal(Collection<? extends IntensitiesItem> items, Collection<CropType> crops) {
-		return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()]));
-	}
-}
diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/LandUseItem.java
similarity index 56%
rename from src/ac/ed/lurg/landuse/AreasItem.java
rename to src/ac/ed/lurg/landuse/LandUseItem.java
index 2056c57074fd8a46ca9a8b2b152cf19455b73cef..699025e1ce663a3588781e2e79682926bf3863ad 100644
--- a/src/ac/ed/lurg/landuse/AreasItem.java
+++ b/src/ac/ed/lurg/landuse/LandUseItem.java
@@ -1,5 +1,6 @@
 package ac.ed.lurg.landuse;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -9,14 +10,108 @@ import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.LandCoverType;
 import ac.sac.raster.InterpolatingRasterItem;
 
-/*
- * Data for one year and country, but it does not know which one
- */
-public class AreasItem implements InterpolatingRasterItem<AreasItem> {
+public class LandUseItem implements InterpolatingRasterItem<LandUseItem> {
 
+	private Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>();
 	private Map<CropType, Double> cropFractions = new HashMap<CropType, Double>();
 	private Map<LandCoverType, Double> landCoverAreas = new HashMap<LandCoverType, Double>();
 	
+	public Intensity getIntensity(CropType crop) {
+		return intensityMap.get(crop);
+	}
+	
+	public void setIntensity(CropType crop, Intensity intensityData) {
+		intensityMap.put(crop, intensityData);
+	}
+	
+	/** Fertiliser rate in kg/ha */
+	public double getFertiliserRate(CropType crop) {
+		Intensity i = getIntensity(crop);
+		return (i == null) ? 0 : i.getFertiliserAmount();
+	}
+	
+	/** Fertiliser amount in kt (1000 tonnes), for this location */
+	public double getFertiliserAmount(CropType c) {
+		double rate = getFertiliserRate(c);
+		double area = getCropArea(c);
+		return rate * area;
+	}
+	
+	public double getFertiliserAverageRate(CropType... crops) {
+		double fertTotal = 0;
+		double areaTotal = 0;
+		
+		for (CropType c : crops) {
+			fertTotal += getFertiliserAmount(c);
+			areaTotal = getCropArea(c);
+		}
+		
+		return areaTotal > 0 ? fertTotal / areaTotal : 0;
+	}
+
+	
+	public static double getFertiliserTotal(Collection<? extends LandUseItem> items, CropType... crops) {			
+		double total = 0;
+		for (LandUseItem a : items) {
+			if (a == null)
+				continue;
+			
+			for (CropType c : crops)
+				total += a.getFertiliserAmount(c);
+		}
+			
+		return total;
+	}
+
+	public static double getFertiliserTotal(Collection<? extends LandUseItem> items, Collection<CropType> crops) {
+		return getFertiliserTotal(items, crops.toArray(new CropType[crops.size()]));
+	}
+
+	/** Irrigation rate in litre/ha */
+	public double getIrrigationRate(CropType crop) {
+		Intensity i = getIntensity(crop);
+		
+		return (i == null) ? 0 : i.getIrrigationRate(999);
+	}
+
+	/** Irrigation amount in M litres, for this location */
+	public double getIrrigationAmount(CropType c) {
+		double rate = getIrrigationRate(c);
+		double area = getCropArea(c);
+		return rate * area;
+	}
+
+	public double getIrrigationAverageRate(CropType... crops) {
+		double irrigTotal = 0;
+		double areaTotal = 0;
+		
+		for (CropType c : crops) {
+			irrigTotal += getIrrigationAmount(c);
+			areaTotal = getCropArea(c);
+		}
+		
+		return areaTotal > 0 ? irrigTotal / areaTotal : 0;
+	}
+	
+	public static double getIrrigationTotal(Collection<? extends LandUseItem> items, CropType... crops) {			
+		double total = 0;
+		for (LandUseItem a : items) {
+			if (a == null)
+				continue;
+			
+			for (CropType c : crops)
+				total += a.getIrrigationAmount(c);
+		}
+			
+		return total;
+	}
+
+	public static double getIrrigationTotal(Collection<? extends LandUseItem> items, Collection<CropType> crops) {
+		return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()]));
+	}
+	
+	
+
 	public void setLandCoverAreas(LandCoverItem landCover) {
 		if (landCover != null) {
 			for (LandCoverType lcType : LandCoverType.values())
@@ -24,7 +119,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> {
 		}
 	}
 	
-	public void setLandCoverAreas(AreasItem otherAreasItem) {
+	public void setLandCoverAreas(LandUseItem otherAreasItem) {
 		for (Entry<LandCoverType, Double> entry : otherAreasItem.landCoverAreas.entrySet()) {
 			landCoverAreas.put(entry.getKey(), entry.getValue());
 		}
@@ -105,7 +200,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> {
 		return (Double.isNaN(d) || Double.isInfinite(d)) ? 1.0 : d;
 	}
 
-	public CropToDouble getCropChanges(AreasItem prevAreaAggItem) {
+	public CropToDouble getCropChanges(LandUseItem prevAreaAggItem) {
 		CropToDouble changes = new CropToDouble();
 		
 		for (CropType c : CropType.getCropsLessPasture()) {
@@ -117,7 +212,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> {
 	}
 
 	@Override
-	public void interpolateAll(AreasItem fromItem, AreasItem toItem, double factor) {		
+	public void interpolateAll(LandUseItem fromItem, LandUseItem toItem, double factor) {		
 		cropFractions = new HashMap<CropType, Double>();
 		landCoverAreas = new HashMap<LandCoverType, Double>();
 
@@ -149,12 +244,13 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> {
 		return res;
 	}
 	
-	public static double getTotalLandCover(Map<?, ? extends AreasItem> areaRaster, LandCoverType landCover) {
+	public static double getTotalLandCover(Map<?, ? extends LandUseItem> areaRaster, LandCoverType landCover) {
 		double total = 0;
-		for (AreasItem a : areaRaster.values()) {
+		for (LandUseItem a : areaRaster.values()) {
 			total += a.getLandCoverArea(landCover);
 		}
 			
 		return total;
 	}
+
 }
diff --git a/src/ac/ed/lurg/output/LpjgOutputer.java b/src/ac/ed/lurg/output/LpjgOutputer.java
index 27e6290d3c0f227e9509d1ed35d974259cc00913..219c8901d23a42c844f3c365e3770cbebbca6c27 100644
--- a/src/ac/ed/lurg/output/LpjgOutputer.java
+++ b/src/ac/ed/lurg/output/LpjgOutputer.java
@@ -8,8 +8,7 @@ import java.io.IOException;
 import java.util.Map.Entry;
 
 import ac.ed.lurg.ModelConfig;
-import ac.ed.lurg.landuse.AreasItem;
-import ac.ed.lurg.landuse.IntensitiesItem;
+import ac.ed.lurg.landuse.LandUseItem;
 import ac.ed.lurg.types.CropType;
 import ac.ed.lurg.types.LandCoverType;
 import ac.ed.lurg.utils.LogWriter;
@@ -20,15 +19,13 @@ import ac.sac.raster.RasterSet;
 
 public class LpjgOutputer {
 
-	private RasterSet<IntensitiesItem> intensityRaster;
-	private RasterSet<AreasItem> cropAreaRaster;
+	private RasterSet<LandUseItem> intensityRaster;
 	private YieldRaster yieldSurfaces;
 	private int year;
 
-	public LpjgOutputer(int year, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, YieldRaster yieldSurfaces) {
+	public LpjgOutputer(int year, RasterSet<LandUseItem> intensityRaster, YieldRaster yieldSurfaces) {
 		this.year = year;
 		this.intensityRaster = intensityRaster;
-		this.cropAreaRaster = cropAreaRaster;
 		this.yieldSurfaces = yieldSurfaces;
 	}
 
@@ -62,15 +59,15 @@ public class LpjgOutputer {
 			fertWriter.write("Lon Lat TeWWirr TeSWirr TeCoirr TrRiirr Pasture");
 			irrigWriter.newLine();
 
-			for (Entry<RasterKey, IntensitiesItem> entry : intensityRaster.entrySet()) {
+			for (Entry<RasterKey, LandUseItem> entry : intensityRaster.entrySet()) {
 				RasterKey key = entry.getKey();
-				IntensitiesItem item = entry.getValue();
+				LandUseItem item = entry.getValue();
 				
 				if (item == null)
 					continue;
 				
-				double lat = cropAreaRaster.getXCoordin(key);
-				double lon = cropAreaRaster.getYCoordin(key);
+				double lat = intensityRaster.getXCoordin(key);
+				double lon = intensityRaster.getYCoordin(key);
 				boolean isSpringWheat = isSpringWheat(key);
 
 				double winterWheatIrrig = item.getIrrigationAverageRate(CropType.OILCROPS, isSpringWheat ? null : CropType.WHEAT);
@@ -153,13 +150,13 @@ public class LpjgOutputer {
 			cropFractWriter.write("Lon Lat TeWWirr TeSWirr TeCoirr TrRiirr");
 			cropFractWriter.newLine();
 
-			for (Entry<RasterKey, AreasItem> entry : cropAreaRaster.entrySet()) {
+			for (Entry<RasterKey, LandUseItem> entry : intensityRaster.entrySet()) {
 				RasterKey key = entry.getKey();
-				AreasItem item = entry.getValue();
-				double lat = cropAreaRaster.getXCoordin(key);
-				double lon = cropAreaRaster.getYCoordin(key);
+				LandUseItem item = entry.getValue();
+				double lat = intensityRaster.getXCoordin(key);
+				double lon = intensityRaster.getYCoordin(key);
 
-				double expectedArea = cropAreaRaster.getAreaMha(key);
+				double expectedArea = intensityRaster.getAreaMha(key);
 				double area = item.getTotalLandCoverArea();
 				
 				if (area > 0 && Math.abs((expectedArea-area)/expectedArea) > 0.01) {  // zero area, due to data not being found, already reported so ignored here