diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java
index a9fdb81581f550b1ed53d0be4e1e918833bd4510..8ddb6bdd1eb9bdd1d09a5076c546387cd5ecfa14 100644
--- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java
+++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogGenerator.java
@@ -116,6 +116,9 @@ public class IpLogGenerator {
 	/** Projects indexed by their ID string, e.g. {@code technology.jgit}. */
 	private final Map<String, Project> projects = new TreeMap<String, Project>();
 
+	/** Projects indexed by their ID string, e.g. {@code technology.jgit}. */
+	private final Map<String, Project> consumedProjects = new TreeMap<String, Project>();
+
 	/** Known committers, indexed by their foundation ID. */
 	private final Map<String, Committer> committersById = new HashMap<String, Committer>();
 
@@ -223,6 +226,9 @@ private void loadEclipseIpLog(String version, RevCommit commit)
 			p.setVersion(version);
 			projects.put(p.getName(), p);
 		}
+		for (Project p : meta.getConsumedProjects()) {
+			consumedProjects.put(p.getName(), p);
+		}
 		cqs.addAll(meta.getCQs());
 	}
 
@@ -480,8 +486,19 @@ private Document toXML() throws ParserConfigurationException {
 			root.appendChild(createProject(project));
 			licenses.addAll(project.getLicenses());
 		}
+
+		if (!consumedProjects.isEmpty())
+			appendBlankLine(root);
+		for (Project project : sort(consumedProjects, Project.COMPARATOR)) {
+			root.appendChild(createConsumes(project));
+			licenses.addAll(project.getLicenses());
+		}
+
 		for (RevCommit c : sort(commits))
 			root.appendChild(createCommitMeta(c));
+
+		if (licenses.size() > 1)
+			appendBlankLine(root);
 		for (String name : sort(licenses))
 			root.appendChild(createLicense(name));
 
@@ -509,11 +526,21 @@ private void appendBlankLine(Element root) {
 
 	private Element createProject(Project p) {
 		Element project = createElement("project");
+		populateProjectType(p, project);
+		return project;
+	}
+
+	private Element createConsumes(Project p) {
+		Element project = createElement("consumes");
+		populateProjectType(p, project);
+		return project;
+	}
+
+	private void populateProjectType(Project p, Element project) {
 		required(project, "id", p.getID());
 		required(project, "name", p.getName());
 		optional(project, "comments", p.getComments());
 		optional(project, "version", p.getVersion());
-		return project;
 	}
 
 	private Element createCommitMeta(RevCommit c) {
diff --git a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java
index 8d73b02fd512bc452b1d71abbda4c8dfa29fcc62..16a159352301d721bb473063ae5e50f00b147da4 100644
--- a/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java
+++ b/org.eclipse.jgit.iplog/src/org/eclipse/jgit/iplog/IpLogMeta.java
@@ -73,8 +73,12 @@ public class IpLogMeta {
 
 	private static final String S_CQ = "CQ";
 
+	private static final String S_CONSUMES = "consumes";
+
 	private static final String K_NAME = "name";
 
+	private static final String K_VERSION = "version";
+
 	private static final String K_COMMENTS = "comments";
 
 	private static final String K_SKIP_COMMIT = "skipCommit";
@@ -89,31 +93,29 @@ public class IpLogMeta {
 
 	private List<Project> projects = new ArrayList<Project>();
 
+	private List<Project> consumedProjects = new ArrayList<Project>();
+
 	private Set<CQ> cqs = new HashSet<CQ>();
 
 	List<Project> getProjects() {
 		return projects;
 	}
 
+	List<Project> getConsumedProjects() {
+		return consumedProjects;
+	}
+
 	Set<CQ> getCQs() {
 		return cqs;
 	}
 
 	void loadFrom(Config cfg) {
 		projects.clear();
+		consumedProjects.clear();
 		cqs.clear();
 
-		for (String id : cfg.getSubsections(S_PROJECT)) {
-			String name = cfg.getString(S_PROJECT, id, K_NAME);
-			Project project = new Project(id, name);
-			project.setComments(cfg.getString(S_PROJECT, id, K_COMMENTS));
-
-			for (String c : cfg.getStringList(S_PROJECT, id, K_SKIP_COMMIT))
-				project.addSkipCommit(ObjectId.fromString(c));
-			for (String license : cfg.getStringList(S_PROJECT, id, K_LICENSE))
-				project.addLicense(license);
-			projects.add(project);
-		}
+		projects.addAll(parseProjects(cfg, S_PROJECT));
+		consumedProjects.addAll(parseProjects(cfg, S_CONSUMES));
 
 		for (String id : cfg.getSubsections(S_CQ)) {
 			CQ cq = new CQ(Long.parseLong(id));
@@ -126,6 +128,24 @@ void loadFrom(Config cfg) {
 		}
 	}
 
+	private List<Project> parseProjects(final Config cfg,
+			final String sectionName) {
+		final List<Project> dst = new ArrayList<Project>();
+		for (String id : cfg.getSubsections(sectionName)) {
+			String name = cfg.getString(sectionName, id, K_NAME);
+			Project project = new Project(id, name);
+			project.setVersion(cfg.getString(sectionName, id, K_VERSION));
+			project.setComments(cfg.getString(sectionName, id, K_COMMENTS));
+
+			for (String c : cfg.getStringList(sectionName, id, K_SKIP_COMMIT))
+				project.addSkipCommit(ObjectId.fromString(c));
+			for (String license : cfg.getStringList(sectionName, id, K_LICENSE))
+				project.addLicense(license);
+			dst.add(project);
+		}
+		return dst;
+	}
+
 	/**
 	 * Query the Eclipse Foundation's IPzilla database for CQ records.
 	 * <p>