diff --git a/lib/Gscan2pdf/Tesseract.pm b/lib/Gscan2pdf/Tesseract.pm
index ce59818..b465f39 100644
--- a/lib/Gscan2pdf/Tesseract.pm
+++ b/lib/Gscan2pdf/Tesseract.pm
@@ -7,6 +7,7 @@ use Carp;
 use File::Temp;    # To create temporary files
 use File::Basename;
 use Gscan2pdf;     # for slurp
+use version;
 
 my ( %languages, $installed, $setup, $version, $tessdata, $datasuffix );
 
@@ -18,11 +19,23 @@ sub setup {
  else {
   return;
  }
+
+# if we have 3.02.01 or better, we can use --list-langs and not bother with tessdata
+ my $out = `tesseract -v 2>&1`;
+ if ( $out =~ /^tesseract\ ([\d\.]+)/x ) {
+  $version = $1;
+ }
+ if ( $version and version->parse("v$version") > version->parse('v3.02') ) {
+  $main::logger->info("Found tesseract version $version.");
+  $setup = 1;
+  return $installed;
+ }
+
  ( $tessdata, $version, $datasuffix ) =
    parse_tessdata(`tesseract '' '' -l '' 2>&1`);
 
  if ( not defined($tessdata) ) {
-  if ( defined($version) and $version > 3.01 ) {
+  if ( $version and version->parse("v$version") > version->parse('v3.01') ) {
    my $exe = `which tesseract`;
    my $lib = `ldd $exe`;
    if ( $lib =~ /libtesseract\.so.\d+\ =>\ ([\/a-zA-Z0-9\-\.\_]+)\ /x ) {
@@ -125,24 +138,32 @@ sub languages {
    ukr        => 'Ukranian',
    vie        => 'Vietnamese',
   );
-  for ( glob "$tessdata/*$datasuffix" ) {
-
-   # Weed out the empty language files
-   if ( not -z $_ ) {
-    my $code;
-    if (/ ([\w\-]*) $datasuffix $/x) {
-     $code = $1;
-     $main::logger->info("Found tesseract language $code");
-     if ( defined $iso639{$code} ) {
-      $languages{$code} = $iso639{$code};
-     }
-     else {
-      $languages{$code} = $code;
+
+  my @codes;
+  if ( version->parse("v$version") > version->parse('v3.02') ) {
+   my $codes = `tesseract --list-langs 2>&1`;
+   @codes = split "\n", $codes;
+   shift @codes if ( $codes[0] =~ /^List\ of\ available\ languages/x );
+  }
+  else {
+   for ( glob "$tessdata/*$datasuffix" ) {
+
+    # Weed out the empty language files
+    if ( not -z $_ ) {
+     if (/ ([\w\-]*) $datasuffix $/x) {
+      push @codes, $1;
      }
     }
-    else {
-     $main::logger->info("Found unknown language file: $_");
-    }
+   }
+  }
+
+  for (@codes) {
+   $main::logger->info("Found tesseract language $_");
+   if ( defined $iso639{$_} ) {
+    $languages{$_} = $iso639{$_};
+   }
+   else {
+    $languages{$_} = $_;
    }
   }
  }
@@ -155,7 +176,7 @@ sub hocr {
  setup() unless $setup;
 
  # Temporary filename for output
- my $suffix = $version >= 3 ? '.html' : '.txt';
+ my $suffix = version->parse("v$version") >= version->parse("v3") ? '.html' : '.txt';
  my $txt = File::Temp->new( SUFFIX => $suffix );
  ( my $name, my $path, undef ) = fileparse( $txt, $suffix );
 
@@ -170,7 +191,7 @@ sub hocr {
  else {
   $tif = $file;
  }
- if ( $version >= 3 ) {
+ if ( version->parse("v$version") >= version->parse("v3") ) {
   $cmd =
 "echo tessedit_create_hocr 1 > hocr.config;tesseract $tif $path$name -l $language +hocr.config 2> /dev/null;rm hocr.config";
  }
