diff --git a/org.eclipse.stem.internal.data/src/org/eclipse/stem/internal/data/utility/CountryLvl0BorderGenerator.java b/org.eclipse.stem.internal.data/src/org/eclipse/stem/internal/data/utility/CountryLvl0BorderGenerator.java
new file mode 100644
index 0000000..b33e665
--- /dev/null
+++ b/org.eclipse.stem.internal.data/src/org/eclipse/stem/internal/data/utility/CountryLvl0BorderGenerator.java
@@ -0,0 +1,233 @@
+package org.eclipse.stem.internal.data.utility;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+
+/**
+ * This class generates Admin Level 0 (country level) common borders.
+ * it derives them from the existing higher resolution border property files.
+ *
+ */
+public class CountryLvl0BorderGenerator {
+
+	
+		// get the path
+		private static final String sep = File.separator;
+		/**
+		 * the output path
+		 */
+		public static String outputPath;
+		/** 
+		 * location of existing files
+		 */
+		private static String commonBorderPath ;
+		
+		private static Map<String,String> borderElementMap = new HashMap<String,String>();
+		private static Map<String,Double> borderValueMap = new HashMap<String,Double>();
+		
+	/**
+	 * finds and returns the path to the existing property files
+	 * @return path to common border files
+	 */
+	public static String getCommonBorderPath() {
+		 URL location = CountryLvl0BorderGenerator.class.getProtectionDomain().getCodeSource().getLocation();
+	     String path0 = location.getFile().toString();
+		 int tail = path0.indexOf("bin");
+		 path0 = path0.substring(0, tail);
+		 path0 = path0.replaceAll("org.eclipse.stem.data"+sep, "org.eclipse.stem.data"+sep+"geography"+sep);
+		 path0 = path0.replaceAll("org.eclipse.stem.internal.data", "org.eclipse.stem.internal.data.geography");
+		 path0 = path0+"resources"+sep+"data"+sep+"relationship"+sep+"commonborder"+sep;
+		 outputPath = path0+"level0_files_test_output"+sep;
+		 commonBorderPath = path0;
+		 return path0;
+	}
+	
+	
+	/**
+	 * Generates everything
+	 */
+	@SuppressWarnings("unused")
+	public static void generateLvl0PropertyFiles() {
+		String path0 = getCommonBorderPath();
+
+		File dir = new File(path0);
+		System.out.println("" + dir.toString());
+		if (dir.isDirectory()) {
+			File[] fileList = dir.listFiles();
+			for (File f : fileList) {
+				String shortName = f.getName();
+				// the countries are already in alphabetic order
+				String ctry1 = shortName.substring(0, 3);
+				String ctry2 = shortName.substring(6, 9);
+				
+				double borderLength  = 0.0;
+				try {
+
+					// System.out.println("["+ctry1+"] , [" + ctry2+"]");
+					if (!ctry1.equals(ctry2)) {
+						
+						// not the same country
+						//System.out.println("" + shortName);
+						// remember the headerLines in the original file
+						List<String> headerLines = new ArrayList<String>();
+						
+						// 1. sum the border lengths
+						if (shortName.indexOf(".properties") >= 1) {
+							BufferedReader fileReader = new BufferedReader(new FileReader(f));
+
+							// Add all the source URLs for this country.
+							if (fileReader != null) {
+								String buffer = null;
+								while (EOF(buffer = fileReader.readLine()) != true) {
+									StringTokenizer tokenizer = new StringTokenizer(buffer, ","); //$NON-NLS-1$
+									if (tokenizer.countTokens() >= 3) {
+										String part1 = tokenizer.nextToken().trim();
+										String part2 = tokenizer.nextToken().trim();
+										String part3 = tokenizer.nextToken().trim();
+										borderLength += (new Double(part3)).doubleValue();
+										//System.out.println("" + buffer);
+									} else {
+										headerLines.add(buffer);
+									}
+								}
+							}// filereader ! null
+							fileReader.close();
+						}// properties file
+						
+						//System.out.println("" + shortName + "  length = "+borderLength);
+						
+						String fileNameKey = ctry1+"_0_"+ctry2+"_0.properties";
+						// eg 0=USA,MEX,   then double
+						String nameElement = "0="+ctry1+","+ctry2+",";
+						if(borderValueMap.containsKey(fileNameKey)) {
+							double oldVal = borderValueMap.get(fileNameKey).doubleValue();
+							if(borderLength > oldVal) {
+								borderValueMap.put(fileNameKey, new Double(borderLength)); // take the larger value if there are more than one
+							}
+						} else {
+							borderElementMap.put(fileNameKey,nameElement);
+							borderValueMap.put(fileNameKey, new Double(borderLength));
+						}
+					} // if not same country
+
+				} catch (Exception e) {
+					System.out.println("error reading file " + shortName + " "+ e.getMessage());
+					e.printStackTrace();
+				}
+				 
+			}// for Files
+		}// if Dir
+		
+		writeLevel0Files();
+		
+	}
+	
+	/**
+	 * 	writes the files
+	 */
+	public static void writeLevel0Files()	 {
+		Set<String> filenameSet = borderElementMap.keySet();
+		
+		File outDir = new File(outputPath);
+		  // if the directory does not exist, create it
+		  if (!outDir.exists()) {
+		    System.out.println("creating directory: " + outputPath);
+		    try{
+		        outDir.mkdir();
+		        
+		     } catch(SecurityException se){
+		        System.out.println("failed to create directory "+se.getMessage());
+		        System.exit(0);
+		     }        
+		  }
+		
+		int idx = outputPath.indexOf("org.eclipse.stem.data");
+		String commentPath = ".."+sep+commonBorderPath.substring(idx, commonBorderPath.length());
+		 
+		for(String fileName:filenameSet) {
+		
+			String ctry1 = fileName.substring(0, 3);
+			String ctry2 = fileName.substring(6, 9);
+			
+			try {
+				OutputStream os = null;
+				try {
+					final File fn = new File(outputPath+fileName);
+					os = new FileOutputStream(fn, false);
+					String title = "Common Border relationship [LVL=0] between country "	+ ctry1 + " and " + ctry2 ;
+					
+					String comments = "# " + "\n" + "#  File generated from:"
+							+ "\n" + "#   " + commentPath + ctry1 + "/" + ctry1 
+							+ "\n" + "#   " + commentPath + ctry2 + "/" + ctry2 
+							+ "\n" + "#\n" + "#  Generated by: "
+							+ CountryLvl0BorderGenerator.class + "\n" + "# " + "\n";
+					
+					os.write(comments.getBytes());
+					String property = "RECORD_CLASSNAME = org.eclipse.stem.internal.data.geography.specifications.CommonBorderGeographicRelationshipPropertyFileSpecification"
+							+ "\n";
+					os.write(property.getBytes());
+					property = "TITLE = " + title + "\n";
+					os.write(property.getBytes());
+					property = "VALID = start=2006-01-01;" + "\n";
+					os.write(property.getBytes());
+					
+					String keyInfo = "ISOKEY_0 = " + ctry1 + "\n";
+					keyInfo += "ISOKEY_0_LEVEL = 0" + "\n";
+					keyInfo += "ISOKEY_1 = " + ctry2 + "\n";
+					keyInfo += "ISOKEY_1_LEVEL = 0" + "\n";
+					os.write(keyInfo.getBytes());
+					
+					String name = borderElementMap.get(fileName);
+					String value = ""+borderValueMap.get(fileName).doubleValue();
+					String s = name+value;
+					os.write(s.getBytes());
+					os.flush();
+					os.close();
+				} catch (final FileNotFoundException e) {
+					e.printStackTrace();
+				}
+			} catch (final IOException e) {
+				e.printStackTrace();
+			}	
+		}// for all files
+	}
+	
+	
+	
+
+
+/**
+ * Indicate End-Of-File
+ * 
+ * @param buffer
+ *            A buffer of diva data
+ * 
+ * @return True if we have reached End-Of-File
+ */
+static protected boolean EOF(String buffer) {
+	if (buffer == null || buffer.length() == 0)
+		return true;
+	return false;
+}
+	
+	/**
+	 * @param args
+	 */
+	@SuppressWarnings("nls")
+	public static void main(String[] args) {
+		generateLvl0PropertyFiles();
+	}
+}
