diff --git a/meld/tree.py b/meld/tree.py
index 349e0d9..dc8c0b9 100644
--- a/meld/tree.py
+++ b/meld/tree.py
@@ -31,7 +31,9 @@ from meld.vc._vc import \
     STATE_IGNORED, STATE_NONE, STATE_NORMAL, STATE_NOCHANGE, \
     STATE_ERROR, STATE_EMPTY, STATE_NEW, \
     STATE_MODIFIED, STATE_CONFLICT, STATE_REMOVED, \
-    STATE_MISSING, STATE_NONEXIST, STATE_MAX
+    STATE_MISSING, STATE_NONEXIST, STATE_MAX, \
+    CONFLICT_BASE, CONFLICT_LOCAL, CONFLICT_REMOTE, \
+    CONFLICT_MERGED, CONFLICT_OTHER, CONFLICT_THIS
 
 
 class DiffTreeStore(gtk.TreeStore):
diff --git a/meld/vc/_vc.py b/meld/vc/_vc.py
index eddb8f3..e04643f 100644
--- a/meld/vc/_vc.py
+++ b/meld/vc/_vc.py
@@ -35,6 +35,16 @@ STATE_ERROR, STATE_EMPTY, STATE_NEW, \
 STATE_MODIFIED, STATE_CONFLICT, STATE_REMOVED, \
 STATE_MISSING, STATE_NONEXIST, STATE_MAX = list(range(13))
 
+# Order is important here, matches up with git show numbers
+CONFLICT_MERGED, CONFLICT_BASE, CONFLICT_LOCAL, \
+CONFLICT_REMOTE, CONFLICT_MAX = list(range(5))
+# These names are used by BZR, and are logically identical.
+CONFLICT_OTHER = CONFLICT_REMOTE
+CONFLICT_THIS = CONFLICT_LOCAL
+
+conflicts = _("Merged:Base:Local:Remote").split(':')
+assert len(conflicts)== CONFLICT_MAX
+
 class Entry(object):
     # These are the possible states of files. Be sure to get the colons correct.
     states = _("Ignored:Unversioned:::Error::Newly added:Modified:Conflict:Removed:Missing:Not present").split(":")
diff --git a/meld/vc/bzr.py b/meld/vc/bzr.py
index e64153c..dcc6b5c 100644
--- a/meld/vc/bzr.py
+++ b/meld/vc/bzr.py
@@ -27,6 +27,9 @@ import os
 import re
 
 from . import _vc
+import subprocess
+import tempfile
+import shutil
 
 
 class Vc(_vc.CachedVc):
@@ -38,6 +41,13 @@ class Vc(_vc.CachedVc):
     PATCH_INDEX_RE = "^=== modified file '(.*)'.*$"
     CONFLICT_RE = "conflict in (.*)$"
 
+    conflict_map = {
+        _vc.CONFLICT_BASE: '.BASE',
+        _vc.CONFLICT_OTHER: '.OTHER',
+        _vc.CONFLICT_THIS: '.THIS',
+        _vc.CONFLICT_MERGED: '',
+    }
+
     # We use None here to indicate flags that we don't deal with or care about
     state_1_map = {
         " ": None,               # First status column empty
@@ -144,3 +154,31 @@ class Vc(_vc.CachedVc):
                 state = _vc.STATE_NORMAL
                 retdirs.append( _vc.Dir(path, d, state) )
         return retdirs, retfiles
+
+    def get_path_for_repo_file(self, path, commit=None):
+        if not path.startswith(self.root + os.path.sep):
+            raise _vc.InvalidVCPath(self, path, "Path not in repository")
+                
+        path = path[len(self.root) + 1:]
+        
+        args = [self.CMD, "cat", path]
+        if commit:
+            args.append("-r%s" % commit)
+        process = subprocess.Popen(args,
+                                   cwd=self.location, stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE)
+        vc_file = process.stdout
+
+        # Error handling here involves doing nothing; in most cases, the only
+        # sane response is to return an empty temp file.
+
+        with tempfile.NamedTemporaryFile(prefix='meld-tmp', delete=False) as f:
+            shutil.copyfileobj(vc_file, f)
+        return f.name
+
+    
+    def get_path_for_conflict(self, path, conflict=None):
+        if not path.startswith(self.root + os.path.sep):
+            raise _vc.InvalidVCPath(self, path, "Path not in repository")
+        
+        return "%s%s" % (path, self.conflict_map[conflict])
diff --git a/meld/vc/git.py b/meld/vc/git.py
index 5684256..f2aa5e8 100644
--- a/meld/vc/git.py
+++ b/meld/vc/git.py
@@ -80,6 +80,26 @@ class Vc(_vc.CachedVc):
     def revert_command(self):
         return [self.CMD,"checkout"]
 
+    def get_path_for_conflict(self, path, conflict=None):
+        if not path.startswith(self.root + os.path.sep):
+            raise _vc.InvalidVCPath(self, path, "Path not in repository")
+        path = path[len(self.root) + 1:]
+
+        args = ["git", "show", ":%s:%s" % (conflict, path)]
+        process = subprocess.Popen(args,
+                                   cwd=self.location, stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE)
+        vc_file = process.stdout
+
+        # Error handling here involves doing nothing; in most cases, the only
+        # sane response is to return an empty temp file.
+
+        with tempfile.NamedTemporaryFile(
+                                prefix='meld-tmp-%s-' % _vc.conflicts[conflict], 
+                                delete=False) as f:
+            shutil.copyfileobj(vc_file, f)
+        return f.name
+
     def get_path_for_repo_file(self, path, commit=None):
         if commit is None:
             commit = "HEAD"
