diff --git a/debian/patches/deb.vim-xz.diff b/debian/patches/deb.vim-xz.diff
index b329564..d67e774 100644
--- a/debian/patches/deb.vim-xz.diff
+++ b/debian/patches/deb.vim-xz.diff
@@ -2,10 +2,20 @@ Subject: Add support for xz-compressed debs
 Author: Jakub Wilk <jwilk@debian.org>
 Bug-Debian: http://bugs.debian.org/644172
 
-diff --git a/autoload/deb.vim b/autoload/deb.vim
+---
+ autoload/deb.vim |   41 +++++++++++++++++++++++++++++++++++------
+ 1 file changed, 35 insertions(+), 6 deletions(-)
+
 --- a/autoload/deb.vim
 +++ b/autoload/deb.vim
-@@ -32,6 +32,8 @@
+@@ -26,12 +26,14 @@ fun! deb#read(debfile, member)
+ 
+     let l:archmember = s:dataFileName(a:debfile) " default archive member to extract
+     if l:archmember == ""
+-        echohl WarningMsg | echo "***error*** (deb#read) no valid data file found in debian archive"
++        echohl WarningMsg | echo "***error*** (deb#read) no valid data member found in debian archive"
+         return
+     elseif l:archmember == "data.tar.gz"
          let l:unpcmp = "tar zxfO "
      elseif l:archmember == "data.tar.bz2"
          let l:unpcmp = "tar jxfO "
@@ -14,12 +24,70 @@ diff --git a/autoload/deb.vim b/autoload/deb.vim
      elseif l:archmember == "data.tar.lzma"
          if !s:hascmd("lzma")
              return
-@@ -230,7 +232,7 @@
+@@ -42,9 +44,18 @@ fun! deb#read(debfile, member)
+     endif
+ 
+     if a:member =~ '^\* ' " information control file
+-        let l:archmember = "control.tar.gz"
+         let l:target = substitute(l:target, "^\* ", "", "")
+-        let l:unpcmp = "tar zxfO "
++        let l:archmember = s:controlFileName(a:debfile)
++        if l:archmember == ""
++            echohl WarningMsg | echo "***error*** (deb#read) no valid control member found in debian archive"
++            return
++        elseif l:archmember == "control.tar.gz"
++            let l:unpcmp = "tar zxfO "
++        elseif l:archmember == "control.tar.xz"
++            let l:unpcmp = "tar JxfO "
++        elseif l:archmember == "control.tar"
++            let l:unpcmp = "tar xfO "
++        endif
+     elseif a:member =~ ' -> ' " symbolic link
+         let l:target = split(a:member,' -> ')[0]
+         let l:linkname = split(a:member,' -> ')[1]
+@@ -151,7 +162,13 @@ fun! deb#browse(file)
+ 
+     " display information control files
+     let l:infopos = line(".")
+-    exe "silent read! ar p " . s:QuoteFile(a:file) . " control.tar.gz | tar zt"
++    let l:ctrlmember = s:controlFileName(a:file)
++    if l:ctrlmember == ""
++       echohl WarningMsg | echo "***error*** (deb#Browser) no valid control member found in debian archive"
++       return
++    endif
++
++    exe "silent read! ar p " . s:QuoteFile(a:file) . " " . l:ctrlmember . " | tar zt"
+ 
+     $put=''
+ 
+@@ -227,16 +244,28 @@ fun! s:DebBrowseSelect()
+ 
+ endfun
+ 
++" return control file name for debian package. This can be either control.tar,
++" control.tar.gz or control.tar.xz
++fun s:controlFileName(deb)
++    return s:findFileName(a:deb, ["control.tar.gz", "control.tar.xz", "control.tar"])
++endfun
++
  " return data file name for debian package. This can be either data.tar.gz,
  " data.tar.bz2 or data.tar.lzma
  fun s:dataFileName(deb)
 -    for fn in ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar"]
-+    for fn in ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar.xz", "data.tar"]
++    return s:findFileName(a:deb, ["data.tar.gz", "data.tar.bz2", "data.tar.lzma", "data.tar.xz", "data.tar"])
++endfun
++
++" return a file name for debian package. This will be the first match from
++" the files passed as arguments.
++fun s:findFileName(deb, list)
++    for fn in a:list
          " [0:-2] is to remove trailing null character from command output
          if (system("ar t " . "'" . a:deb . "'" . " " . fn))[0:-2] == fn
              return fn
+         endif
+     endfor
+-    return "" " no debian data format in this archive
++    return "" " cannot find file in this debian archive
+ endfun
+ 
+ fun s:QuoteFile(file)
