diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java
index 2176b2fe1fc1f1f531340e5622340dfae40feb89..384ea68390ae1cf78561290857a839d6d052bdcd 100755
--- a/src/ac/ed/lurg/ModelConfig.java
+++ b/src/ac/ed/lurg/ModelConfig.java
@@ -392,8 +392,8 @@ public class ModelConfig {
 	public static final boolean FORCE_PROTECTED_AREAS = IS_CALIBRATION_RUN ? false : getBooleanProperty("FORCE_PROTECTED_AREAS", false);
 	public static final int FORCE_PROTECTED_AREAS_START_YEAR  = getIntProperty("FORCE_PROTECTED_AREAS_START_YEAR", 2020);
 	public static final int FORCE_PROTECTED_AREAS_END_YEAR  = getIntProperty("FORCE_PROTECTED_AREAS_END_YEAR", 2050);
-	
+	public static final double CONSTANT_PROTECTED_AREA_RATE = getDoubleProperty("CONSTANT_PROTECTED_AREA_RATE", Double.NaN);
+
 	public static final boolean USE_CRAFTY_COUNTRIES = getBooleanProperty("USE_CRAFTY_COUNTRIES", false);
-	public static final String CRAFTY_PRODUCTION_DIR = getProperty("CRAFTY_PRODUCTION_DIR", OUTPUT_DIR + File.separator + "crafty");
-	
+	public static final String CRAFTY_PRODUCTION_DIR = getProperty("CRAFTY_PRODUCTION_DIR", OUTPUT_DIR + File.separator + "crafty");	
 }
diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index 6f1cd5bc06533247c048f84c9a5d6b437211434c..052f7b514a20f0d8826d700b30f306e01ff30d80 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -487,10 +487,14 @@ public class ModelMain {
 	}
 
 	private RasterSet<LandUseItem> getInitialLandUse() {
+		RasterSet<LandUseItem> initialLU;
 		if (ModelConfig.IS_CALIBRATION_RUN)
-			return getLandUseFromBaseline();
+			initialLU = getLandUseFromBaseline();
 		else
-			return deserializeLandUse();
+			initialLU = deserializeLandUse();
+		
+		new ProtectedAreasReader(initialLU).getRasterDataFromFile(ModelConfig.PROTECTED_AREAS_FILE);
+		return initialLU;
 	}
 
 	private void serializeLandUse(RasterSet<LandUseItem> landUseRaster) {
@@ -539,23 +543,13 @@ public class ModelMain {
 			}
 		};
 
-		new ProtectedAreasReader(initialLC).getRasterDataFromFile(ModelConfig.PROTECTED_AREAS_FILE);
 		new MaxCropAreaReader(initialLC).getRasterDataFromFile(ModelConfig.HIGH_SLOPE_AREAS_FILE);
 		new LandCoverReader(initialLC).getRasterDataFromFile(ModelConfig.INITAL_LAND_COVER_FILE);
 
 		RasterSet<LandUseItem> landUseRaster = new RasterSet<LandUseItem>(initialLC.getHeaderDetails());
 
-		for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet()) {
-			LandUseItem areasItem = new LandUseItem();
-			RasterKey key = entry.getKey();
-			LandCoverItem landCover = entry.getValue();
-			areasItem.setLandCoverAreas(landCover);
-			areasItem.setCropFraction(CropType.WHEAT, 0.5); // random start as don't have better data
-			areasItem.setCropFraction(CropType.MAIZE, 0.5);
-			areasItem.setProtectedArea(landCover.getProtectedArea());
-			areasItem.setUnavailableFract(landCover.getUnavailableFract());
-			landUseRaster.put(key, areasItem);
-		}
+		for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet())
+			landUseRaster.put(entry.getKey(), new LandUseItem(entry.getValue()));
 
 		return landUseRaster;
 	}
diff --git a/src/ac/ed/lurg/landuse/LandCoverItem.java b/src/ac/ed/lurg/landuse/LandCoverItem.java
index 0c8ad94f4c2d543c60ec388599bce4e0f4d6e63c..bade97744ba7b3b82618fc726d36af27416124ba 100644
--- a/src/ac/ed/lurg/landuse/LandCoverItem.java
+++ b/src/ac/ed/lurg/landuse/LandCoverItem.java
@@ -12,7 +12,6 @@ public class LandCoverItem implements RasterItem {
 	
 	private Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>();
 	private double totalArea;
-	private double proportionProtectedFract;
 	private double unavailableFract; // due to slope
 
 	/** Area in Mha */ 
@@ -39,14 +38,6 @@ public class LandCoverItem implements RasterItem {
 		landcover.put(landType, d);
 	}
 	
-	public void setProtectedFract(double proportionProtectedFract){
-		this.proportionProtectedFract=proportionProtectedFract;
-	}
-	
-	public double getProtectedArea(){ 
-		return proportionProtectedFract*totalArea;
-	}
-	
 	public double getUnavailableFract(){
 		return unavailableFract;
 	}
diff --git a/src/ac/ed/lurg/landuse/LandUseItem.java b/src/ac/ed/lurg/landuse/LandUseItem.java
index b933746bbcedcc12bf0c9640087a60168538d5ff..5be76b1516dd86b60ad4af2da99a893333bf38df 100644
--- a/src/ac/ed/lurg/landuse/LandUseItem.java
+++ b/src/ac/ed/lurg/landuse/LandUseItem.java
@@ -23,6 +23,18 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial
 	
 	public LandUseItem() {}
 	
+	public LandUseItem(LandCoverItem landCover) {
+		this();
+		if (landCover != null) {
+			for (LandCoverType lcType : LandCoverType.values())
+				landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType));
+			
+			setCropFraction(CropType.WHEAT, 0.5); // random start as don't have better data
+			setCropFraction(CropType.MAIZE, 0.5);
+			setUnavailableFract(landCover.getUnavailableFract());
+		}
+	}
+	
 	public LandUseItem(LandUseItem luItemToCopy) {
 		this();
 		intensityMap.putAll(luItemToCopy.intensityMap);
@@ -31,7 +43,14 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial
 		protectedArea = (luItemToCopy.protectedArea);
 	}
 	
-	public void setProtectedArea(double protectedArea){
+	public void setProtectedFract(double protFrac) {
+		if (!Double.isNaN(ModelConfig.CONSTANT_PROTECTED_AREA_RATE))
+			protFrac=ModelConfig.CONSTANT_PROTECTED_AREA_RATE;
+		
+		this.protectedArea = protFrac*getTotalLandCoverArea();
+	}
+
+	public void setProtectedArea(double protectedArea) {
 		this.protectedArea = protectedArea;
 	}
 	
@@ -152,15 +171,6 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial
 		return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()]));
 	}
 	
-	
-
-	public void setLandCoverAreas(LandCoverItem landCover) {
-		if (landCover != null) {
-			for (LandCoverType lcType : LandCoverType.values())
-				landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType));
-		}
-	}
-
 	/** move areas from one land cover to another, return any residual not possible */
     public double moveAreas(LandCoverType toType, LandCoverType fromType, double changeReq) {
 
@@ -284,7 +294,7 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial
 			double proportion = 1;
 			
 			if (year < ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR)
-				proportion = 1.0 / (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - year);
+				proportion = 1.0 - (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - year) / (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - ModelConfig.FORCE_PROTECTED_AREAS_START_YEAR);
 			
 			suitable = Math.max(0, currentAgri + natAvailForAgri * proportion); // netNatAvailForAgri is negative, but suitable area < 0 is not sensible (seems to happen with high barren areas)
 		}
diff --git a/src/ac/ed/lurg/landuse/ProtectedAreasReader.java b/src/ac/ed/lurg/landuse/ProtectedAreasReader.java
index d036f47f3bd85a2e30d84e6ca13c71ca37fbb6d3..dcf8ca6a17a83adf660fa8be887179d8621b0ac4 100644
--- a/src/ac/ed/lurg/landuse/ProtectedAreasReader.java
+++ b/src/ac/ed/lurg/landuse/ProtectedAreasReader.java
@@ -3,18 +3,17 @@ package ac.ed.lurg.landuse;
 import ac.sac.raster.AbstractRasterReader;
 import ac.sac.raster.RasterSet;
 
-public class ProtectedAreasReader extends AbstractRasterReader<LandCoverItem> {	
+public class ProtectedAreasReader extends AbstractRasterReader<LandUseItem> {	
 	
-	public ProtectedAreasReader (RasterSet<LandCoverItem> dataset) {
+	public ProtectedAreasReader (RasterSet<LandUseItem> dataset) {
 		super(dataset);
 	}
 
 	@Override
-	public void setData(LandCoverItem lcData, String token) {
+	public void setData(LandUseItem lcData, String token) {
 		if (!"nan".equals(token)) {	
 			double protFrac = Double.parseDouble(token);
 			lcData.setProtectedFract(protFrac);
 		}
 	}	
-	
 }
\ No newline at end of file