diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath b/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore b/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore
new file mode 100644
index 0000000..9c595a6
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.cvsignore
@@ -0,0 +1 @@
+temp
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.project b/population/org.eclipse.stem.internal.data.geography.population.human.models/.project
new file mode 100644
index 0000000..744c012
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.stem.internal.data.geography.population.human.models</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs b/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a812aa
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,21 @@
+#Tue Sep 01 17:01:23 EDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.doc.comment.support=disabled
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF b/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..727cca1
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: STEM Internal Population Models
+Bundle-SymbolicName: org.eclipse.stem.internal.data.geography.population.human.models
+Bundle-Version: 1.2.0
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.stem.core,
+ org.eclipse.stem.definitions,
+ org.eclipse.stem.data.geography,
+ org.eclipse.stem.data.geography.models,
+ org.eclipse.stem.internal.data,
+ org.eclipse.stem.internal.data.geography,
+ org.eclipse.stem.internal.data.geography.models,
+ org.eclipse.stem.data.geography.population.human,
+ org.eclipse.stem.data.geography.population.human.models
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: Eclipse.org
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties b/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java
new file mode 100644
index 0000000..a1f7163
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelGenerator.java
@@ -0,0 +1,229 @@
+// PopulationModelGenerator.java
+package org.eclipse.stem.internal.data.geography.population.human.models;
+
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.stem.core.Constants;
+import org.eclipse.stem.data.geography.ISOKey;
+import org.eclipse.stem.internal.data.ModelGenerator;
+import org.eclipse.stem.internal.data.PluginFileGenerator;
+import org.eclipse.stem.internal.data.generatedplugin.DublinCore;
+import org.eclipse.stem.internal.data.generatedplugin.Extension;
+import org.eclipse.stem.internal.data.generatedplugin.GeneratedpluginFactory;
+import org.eclipse.stem.internal.data.generatedplugin.Plugin;
+import org.eclipse.stem.internal.data.generatedplugin.StemCategory;
+import org.eclipse.stem.internal.data.geography.models.GeographyModelGenerator;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevel;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevelSet;
+import org.eclipse.stem.internal.data.geography.specifications.CountryGraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.ModelSpecification;
+
+/**
+ * This class is responsible for generating population models.
+ */
+public class PopulationModelGenerator extends GeographyModelGenerator {
+	/**
+	 * @param args
+	 *            the URI of the generated geography plugin.xml file
+	 */
+	public static void main(final String[] args) {
+		// Is the plugin file specified?
+		if (args.length == 0) {
+			// Yes
+			System.err.println("Missing specification of the plugin file"); //$NON-NLS-1$
+		} // if
+		else {
+
+			final String GENERATED_FILES_PATH = args[0];
+			final String sourceGeographicModelProjecName = args[1];
+			final String sourcePopulationProjectName = args[2];
+
+			final String GENERATED_MODELS_PATH = GENERATED_FILES_PATH
+					+ File.separator + "resources" + File.separator + "data"; //$NON-NLS-1$ //$NON-NLS-2$
+
+			final File geographicModelPluginfile = new File(
+					".."	+ File.separator + sourceGeographicModelProjecName + File.separator + PluginFileGenerator.PLUGIN_XML_FILE_NAME); //$NON-NLS-1$
+			final URI geographicModelPluginFileURI = URI
+					.createFileURI(geographicModelPluginfile.getAbsolutePath());
+
+			final File populationPluginfile = new File(
+					".."	+ File.separator + sourcePopulationProjectName + File.separator + PluginFileGenerator.PLUGIN_XML_FILE_NAME); //$NON-NLS-1$
+			final URI populationPluginFileURI = URI
+					.createFileURI(populationPluginfile.getAbsolutePath());
+
+			final PopulationModelGenerator pmg = new PopulationModelGenerator();
+			final Map<ISOKey, List<PopulationModelSpecification>> modelSpecifications = pmg
+					.processFiles(geographicModelPluginFileURI,
+							populationPluginFileURI);
+
+			for (final ISOKey isoKey : sortISOKeys(modelSpecifications)) {
+				// Now serialize the Identifiables
+				for (final ModelSpecification gms : modelSpecifications
+						.get(isoKey)) {
+					try {
+						gms.serialize(GENERATED_MODELS_PATH);
+					} catch (final IOException e) {
+						e.printStackTrace();
+					}
+				} // for
+			} // for isoKey
+
+			// Create the instance of plugin.xml that we'll serialize later
+			final Plugin pluginxml = GeneratedpluginFactory.eINSTANCE
+					.createPlugin();
+			final Extension extension = GeneratedpluginFactory.eINSTANCE
+					.createExtension();
+
+			// Add the "model" extension point
+			extension.setPoint(Constants.ID_MODEL_EXTENSION_POINT);
+
+			// Add the categories to the extension
+//			addCatagoriesToExtension(extension);
+
+			pluginxml.getExtensionelement().add(extension);
+
+			// Now add the dublin core entries to the plugin.xml file for
+			// each of the models
+			for (final ISOKey isoKey : sortISOKeys(modelSpecifications)) {
+				final StemCategory countryCategory = GeneratedpluginFactory.eINSTANCE
+						.createStemCategory();
+				final String COUNTRY_CATAGORY_STRING = ID_MODEL_GEOGRAPHY_POLITICAL_COUNTRIES_CATEGORY
+						+ "." + isoKey.toString().toLowerCase(); //$NON-NLS-1$
+				countryCategory.setId(COUNTRY_CATAGORY_STRING);
+				countryCategory.setName(isoKey.toString());
+				countryCategory
+						.setParentId(ID_MODEL_GEOGRAPHY_POLITICAL_COUNTRIES_CATEGORY);
+//				extension.getCategories().add(countryCategory);
+				for (final ModelSpecification gms : modelSpecifications
+						.get(isoKey)) {
+					final DublinCore dc = GeneratedpluginFactory.eINSTANCE
+							.createDublinCore();
+					dc.setCategoryId(COUNTRY_CATAGORY_STRING);
+					extension.getDublinCores().add(
+							populateGeneratedDC(dc, gms.getDublinCore()));
+				} // for 
+			} // for isoKey
+
+			final URI TEMP_PLUGINXML_URI = URI
+					.createFileURI(GENERATED_FILES_PATH + File.separator
+							+ PluginFileGenerator.PLUGIN_XML_FILE_NAME);
+
+			// Serialize the plugin.xml file.
+			ModelGenerator.writePluginxml(pluginxml, TEMP_PLUGINXML_URI);
+
+			// Create the plugin.properties file
+			createPluginPropertties(GENERATED_FILES_PATH);
+
+		} // else
+	} // main
+
+	protected Map<ISOKey, List<PopulationModelSpecification>> processFiles(
+			URI geographicModelPluginFileUri, URI populationPluginFileUri) {
+		final Map<ISOKey, List<PopulationModelSpecification>> retValue = new HashMap<ISOKey, List<PopulationModelSpecification>>();
+
+		// Get the contents of the geography model plug.xml file
+		final Plugin geographyModelsPlugin = getPluginxml(geographicModelPluginFileUri);
+
+		final Plugin populationGraphsPlugin = getPluginxml(populationPluginFileUri);
+
+		final HashMap<ISOKey, Map<AdminLevelSet, DublinCore>> modelMap = new HashMap<ISOKey, Map<AdminLevelSet, DublinCore>>();
+		final Map<ISOKey, Map<AdminLevel, DublinCore>> populationMap = new HashMap<ISOKey, Map<AdminLevel, DublinCore>>();
+
+		for (Extension extension : geographyModelsPlugin.getExtensionelement()) {
+			for (DublinCore dc : extension.getDublinCores()) {
+				final Map<ISOKey, AdminLevelSet> isoKeyAdminLevelSetMap = CountryGraphPropertyFileSpecification
+						.parseDublinCoreCoverageString(dc.getCoverage());
+				final AdminLevelSet adminLevelSet = (AdminLevelSet) isoKeyAdminLevelSetMap
+						.values().toArray()[0];
+				final ISOKey isoKey = (ISOKey) isoKeyAdminLevelSetMap.keySet()
+						.toArray()[0];
+
+				Map<AdminLevelSet, DublinCore> temp = modelMap.get(isoKey);
+				if (temp == null) {
+					temp = new HashMap<AdminLevelSet, DublinCore>();
+					modelMap.put(isoKey, temp);
+				}
+				temp.put(adminLevelSet, dc);
+			} // for
+		} // for Geography Models
+
+		// for (ISOKey isoKey : sortISOKeys(modelMap)) {
+		// for (AdminLevel adminLevel : modelMap.get(isoKey).keySet() ) {
+		// System.out.println( isoKey + " " + adminLevel + " " +
+		// modelMap.get(isoKey).get(adminLevel).getIdentifier());
+		// }
+		// }
+
+		for (Extension extension : populationGraphsPlugin.getExtensionelement()) {
+			for (DublinCore dc : extension.getDublinCores()) {
+				final Map<ISOKey, AdminLevelSet> isoKeyAdminLevelSetMap = CountryGraphPropertyFileSpecification
+						.parseDublinCoreCoverageString(dc.getCoverage());
+				final AdminLevelSet adminLevelSet = (AdminLevelSet) isoKeyAdminLevelSetMap
+						.values().toArray()[0];
+				final AdminLevel maxAdminLevel = adminLevelSet
+						.getMaxAdminLevel();
+				final ISOKey isoKey = (ISOKey) isoKeyAdminLevelSetMap.keySet()
+						.toArray()[0];
+
+				Map<AdminLevel, DublinCore> temp = populationMap.get(isoKey);
+				if (temp == null) {
+					temp = new HashMap<AdminLevel, DublinCore>();
+					populationMap.put(isoKey, temp);
+				}
+				temp.put(maxAdminLevel, dc);
+			}
+		} // for Population Graphs
+
+		// for (ISOKey isoKey : sortISOKeys(populuationMap)) {
+		// for (AdminLevel adminLevel : populuationMap.get(isoKey).keySet() ) {
+		// System.out.println( isoKey + " " + adminLevel + " " +
+		// populuationMap.get(isoKey).get(adminLevel).getIdentifier());
+		// }
+		// }
+
+		for (ISOKey isoKey : sortISOKeys(modelMap)) {
+			final List<PopulationModelSpecification> gmsList = new ArrayList<PopulationModelSpecification>();
+
+			final Map<AdminLevelSet, DublinCore> adminSetDCMap = modelMap
+					.get(isoKey);
+			for (AdminLevelSet adminLevelSet : adminSetDCMap.keySet()) {
+				final AdminLevel maxAdminLevel = adminLevelSet
+						.getMaxAdminLevel();
+
+				final DublinCore countryGeographicModelDC = adminSetDCMap
+						.get(adminLevelSet);
+
+				final Map<AdminLevel, DublinCore> adminDCMap = populationMap
+						.get(isoKey);
+				DublinCore populationGraphDC = adminDCMap.get(maxAdminLevel);
+				final PopulationModelSpecification temp = new PopulationModelSpecification(
+						isoKey, adminLevelSet, countryGeographicModelDC,
+						populationGraphDC);
+
+				gmsList.add(temp);
+			} // for adminLevel
+			retValue.put(isoKey, gmsList);
+		} // for each isoKey
+
+		return retValue;
+	} // processFiles
+
+} // PopulationModelGenerator
\ No newline at end of file
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java
new file mode 100644
index 0000000..b09c40c
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/src/org/eclipse/stem/internal/data/geography/population/human/models/PopulationModelSpecification.java
@@ -0,0 +1,223 @@
+// PopulationModelSpecification.java
+package org.eclipse.stem.internal.data.geography.population.human.models;
+
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+import org.eclipse.stem.core.Utility;
+import org.eclipse.stem.core.graph.Graph;
+import org.eclipse.stem.core.model.Model;
+import org.eclipse.stem.core.model.ModelPackage;
+import org.eclipse.stem.data.geography.ISOKey;
+import org.eclipse.stem.definitions.labels.LabelsPackage;
+import org.eclipse.stem.internal.data.generatedplugin.DublinCore;
+import org.eclipse.stem.internal.data.geography.specifications.AdminLevelSet;
+import org.eclipse.stem.internal.data.geography.specifications.CountryGraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.GraphPropertyFileSpecification;
+import org.eclipse.stem.internal.data.specifications.ModelSpecification;
+
+/**
+ * This class represents a {@link ModelSpecification} for a Population model.
+ */
+public class PopulationModelSpecification extends ModelSpecification implements
+		Comparable<PopulationModelSpecification> {
+
+	/**
+	 * This is referenced to cause the {@link ModelPackage} to register itself
+	 * as a package.
+	 */
+	@SuppressWarnings("unused")
+	private final ModelPackage modelPackage = ModelPackage.eINSTANCE;
+	@SuppressWarnings("unused")
+	private final LabelsPackage labelsPackage = LabelsPackage.eINSTANCE;
+
+	private final ISOKey isoKey;
+	private final AdminLevelSet adminLevelSet;
+	private final DublinCore countryGeographicModelDC;
+	private final DublinCore populationGraphDC;
+
+	static {
+		// This sets up the mapping between the "platform" URI's and the
+		// projects in the file system.
+
+		// CWD is the current working directory
+		final String CWD = System.getProperty("user.dir"); //$NON-NLS-1$
+		// WORKSPACE is the directory of the parent workspace
+		final String WORKSPACE = CWD.substring(0, CWD
+				.lastIndexOf(File.separator));
+
+		// The path to the generated geography data project
+		final String GEOGRAPHY_MODELS_PROJECT_ROOT = WORKSPACE
+				+ File.separator
+				+ org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID
+				+ File.separator;
+
+		// The path to the generated population data project
+		final String HUMAN_POPULATION_GRAPHS_PROJECT_ROOT = WORKSPACE
+				+ File.separator
+				+ org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID
+				+ File.separator;
+
+		final Map<String, URI> platformResourceMap = EcorePlugin
+				.getPlatformResourceMap();
+
+		// Register the mapping between the project id and the absolute path to
+		// the project in the file system. This will be found later when
+		// deserializing when the platform URI is mapped.
+		platformResourceMap.put(
+				org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID,
+				URI.createFileURI(GEOGRAPHY_MODELS_PROJECT_ROOT));
+
+		platformResourceMap
+				.put(
+						org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID,
+						URI.createFileURI(HUMAN_POPULATION_GRAPHS_PROJECT_ROOT));
+	} // static
+
+	/**
+	 * @param isoKey
+	 *            the {@link ISOKey} of the country the population model is for.
+	 * @param adminLevelSet
+	 *            the administration levels covered in the model
+	 * @param countryGeographicModelDC
+	 * @param populationGraphDC
+	 */
+	public PopulationModelSpecification(ISOKey isoKey,
+			AdminLevelSet adminLevelSet, DublinCore countryGeographicModelDC,
+			DublinCore populationGraphDC) {
+		this.isoKey = isoKey;
+		this.adminLevelSet = adminLevelSet;
+		this.countryGeographicModelDC = countryGeographicModelDC;
+		this.populationGraphDC = populationGraphDC;
+	} // PopulationModelSpecification
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.ModelSpecification#createIdentifiableInstance()
+	 */
+	@Override
+	protected Model createIdentifiableInstance() {
+		final Model retValue = super.createIdentifiableInstance();
+		// The generated Graphs etc., all have dublin core that references
+		// them as plugins. This is as it should be when STEM is running,
+		// but right now we're running stand-alone and want to access the
+		// plugins as projects (they aren't plugged into our running version
+		// of Eclipse). Substitute "resource" for "plugin" in the URI's we
+		// use and all will be well.
+
+		retValue
+				.getModels()
+				.add(
+						(Model) Utility
+								.getIdentifiable(getIdentifiableProjectURI(countryGeographicModelDC)));
+
+		retValue
+				.getGraphs()
+				.add(
+						(Graph) Utility
+								.getIdentifiable(getIdentifiableProjectURI(populationGraphDC)));
+
+		return retValue;
+	} // createIdentifiableInstance
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getRelativeSerializationPath()
+	 */
+	@Override
+	protected String getRelativeSerializationPath() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append(CountryGraphPropertyFileSpecification.COUNTRY_DIR);
+		sb.append(File.separatorChar);
+		sb.append(getISOKey().toString());
+		return sb.toString();
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getSerializationFileNameRoot()
+	 */
+	@Override
+	protected String getSerializationFileNameRoot() {
+		final StringBuilder sb = new StringBuilder(getISOKey().toString());
+		sb.append("_"); //$NON-NLS-1$
+		sb.append(adminLevelSet.toString());
+		sb.append("_population"); //$NON-NLS-1$
+		return sb.toString();
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTargetPluginId()
+	 */
+	@Override
+	protected String getTargetPluginId() {
+		return org.eclipse.stem.data.geography.population.human.models.Activator.PLUGIN_ID;
+	}
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTitleDescriptor()
+	 */
+	@Override
+	protected String getTitleDescriptor() {
+		final StringBuilder sb = new StringBuilder(isoKey.toString());
+		sb.append(" Human Population"); //$NON-NLS-1$
+		sb
+				.append(adminLevelSet.getNumAdminLevels() > 1 ? " (Levels: " : " (Level: "); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append(adminLevelSet.toString(",")); //$NON-NLS-1$
+		sb.append(")"); //$NON-NLS-1$
+		return sb.toString();
+	} // getTitleDescriptor
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreCoverage()
+	 */
+	@Override
+	protected String createDubinCoreCoverage() {
+		return countryGeographicModelDC.getCoverage();
+	} // createDubinCoreCoverage
+
+	/**
+	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreSubject()
+	 */
+	@Override
+	protected String createDubinCoreSubject() {
+		return GraphPropertyFileSpecification.createDublinCoreSubjectString(
+				ModelPackage.Literals.MODEL.getName(), "population"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @return the isoKey
+	 */
+	public ISOKey getISOKey() {
+		return isoKey;
+	}
+
+	public int compareTo(PopulationModelSpecification pms) {
+		return adminLevelSet.getNumAdminLevels() > pms.adminLevelSet
+				.getNumAdminLevels() ? 1 : -1;
+
+	} // compareTo
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append(isoKey);
+		sb.append(":"); //$NON-NLS-1$
+		sb.append(adminLevelSet.toString());
+		return sb.toString();
+	} // toString
+
+} // PopulationModelSpecification
\ No newline at end of file
diff --git a/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml b/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml
new file mode 100644
index 0000000..c7a69bd
--- /dev/null
+++ b/population/org.eclipse.stem.internal.data.geography.population.human.models/update.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0"?>
+<!-- ====================================================================== 
+     ANT script to build org.eclispe.ohf.stem.geography project 
+     and the initial set of STEM scenarios.  
+     This must be run after installing the STEM workspace and after changes
+     to code generated by EMF models.
+                                                                    
+     ====================================================================== -->
+<project name="STEM Internal Human Population Models" default="update_all">
+	<description>
+     Use the properties files to populate the org.eclipse.stem.data.geography.population.human.models plugin
+    </description>
+
+	<!-- P r o j e c t  S p e c i f i c a t i o n s -->
+
+	<!-- The name of the project -->
+	<property name="project.name" value="stem" />
+
+	
+	<!-- Are we running headless? -->
+	<condition property="runningHeadless" >
+		<isset property="buildDirectory" />
+	</condition>
+	
+	<!-- The buildDirectory property is set in a headless build -->
+	<condition property="pluginRootDirectory" value="${buildDirectory}/plugins" else="..">
+		<isset property="runningHeadless" />
+	</condition>
+
+	<!-- The baseLocation property is the location of the eclipse home installation -->
+	<!-- It is used to find eclipse plugins                                         -->
+	<!-- It is set in a headless build, but not one started manually from Eclipse   -->
+	<condition property="baseLocation" value="${eclipse.pdebuild.home}../..">
+		<not>
+			<isset property="runningHeadless" />
+		</not>
+	</condition>
+
+	<!-- This is the location of the class files of the built plug-ins     -->
+	<!-- If this is a manual build started from Eclipse then the directory -->
+	<!-- is "bin", if its a headless build then the directory is "@dot"    -->
+	<!-- The property baseLocation is set in a headless build              -->
+	<condition property="targetBin" value="@dot" else="bin">
+		<isset property="runningHeadless" />
+	</condition>
+	
+	
+	<!-- The prefix for fully qualified names -->
+	<property name="ID_ROOT" value="org.eclipse.stem" />
+
+	<!-- The name of the plugin that contains the plugin.xml file to scan -->
+	<property name="scan.plugin" value="${ID_ROOT}.data.geography.models" />
+	
+	<!-- The name of the plugin that contains the plugin.xml file to scan -->
+	<property name="population.plugin" value="${ID_ROOT}.data.geography.population.human" />
+	
+	<!-- The name of the source plugin (i.e., the one that contains this file -->
+	<property name="source.plugin" value="${ID_ROOT}.internal.data.geography.population.human.models" />
+
+	<!-- The name of the target plugin -->
+	<property name="target.plugin" value="${ID_ROOT}.data.geography.population.human.models" />
+
+	<!-- The path to the root directory of the source plugin -->
+	<property name="path.sourceplugin" location="${pluginRootDirectory}/${source.plugin}" />
+
+	<!-- The path to the root directory of the plugin that will be augmented with generated content -->
+	<property name="path.targetplugin" location="${pluginRootDirectory}/${target.plugin}" />
+
+	<!-- The path to the root directory of the resource files -->
+	<property name="path.resource.files" value="${path.sourceplugin}/resources/data/country" />
+
+	<!-- The path to the root directory of the plugin that will be augmented with generated content-->
+	<property name="path.generated.files" value="${path.sourceplugin}/temp" />
+
+	<!-- The path to the root directory of geography source code -->
+	<property name="path.geography.src" value="${path.targetplugin}/src/org/eclipse/stem/data/geography/population/human/models" />
+
+	<!-- The name of the plugin.xml file that will be augmented with generated content-->
+	<property name="file.target.pluginxml" value="${path.targetplugin}/plugin.xml" />
+
+	<!-- The name of the plugin.properties file that will be augmented with generated content-->
+	<property name="file.target.pluginproperties" value="${path.targetplugin}/plugin.properties" />
+
+	<!-- The name of the plugin.xml file that that is the aggregation of the generated content-->
+	<property name="file.util.pluginxml" value="${path.generated.files}/plugin.xml" />
+
+	<!-- The name of the plugin.properties file that that is the aggregation of the generated content-->
+	<property name="file.util.pluginproperties" value="${path.generated.files}/plugin.properties" />
+
+    <!-- The name of the plugin.xml file that that is the aggregation of the generated content-->
+    <property name="file.target.pluginproperties" value="${path.generated.files}/plugin.properties" />
+
+	<!-- The class path to use -->
+	<path id="classpath.runtime"> 
+		<pathelement location="${path.sourceplugin}/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.core/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.definitions/${targetBin}" />
+	    <pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data.geography/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.internal.data.geography.models/${targetBin}" />
+		<pathelement location="${pluginRootDirectory}/${ID_ROOT}.data.geography/${targetBin}" />
+		<fileset dir="${baseLocation}/plugins/">
+			<include name="*emf*.jar" />
+		</fileset>
+		<fileset dir="${pluginRootDirectory}/${ID_ROOT}.internal.data/lib/">
+			<include name="*emf*.jar" />
+		</fileset>
+	</path>
+
+	<target name="update_all" depends="update_geography" />
+
+	<!-- Update the geography plugin with the latest definitions -->
+	<target name="update_geography" depends="update_population_models, update_population_plugin_xml, update_population_plugin_properties" />
+
+	<target name="update_population_plugin_xml" depends="create_candidates">
+		<copy tofile="${file.target.pluginxml}" file="${file.util.pluginxml}" overwrite="true" />
+	</target>
+
+	<target name="update_population_plugin_properties" depends="create_candidates">
+		<copy tofile="${file.target.pluginproperties}" file="${file.util.pluginproperties}" overwrite="true" />
+	</target>
+
+	<!-- Update the graph files in the geography plugin -->
+	<target name="update_population_models" depends="create_candidates">
+		<copy todir="${path.targetplugin}/resources/data/" overwrite="true">
+			<fileset dir="${path.generated.files}/resources/data">
+				<include name="**/*.model" />
+			</fileset>
+		</copy>
+	</target>
+	
+	<!-- Create the model files for countries and the plugin.xml and plugin.properties fragments -->
+	<target name="create_candidates" depends="clean">
+		<!-- There is a problem here with specifying fork="true"  maxmemory="768m".  It causes an IOException on some machines -->
+		<java classname="${ID_ROOT}.internal.data.geography.population.human.models.PopulationModelGenerator" fork="true" maxmemory="1024m">
+			<classpath refid="classpath.runtime" />
+			<arg value="${path.generated.files}" />
+			<arg value="${scan.plugin}" />
+			<arg value="${population.plugin}" />
+			<jvmarg value="-Xms1024m"/>
+			<jvmarg value="-Xmx1024m"/>
+		</java>
+	</target>
+
+	<!-- clean out the .../temp/data directories -->
+	<!-- clean out the target directories -->
+	<target name="clean" depends="create_generated_files_dir">
+		<delete includeEmptyDirs="true" quiet="true">
+			<fileset dir="${path.generated.files}/">
+				<include name="**/*" />
+			</fileset>
+			<fileset dir="${path.targetplugin}/resources/data/">
+				<include name="country/**/*" />
+			</fileset>
+		</delete>
+	</target>
+
+	<target name="create_generated_files_dir">
+		<mkdir dir="${path.generated.files}/resources/data"/>		
+	</target>
+</project>
