diff --git a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/GetBugsOperation.java b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/GetBugsOperation.java
index 1b41e9b..a1dc122 100755
--- a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/GetBugsOperation.java
+++ b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/GetBugsOperation.java
@@ -17,7 +17,6 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -31,7 +30,12 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.egit.core.GitTag;
+import org.eclipse.egit.core.project.RepositoryMapping;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.LogCommand;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.ui.statushandlers.StatusManager;
 
 public class GetBugsOperation {
@@ -74,13 +78,26 @@ public void run(IProgressMonitor monitor) {
 					monitor.beginTask(
 							Messages.getString("GetBugsOperation.0"), totalWork); //$NON-NLS-1$
 
-					// task 1 -- get bug number from comments
-					final Set bugTree = new HashSet();
+					final IProject[] selectedProjects = wizard
+							.getSelectedProjects();
+
+					// task 1 -- get bug numbers from comments
+					Set<Integer> bugTree;
+					try {
+						bugTree = getBugNumbersFromComments(
+								selectedProjects,
+								new SubProgressMonitor(
+										monitor,
+										85,
+										SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
+					} catch (final Exception e) {
+						monitor.done();
+						return;
+					}
 
 					// task 2 -- create map of bugs and summaries
-					final Integer[] bugs = (Integer[]) bugTree
-							.toArray(new Integer[0]);
-					final TreeMap map = (TreeMap) getBugzillaSummaries(bugs,
+					final Integer[] bugs = bugTree.toArray(new Integer[0]);
+					final Map<Integer, String> map = getBugzillaSummaries(bugs,
 							new SubProgressMonitor(monitor, 15,
 									SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
 					page.getShell().getDisplay().asyncExec(new Runnable() {
@@ -99,29 +116,45 @@ public void run() {
 		}
 	}
 
-	protected Set getBugNumbersFromComments(Object[] syncInfos,
-			IProgressMonitor monitor) {
-		monitor.beginTask("Scanning comments for bug numbers", syncInfos.length);
-		final TreeSet set = new TreeSet();
-		for (int i = 0; i < syncInfos.length; i++) {
-			final Object info = syncInfos[i];
-			getBugNumbersForSyncInfo(info, monitor, set);
+	protected Set<Integer> getBugNumbersFromComments(IProject[] projects,
+			IProgressMonitor monitor) throws Exception {
+		monitor.beginTask("Scanning comments for bug numbers", projects.length);
+		final Set<Integer> set = new TreeSet<Integer>();
+		for (int i = 0; i < projects.length; i++) {
+			getBugNumbersForProject(projects[i], monitor, set);
 			monitor.worked(1);
 		}
 		monitor.done();
 		return set;
 	}
 
-	private void getBugNumbersForSyncInfo(Object info,
-			IProgressMonitor monitor, Set set) {
+	private void getBugNumbersForProject(IProject project,
+			IProgressMonitor monitor, Set<Integer> set) throws Exception {
 
+		final RepositoryMapping rm = RepositoryMapping.getMapping(project);
+		final Repository repository = rm.getRepository();
+
+		final RevCommit previousCommit = ShowInfoHandler.getCommitForTag(
+				repository, getProjectTag(project).getName());
+		final RevCommit latestCommit = ShowInfoHandler.getLatestCommitFor(rm,
+				repository, project);
+
+		final Git git = new Git(repository);
+		final LogCommand log = git.log();
+		log.addRange(previousCommit, latestCommit);
+		for (final RevCommit commit : log.call()) {
+			findBugNumber(commit.getFullMessage(), set);
+		}
 	}
 
 	private GitTag getProjectTag(IProject project) {
+		final MapEntry mapEntry = wizard.getMapProject().getMapEntry(project);
+		if (mapEntry != null)
+			return mapEntry.getTag();
 		return MapEntry.DEFAULT;
 	}
 
-	protected void findBugNumber(String comment, Set set) {
+	protected void findBugNumber(String comment, Set<Integer> set) {
 		if (comment == null) {
 			return;
 		}
@@ -136,14 +169,15 @@ protected void findBugNumber(String comment, Set set) {
 	 * Method uses set of bug numbers to query bugzilla and get summary of each
 	 * bug
 	 */
-	protected Map getBugzillaSummaries(Integer[] bugs, IProgressMonitor monitor) {
+	protected Map<Integer, String> getBugzillaSummaries(Integer[] bugs,
+			IProgressMonitor monitor) {
 		monitor.beginTask(
 				Messages.getString("GetBugsOperation.1"), bugs.length + 1); //$NON-NLS-1$
 		HttpURLConnection hURL;
 		DataInputStream in;
 		URLConnection url;
 		StringBuffer buffer;
-		final TreeMap map = new TreeMap();
+		final TreeMap<Integer, String> map = new TreeMap<Integer, String>();
 		for (int i = 0; i < bugs.length; i++) {
 			try {
 				url = (new URL(BUG_DATABASE_PREFIX + bugs[i]
diff --git a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapEntry.java b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapEntry.java
index 6b3a590..bb7f67e 100755
--- a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapEntry.java
+++ b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapEntry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 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
@@ -43,8 +43,6 @@ public class MapEntry {
 
 	private OrderedMap arguments = new OrderedMap();
 
-	private boolean legacy = false;
-
 	private String version;
 
 	public static void main(String[] args) {
@@ -136,6 +134,8 @@ private void init(String entryLine) {
 		final String[] args = getArrayFromStringWithBlank(
 				entryLine.substring(end + 1), ",");
 		this.arguments = populate(args);
+		if (this.arguments == null)
+			return;
 		final String tag = (String) arguments.get(KEY_TAG);
 		final String repo = (String) arguments.get(REPO);
 		if (tag == null || tag.length() == 0 || repo == null
@@ -145,43 +145,27 @@ private void init(String entryLine) {
 	}
 
 	/*
-	 * Build a table from the given array. In the new format,the array contains
-	 * key=value elements. Otherwise we fill in the key based on the old format.
+	 * Build a table from the given array. We only understand GIT map entries of
+	 * the format "GIT,key=value[,key=value]*
 	 */
 	private OrderedMap populate(String[] entries) {
+		if (entries.length <= 1 || !"GIT".equalsIgnoreCase(entries[0])) {
+			// not a GIT entry, ignore
+			return null;
+		}
+
 		final OrderedMap result = new OrderedMap();
-		for (int i = 0; i < entries.length; i++) {
+		for (int i = 1; i < entries.length; i++) {
 			final String entry = entries[i];
 			final int index = entry.indexOf('=');
 			if (index == -1) {
-				// we only handle CVS entries
-				if (i == 0 && "GIT".equalsIgnoreCase(entry))
-					continue;
-				// legacy story...
-				return legacyPopulate(entries);
+				// bad entry
+				return null;
 			}
 			final String key = entry.substring(0, index);
 			final String value = entry.substring(index + 1);
 			result.put(key, value);
 		}
-		result.toString();
-		return result;
-	}
-
-	private OrderedMap legacyPopulate(String[] entries) {
-		legacy = true;
-		final OrderedMap result = new OrderedMap();
-		// must have at least tag and connect string
-		if (entries.length >= 2) {
-			// Version
-			result.put(KEY_TAG, entries[0]);
-			// Repo Connect String
-			result.put(REPO, entries[1]);
-
-			// Optional CVS Module Name
-			if (entries.length >= 3)
-				result.put(KEY_PATH, entries[3]);
-		}
 		return result;
 	}
 
@@ -263,22 +247,6 @@ public String getReferenceString() {
 
 	public String getMapString() {
 		final StringBuffer result = new StringBuffer();
-		if (legacy) {
-			result.append(getType());
-			result.append('@');
-			result.append(getId());
-			if (version != null) {
-				result.append(',');
-				result.append(version);
-			}
-			result.append('=');
-			result.append(getTagName());
-			result.append(',');
-			result.append(getRepo());
-			result.append(',');
-			result.append(getPath());
-			return result.toString();
-		}
 		result.append(getType());
 		result.append('@');
 		result.append(getId());
diff --git a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapFile.java b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapFile.java
index 045f716..363954f 100755
--- a/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapFile.java
+++ b/org.eclipse.egit.relengtools/src/org/eclipse/egit/internal/relengtools/MapFile.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 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
@@ -19,16 +19,15 @@
 import java.util.List;
 import java.util.Set;
 
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceProxy;
 import org.eclipse.core.resources.IResourceProxyVisitor;
 import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 
 public class MapFile {
 
@@ -54,7 +53,7 @@ public IFile getFile() {
 
 	protected void loadEntries() throws CoreException {
 		InputStream inputStream = null;
-		List list = new ArrayList();
+		final List<MapEntry> list = new ArrayList<MapEntry>();
 
 		try {
 			inputStream = file.getContents();
@@ -63,7 +62,9 @@ protected void loadEntries() throws CoreException {
 			String aLine = aReader.readLine();
 			while (aLine != null) {
 				if (isMapLine(aLine)) {
-					list.add(new MapEntry(aLine));
+					final MapEntry entry = new MapEntry(aLine);
+					if (entry.isValid())
+						list.add(new MapEntry(aLine));
 				}
 				aLine = aReader.readLine();
 			}
@@ -82,7 +83,7 @@ protected void loadEntries() throws CoreException {
 			}
 		}
 
-		this.entries = (MapEntry[]) list.toArray(new MapEntry[list.size()]);
+		this.entries = list.toArray(new MapEntry[list.size()]);
 	}
 
 	private boolean isMapLine(String line) {
@@ -102,6 +103,10 @@ public boolean contains(IProject project) {
 		return false;
 	}
 
+	public int size() {
+		return entries != null ? entries.length : 0;
+	}
+
 	public MapEntry getMapEntry(IProject project) {
 		for (int j = 0; j < entries.length; j++) {
 			if (entries[j].isMappedTo(project)) {
@@ -163,9 +168,14 @@ public boolean visit(IResourceProxy resourceProxy)
 
 				if (type == IResource.FILE
 						&& resourceProxy.getName().endsWith(
-								MAP_FILE_NAME_ENDING))
-					mapFiles.add(new MapFile((IFile) resourceProxy
-							.requestResource()));
+								MAP_FILE_NAME_ENDING)) {
+					final MapFile map = new MapFile(
+							(IFile) resourceProxy.requestResource());
+
+					// don't both with map files that didn't contain GIT entries
+					if (map.size() > 0)
+						mapFiles.add(map);
+				}
 
 				return true;
 			}
