diff --git a/tests/getpart.pm b/tests/getpart.pm
index 6935f9eb7a8d00a88dd0585e06b0cef3426389b8..9c74986f425af97d51bf2b4f87709193c05f35d4 100644
--- a/tests/getpart.pm
+++ b/tests/getpart.pm
@@ -92,8 +92,15 @@ sub getpart {
 sub loadtest {
     my ($file)=@_;
 
+    my $dir;
+    $dir = $ENV{'srcdir'};
+    if(!$dir) {
+        $dir=".";
+    }
+    
+
     undef @xml;
-    open(XML, "<$file") ||
+    open(XML, "<$dir/$file") ||
         return 1; # failure!
     binmode XML; # for crapage systems, use binary
     while(<XML>) {
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 7faef92f9b1f2b67b9f2edf6d01e2712287d0b38..d458a35c2f1c796086857fd6ff2291de5141ab5f 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -4,14 +4,19 @@ use strict;
 
 my $verbose=0; # set to 1 for debugging
 
+my $dir=".";
 my $port = 8999; # just a default
 do {
     if($ARGV[0] eq "-v") {
         $verbose=1;
     }
+    elsif($ARGV[0] eq "-d") {
+        $dir=$ARGV[1];
+        shift @ARGV;
+    }
     elsif($ARGV[0] =~ /^(\d+)$/) {
         $port = $1;
     }
 } while(shift @ARGV);
 
-exec("server/sws $port");
+exec("server/sws $port $dir");
diff --git a/tests/runtests.pl b/tests/runtests.pl
index 00c2c81bcebb9b757113bd72ebb24d8c6924ccc3..f0ca9963c96ef9f3d8e586fd63ab5af2d5e56c47 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -39,7 +39,7 @@ my $FTPSPORT=8821;  # this is the FTPS server port
 my $CURL="../src/curl"; # what curl executable to run on the tests
 my $DBGCURL=$CURL; #"../src/.libs/curl";  # alternative for debugging
 my $LOGDIR="log";
-my $TESTDIR="data";
+my $TESTDIR="$srcdir/data";
 my $LIBDIR="./libtest";
 my $SERVERIN="$LOGDIR/server.input"; # what curl sent the server
 my $CURLLOG="$LOGDIR/curl.log"; # all command lines run
@@ -354,6 +354,10 @@ sub runhttpserver {
     }
 
     my $flag=$debugprotocol?"-v ":"";
+    my $dir=$ENV{'srcdir'};
+    if($dir) {
+        $flag .= "-d \"$dir\" ";
+    }
     $cmd="$perl $srcdir/httpserver.pl $flag $HOSTPORT &";
     system($cmd);
     if($verbose) {
@@ -691,6 +695,9 @@ sub checkcurl {
             }
         }
     }
+    if(!$curl) {
+        die "couldn't run curl!"
+    }
 
     my $hostname=`hostname`;
     my $hosttype=`uname -a`;
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 796806e7fdcbd945ebf478069295514bc0bfcc9e..f2f46500359cd42cae33ed5398668089fa2ab66a 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -70,7 +70,10 @@ spitout(FILE *stream,
 #define REQUEST_DUMP  "log/server.input"
 #define RESPONSE_DUMP "log/server.response"
 
-#define TEST_DATA_PATH "data/test%d"
+#define TEST_DATA_PATH "%s/data/test%d"
+
+/* global variable, where to find the 'data' dir */
+char *path=".";
 
 enum {
   DOCNUMBER_QUIT    = -6,
@@ -442,7 +445,7 @@ static int send_doc(int sock,
     if(0 != part_no)
       sprintf(partbuf, "data%d", part_no);
 
-    sprintf(filename, TEST_DATA_PATH, doc);
+    sprintf(filename, TEST_DATA_PATH, path, doc);
 
     stream=fopen(filename, "rb");
     if(!stream) {
@@ -537,9 +540,14 @@ int main(int argc, char *argv[])
   int part_no;
   FILE *pidfile;
   
-  if(argc>1)
+  if(argc>1) {
     port = atoi(argv[1]);
 
+    if(argc>2) {
+      path = argv[2];
+    }
+  }
+
   logfp = fopen(logfile, "a");
   if (!logfp) {
     perror(logfile);