diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index efd08059cd1e485c25d9e2d3a8fd7ce828b84d66..2ce1ffb0a62bff676d34162ec3b49d97cc49dd6a 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -274,16 +274,8 @@ public class ModelMain {
 	}
 
 	private RasterSet<LandCoverItem> getInitialLandCover() {
-
 		LandCoverReader lcReader = new LandCoverReader(desiredProjection);
 		RasterSet<LandCoverItem>  initLC = lcReader.getRasterDataFromFile(ModelConfig.INITAL_LAND_COVER_FILE);
-		
-		// scale all fractional areas read in by the actual area
-		for (Entry<RasterKey, LandCoverItem> entry : initLC.entrySet()) {
-			double cellArea = initLC.getAreaMha(entry.getKey());
-			entry.getValue().scaleAll(cellArea);
-		}
-
 		return initLC;
 	}
 
diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/AreasItem.java
index 6a24ed18a351b057cc5c74c55b524779a17e90b6..a59a49d866377081354ba1b3ce0cc56435c567f7 100644
--- a/src/ac/ed/lurg/landuse/AreasItem.java
+++ b/src/ac/ed/lurg/landuse/AreasItem.java
@@ -20,7 +20,7 @@ public class AreasItem implements RasterItem {
 	public void setLandCoverAreas(LandCoverItem landCover) {
 		if (landCover != null) {
 			for (LandCoverType lcType : LandCoverType.values())
-				landCoverAreas.put(lcType, landCover.getLandCover(lcType));
+				landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType));
 		}
 	}
 	
diff --git a/src/ac/ed/lurg/landuse/LandCoverItem.java b/src/ac/ed/lurg/landuse/LandCoverItem.java
index 0ff7f0c40cdb7692c9a37b6036f084121c66a901..828984e7c5fbd5c9f129628281f32ef725d0dfcf 100644
--- a/src/ac/ed/lurg/landuse/LandCoverItem.java
+++ b/src/ac/ed/lurg/landuse/LandCoverItem.java
@@ -2,7 +2,6 @@ package ac.ed.lurg.landuse;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import ac.ed.lurg.types.LandCoverType;
 import ac.sac.raster.RasterItem;
@@ -11,24 +10,33 @@ import ac.sac.raster.RasterItem;
  *  This is used in the initalisation phase, after that land-use is used */
 public class LandCoverItem implements RasterItem {
 	
-	Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>();
-
+	private Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>();
+	private double totalArea;
+	
 	/** Area in Mha */ 
-	public Double getLandCover(LandCoverType landType) {
-		return landcover.get(landType);
+	public Double getLandCoverArea(LandCoverType landType) {
+		return getLandCoverFract(landType) * totalArea;
 	}
-
-	public void setLandCover(LandCoverType landType, double d) {
-		landcover.put(landType, d);
+	
+	public Double getLandCoverFract(LandCoverType landType) {
+		Double d = landcover.get(landType);
+		return d==null ? 0 : d.doubleValue();
 	}
 	
-	public void scaleAll(double factor) {
-		for (Entry<LandCoverType, Double> entry : landcover.entrySet()) {
-			landcover.put(entry.getKey(), entry.getValue() * factor);
-		}
+	/** Area in Mha */ 
+	public double getTotalArea() {
+		return totalArea;
+	}
 
+	/** Area in Mha */ 
+	public void setTotalArea(double totalArea) {
+		this.totalArea = totalArea;
+	}
+	
+	public void setLandCoverFract(LandCoverType landType, double d) {
+		landcover.put(landType, d);
 	}
-		
+			
 	/*public double getTotal() {
 		double total = 0;
 		for (double d : landcover.values()) {
@@ -36,4 +44,4 @@ public class LandCoverItem implements RasterItem {
 		}
 		return total;
 	}*/
-}
+}
\ No newline at end of file
diff --git a/src/ac/ed/lurg/landuse/LandCoverReader.java b/src/ac/ed/lurg/landuse/LandCoverReader.java
index 4eb7022c6f776654a8af76e5abf4ef854f7480d8..3253f6d829ef1c52647dab1b819106f7ffb94efd 100644
--- a/src/ac/ed/lurg/landuse/LandCoverReader.java
+++ b/src/ac/ed/lurg/landuse/LandCoverReader.java
@@ -7,18 +7,20 @@ import java.io.IOException;
 import ac.ed.lurg.types.LandCoverType;
 import ac.ed.lurg.utils.LogWriter;
 import ac.sac.raster.RasterHeaderDetails;
+import ac.sac.raster.RasterKey;
 import ac.sac.raster.RasterSet;
 
 public class LandCoverReader {	
 
 	private static int X_COL = 0;
 	private static int Y_COL = 1;
-	private static int CROPLAND_COL = 2;
-	private static int PASTURE_COL = 3;
-	private static int NATURAL_COL = 4;
-	private static int BARREN_COL = 5;
 
 	private RasterSet<LandCoverItem> dataset;
+	
+	private int croplandCol = 2;
+	private int pastureCol = 3;
+	private int naturalCol = 4;
+	private int barrenCol = 5;
 
 	public LandCoverReader (RasterHeaderDetails rasterProj) {
 		dataset = new RasterSet<LandCoverItem> (rasterProj) {
@@ -31,31 +33,49 @@ public class LandCoverReader {
 	}
 	
 	private String[] parseLine(String line) {
-		return line.split(" +");
+		return line.trim().split(" +");
 	}
-
+	
+	private boolean handleHeader(String[] headertokens) throws IOException {
+		if (headertokens.length < 6) {
+			LogWriter.printlnError("Too few columns");
+			return false;
+		}
+		croplandCol = findColIndex(headertokens, "CROPLAND");
+		pastureCol = findColIndex(headertokens, "PASTURE");
+		naturalCol = findColIndex(headertokens, "NATURAL");
+		barrenCol = findColIndex(headertokens, "BARREN");
+		
+		return true;
+	}
+	
+	private int findColIndex(String[] headertokens, String colName) {
+		for (int i=0; i<headertokens.length; i++) {
+			if (headertokens[i].toUpperCase().equals(colName)) {
+				return i;
+			}
+		}
+		
+		throw new RuntimeException("Can't find colName " + colName);
+	}
+	
 	public RasterSet<LandCoverItem> getRasterDataFromFile(String filename) {
 		long startTime = System.currentTimeMillis();
 
 		BufferedReader in = null;
 		try {
 			in = new BufferedReader(new FileReader(filename));
-			String line;
-			int row = 0;
+			String line = in.readLine(); // read header
+			boolean headOk = handleHeader(parseLine(line));
 
-			while ((line=in.readLine()) != null) {
-				String[] tokens = parseLine(line.trim());
+			if (!headOk) {
+				LogWriter.printlnError("Problems reading head " + filename);
+				throw new RuntimeException("Too few columns in " + filename);
+			}
 
-				if (tokens.length < 6) {
-					LogWriter.printlnError("Too few columns in " + filename);
-					throw new RuntimeException("Too few columns in " + filename + "(row " + row + ")");
-				}
-				
-				if (row == 0) {
-					row++;
-					continue;
-				}
-				
+			while ((line=in.readLine()) != null) {
+				String[] tokens = parseLine(line);
+								
 				double[] colValues = new double[tokens.length];
 				for (int i=0; i<tokens.length; i++) {
 					double d = Double.parseDouble(tokens[i]);
@@ -63,13 +83,13 @@ public class LandCoverReader {
 				}
 				
 				LandCoverItem lcData = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]);
-		//		lcData.setArea(dataset.getAreaMha(entry.getKey()));
+				RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]);
+				lcData.setTotalArea(dataset.getAreaMha(key));		
 				
-				lcData.setLandCover(LandCoverType.CROPLAND, colValues[CROPLAND_COL]);
-				lcData.setLandCover(LandCoverType.PASTURE, colValues[PASTURE_COL]);
-				lcData.setLandCover(LandCoverType.OTHER_NATURAL, colValues[NATURAL_COL]);
-				lcData.setLandCover(LandCoverType.BARREN, colValues[BARREN_COL]);
-				row++;
+				lcData.setLandCoverFract(LandCoverType.CROPLAND, colValues[croplandCol]);
+				lcData.setLandCoverFract(LandCoverType.PASTURE, colValues[pastureCol]);
+				lcData.setLandCoverFract(LandCoverType.OTHER_NATURAL, colValues[naturalCol]);
+				lcData.setLandCoverFract(LandCoverType.BARREN, colValues[barrenCol]);
 			}
 			
 			in.close();
diff --git a/src/ac/sac/raster/RasterSet.java b/src/ac/sac/raster/RasterSet.java
index c67d7ebb9f9b04e1227253f22a4ae52ac7e5c4a6..5eb3820dfce3963cc30f567e76f36842986cf2da 100755
--- a/src/ac/sac/raster/RasterSet.java
+++ b/src/ac/sac/raster/RasterSet.java
@@ -56,6 +56,11 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
 
 	/** Method to get raster item for coordinates */
 	public D getFromCoordinates(double source_x, double source_y) {
+		RasterKey key = getKeyFromCoordinates(source_x, source_y);
+		return get(key.getCol(), key.getRow());   // can't just call get(key) as may need to create the RasterItem
+	}
+	
+	public RasterKey getKeyFromCoordinates(double source_x, double source_y) {
 		int col = (int) Math.round((source_x - header.getXllCorner())/header.getXCellSize());
 		
 		// header.getNrows() - 1, lower left basis.  Minus 1 as nrows is number, but indexed from zero
@@ -64,8 +69,9 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
 		if (row < 0 || col < 0) {
 			LogWriter.println("Got negative values");
 		}
-		return get(col, row);
+		return new RasterKey(col, row);
 	}
+
 	
 	public double getXCoordin(RasterKey key) {
 		double x = header.getXCellSize() * key.getCol() + header.getXllCorner();
@@ -82,6 +88,11 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
 		return y;
 	}
 
+// get the RasterItem if it already exists
+//    public D get(RasterKey key) {
+//		return get(key);
+//	}
+	
 	/** Method to really get the data, or create it. Assumes the col and row are in the internal header format */
 	public D get(int col, int row) {
 		if (header.getNcolumns() < col+1)