diff -urNp havp-0.86/havp/default.h.in havp-0.86-redirect/havp/default.h.in
--- havp-0.86/havp/default.h.in	2007-03-26 13:51:59.000000000 +0200
+++ havp-0.86-redirect/havp/default.h.in	2007-06-17 18:33:24.000000000 +0300
@@ -47,7 +47,8 @@
  "ENABLECLAMD","CLAMDSOCKET","CLAMDSERVER","CLAMDPORT", \
  "ENABLESOPHIE","SOPHIESOCKET", \
  "ENABLEAVAST","AVASTSOCKET","AVASTSERVER","AVASTPORT", \
- "ENABLEARCAVIR","ARCAVIRSOCKET"
+ "ENABLEARCAVIR","ARCAVIRSOCKET", \
+ "REDIRECT"
 //SCANNERS
 
 
diff -urNp havp-0.86/havp/havp.cpp havp-0.86-redirect/havp/havp.cpp
--- havp-0.86/havp/havp.cpp	2007-02-28 09:39:20.000000000 +0200
+++ havp-0.86-redirect/havp/havp.cpp	2007-06-17 18:35:10.000000000 +0300
@@ -35,6 +35,7 @@
 
 URLList Whitelist;
 URLList Blacklist;
+PatternList Redirectlist;
 bool rereadall = false;
 bool childrestart = false;
 int LL = 0; //LogLevel
@@ -101,6 +102,8 @@ int main(int argc, char *argv[])
     LogFile::ErrorMessage("=== Mandatory locking disabled! KEEPBACK settings not used!\n");
 #endif
 
+    Redirectlist.LoadPatterns( "REDIRECT" );
+
     LogFile::ErrorMessage("Change to user %s\n", Params::GetConfigString("USER").c_str());
     LogFile::ErrorMessage("Change to group %s\n", Params::GetConfigString("GROUP").c_str());
 
diff -urNp havp-0.86/havp/params.cpp havp-0.86-redirect/havp/params.cpp
--- havp-0.86/havp/params.cpp	2007-03-26 13:51:59.000000000 +0200
+++ havp-0.86-redirect/havp/params.cpp	2007-06-17 18:36:30.000000000 +0300
@@ -112,6 +112,7 @@ void Params::SetDefaults()
         SetConfig("AVASTPORT","5036");
     SetConfig("ENABLEARCAVIR","false");
         SetConfig("ARCAVIRSOCKET","/var/run/arcavird.socket");
+    SetConfig("REDIRECT","");
 }
 
 bool Params::ReadConfig( string file )
diff -urNp havp-0.86/havp/proxyhandler.cpp havp-0.86-redirect/havp/proxyhandler.cpp
--- havp-0.86/havp/proxyhandler.cpp	2007-04-07 16:04:28.000000000 +0300
+++ havp-0.86-redirect/havp/proxyhandler.cpp	2007-06-17 18:40:04.000000000 +0300
@@ -27,6 +27,7 @@
 
 extern URLList Whitelist;
 extern URLList Blacklist;
+extern PatternList Redirectlist;
 extern int LL; //LogLevel
 
 void ProxyHandler::Proxy( SocketHandler &ProxyServerT, ScannerHandler &Scanners )
@@ -125,6 +126,15 @@ void ProxyHandler::Proxy( SocketHandler 
             }
         }
 
+        string redirectURL;
+        if (Redirectlist.FindPattern(ToBrowser.GetHost(), redirectURL))
+        {
+            ToBrowser.PrepareHeaderForServer( false, UseParentProxy );
+            ProxyMessage( -46, "" );
+            DropBrowser = true;
+            continue;
+        }
+
 #ifdef SSLTUNNEL
     }
 #endif
@@ -1322,6 +1332,22 @@ bool ProxyHandler::ProxyMessage( int Com
             filename = ERROR_BLACKLIST;
             break;
 
+        case -46:
+        {
+            string redirectURL;
+            Redirectlist.FindPattern(ToBrowser.GetHost(), redirectURL);
+
+            LogFile::AccessMessage("%s %s %d %s %d+%lld REDIRECT\n", ToBrowser.GetIP().c_str(), ToBrowser.GetRequestType().c_str(), ToServer.GetResponse(), ToBrowser.GetCompleteRequest().c_str(), TransferredHeader, TransferredBody);
+
+            string redirectHeader = "HTTP/1.0 307 Temporary Redirect by HAVP";
+            redirectHeader += "\r\nContent-Type: text/html\r\nProxy-Connection: close\r\nLocation: ";
+            redirectHeader += redirectURL + "\r\nConnection: close\r\n\r\n";
+
+            ToBrowser.Send( redirectHeader );
+        }   return false;
+
+        break;
+
         case -50:
             message = ToBrowser.GetHost();
             filename = ERROR_DNS;
diff -urNp havp-0.86/havp/whitelist.cpp havp-0.86-redirect/havp/whitelist.cpp
--- havp-0.86/havp/whitelist.cpp	2006-03-20 10:48:59.000000000 +0200
+++ havp-0.86-redirect/havp/whitelist.cpp	2007-06-17 18:44:17.000000000 +0300
@@ -17,6 +17,7 @@
 
 #include "whitelist.h"
 #include "logfile.h"
+#include "params.h"
 
 #include <iostream>
 #include <fstream>
@@ -305,3 +306,55 @@ URLList::URLList(){
 }
 URLList::~URLList(){
 }
+
+PatternList::PatternList() {}
+
+void PatternList::LoadPatterns(const char* patternsParam)
+{
+    string patterns = Params::GetConfigString(patternsParam);
+    string pair;
+
+    size_t pos;
+    
+    do
+    { 
+        pos = patterns.find(',');
+        if (pos == string::npos)
+        {
+            pair = patterns;
+        }
+        else
+        {
+            pair = patterns.substr(0, pos);
+            // erase it from the source 
+            patterns.erase(0, pos + 1);          
+        }
+
+        size_t eqpos = pair.find('=');
+        if (eqpos != string::npos)
+        {
+            m_patternList.push_back(PatternPair::value_type(new pcrecpp::RE(pair.substr(0, eqpos)), 
+                                                            pair.substr(eqpos+1))) ;
+        }
+
+    }
+    while (pos != string::npos);
+
+}
+
+bool PatternList::FindPattern(const string& pattern, string& match)
+{
+    PatternPair::iterator it  = m_patternList.begin(),
+                          ite = m_patternList.end();
+
+    for(; it != ite; ++it)
+    {
+        if (it->first->FullMatch(pattern))
+        {
+            match.assign(it->second);
+            return true;
+        }        
+    }
+
+    return false;
+}
diff -urNp havp-0.86/havp/whitelist.h havp-0.86-redirect/havp/whitelist.h
--- havp-0.86/havp/whitelist.h	2006-03-20 10:48:59.000000000 +0200
+++ havp-0.86-redirect/havp/whitelist.h	2007-06-17 18:40:45.000000000 +0300
@@ -21,6 +21,7 @@
 #include <string>
 #include <vector>
 #include <map>
+#include <pcrecpp.h>
 
 using namespace std;
 
@@ -55,4 +56,16 @@ URLList();
 
 };
 
+class PatternList 
+{
+public:
+    PatternList();
+    void LoadPatterns(const char* patternsParam);
+    bool FindPattern(const string& pattern, string& match);
+
+private:
+    typedef vector<pair<const pcrecpp::RE*, string> > PatternPair;
+    PatternPair m_patternList;
+};
+
 #endif
