diff -Naur scintilla_org/include/SciLexer.h scintilla/include/SciLexer.h
--- scintilla_org/include/SciLexer.h	2005-04-22 13:13:18.000000000 +0200
+++ scintilla/include/SciLexer.h	2005-04-22 13:14:56.000000000 +0200
@@ -832,6 +832,7 @@
 #define SCE_HA_COMMENTBLOCK 14
 #define SCE_HA_COMMENTBLOCK2 15
 #define SCE_HA_COMMENTBLOCK3 16
+#define SCE_HA_PREPROCESSOR 17
 #define SCE_T3_DEFAULT 0
 #define SCE_T3_PREPROCESSOR 1
 #define SCE_T3_BLOCK_COMMENT 2
diff -Naur scintilla_org/include/Scintilla.iface scintilla/include/Scintilla.iface
--- scintilla_org/include/Scintilla.iface	2005-04-22 13:13:18.000000000 +0200
+++ scintilla/include/Scintilla.iface	2005-04-22 13:14:41.000000000 +0200
@@ -2657,6 +2657,7 @@
 val SCE_HA_COMMENTBLOCK=14
 val SCE_HA_COMMENTBLOCK2=15
 val SCE_HA_COMMENTBLOCK3=16
+val SCE_HA_PREPROCESSOR=17
 # Lexical states of SCLEX_TADS3
 lex TADS3=SCLEX_TADS3 SCE_T3_
 val SCE_T3_DEFAULT=0
diff -Naur scintilla_org/src/LexHaskell.cxx scintilla/src/LexHaskell.cxx
--- scintilla_org/src/LexHaskell.cxx	2005-04-22 13:13:18.000000000 +0200
+++ scintilla/src/LexHaskell.cxx	2005-04-22 13:15:28.000000000 +0200
@@ -1,19 +1,16 @@
-/******************************************************************
- *    LexHaskell.cxx
- *
+/*****************************************************************
+ *    LexHaskell.cxx 
+ *    
  *    A haskell lexer for the scintilla code control.
  *    Some stuff "lended" from LexPython.cxx and LexCPP.cxx.
  *    External lexer stuff inspired from the caml external lexer.
- *
+ *    
  *    Written by Tobias Engvall - tumm at dtek dot chalmers dot se
  *
- *
  *    TODO:
  *    * Implement a folder :)
  *    * Nice Character-lexing (stuff inside '\''), LexPython has
  *      this.
- *
- *
  *****************************************************************/
 
 #include <stdlib.h>
@@ -32,26 +29,22 @@
 #include "SciLexer.h"
 
 #ifdef BUILD_AS_EXTERNAL_LEXER
-
 #include "ExternalLexer.h"
 #include "WindowAccessor.h"
-
-#define BUILD_EXTERNAL_LEXER 0
-
 #endif
 
 // Max level of nested comments
 #define SCE_HA_COMMENTMAX SCE_HA_COMMENTBLOCK3
 
 
-enum kwType { kwOther, kwClass, kwData, kwInstance, kwImport, kwModule, kwType};
+enum kwType { kwOther, kwClass, kwData, kwInstance, kwImport, kwModule };
 
 static inline bool IsNewline(const int ch) {
    return (ch == '\n' || ch == '\r');
 }
 
 static inline bool IsWhitespace(const int ch) {
-   return (  ch == ' '
+   return (  ch == ' ' 
           || ch == '\t'
           || IsNewline(ch) );
 }
@@ -64,34 +57,57 @@
    return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '\'');
 }
 
+// Identifies an identifier on the form Something.Something
+static inline int IsUpperIdentifier (char * s) {
+   int out = 1;
+   char * pch;
+   pch = strtok(s,".");
+   while (pch != NULL) {
+      if (!isupper(pch[0]))
+         out = 0;
+      pch = strtok(NULL, ".");
+   }
+   return out;
+}
+
 static void ColorizeHaskellDoc(unsigned int startPos, int length, int initStyle,
                                WordList *keywordlists[], Accessor &styler) {
 
    WordList &keywords = *keywordlists[0];
-
+    
    int kwLast = kwOther;
-
-   StyleContext sc(startPos, length, initStyle, styler);
+   bool infix = 0;
+   
+   StyleContext sc(startPos, length, initStyle, styler);   
 
    for (; sc.More(); sc.Forward()) {
-
+      
       // Check for state end
          // Operator
       if (sc.state == SCE_HA_OPERATOR) {
-         kwLast = kwOther;
-         sc.SetState(SCE_HA_DEFAULT);
+         if ((infix == 1) && (sc.ch == '`')) {
+            infix = 0;
+            sc.ForwardSetState(SCE_HA_DEFAULT);
+         } else if (infix == 0) {
+            sc.SetState(SCE_HA_DEFAULT);
+         }
+      }
+         // Preprocessor
+      else if (sc.state == SCE_HA_PREPROCESSOR) {
+         if (IsWhitespace(sc.ch))
+            sc.SetState(SCE_HA_DEFAULT);  
       }
          // String
       else if (sc.state == SCE_HA_STRING) {
          if (sc.ch == '\"') {
             sc.ForwardSetState(SCE_HA_DEFAULT);
-         }
+         } 
       }
          // Char
       else if (sc.state == SCE_HA_CHARACTER) {
          if (sc.ch == '\'') {
             sc.ForwardSetState(SCE_HA_DEFAULT);
-         }
+         } 
       }
          // Number
       else if (sc.state == SCE_HA_NUMBER) {
@@ -101,39 +117,39 @@
       }
          // Types, constructors, etc.
       else if (sc.state == SCE_HA_CAPITAL) {
-         if (!IsAWordChar(sc.ch) || sc.ch == '.') {
+         if (!IsAWordChar(sc.ch)) {
             sc.SetState(SCE_HA_DEFAULT);
          }
-      }
+      } 
          // Identifier
       else if (sc.state == SCE_HA_IDENTIFIER) {
          if (!IsAWordChar(sc.ch)) {
             char s[100];
             sc.GetCurrent(s, sizeof(s));
             int style = SCE_HA_IDENTIFIER;
-            if ((kwLast == kwImport) || (strcmp(s,"qualified") == 0) || (strcmp(s,"as") == 0)) {
-               style = SCE_HA_IMPORT;
-            } else if (keywords.InList(s)) {
+            if (keywords.InList(s)) {
                style = SCE_HA_KEYWORD;
+            } else if (kwLast == kwImport) {
+               style = SCE_HA_IMPORT;
             } else if (kwLast == kwData) {
                style = SCE_HA_DATA;
             } else if (kwLast == kwClass) {
                style = SCE_HA_CLASS;
             } else if (kwLast == kwModule) {
                style = SCE_HA_MODULE;
-            } else if (isupper(s[0])) {
+            } else if (IsUpperIdentifier(s)) {
                style = SCE_HA_CAPITAL;
             }
             sc.ChangeState(style);
             sc.SetState(SCE_HA_DEFAULT);
-            if (style == SCE_HA_KEYWORD) {
+            if (style == SCE_HA_KEYWORD) { 
                if (0 == strcmp(s, "class"))
                   kwLast = kwClass;
                else if (0 == strcmp(s, "data"))
                   kwLast = kwData;
                else if (0 == strcmp(s, "instance"))
                   kwLast = kwInstance;
-               else if (0 == strcmp(s, "import"))
+               else if (0 == strcmp(s, "import") || 0 == strcmp(s, "qualified"))
                   kwLast = kwImport;
                else if (0 == strcmp(s, "module"))
                   kwLast = kwModule;
@@ -159,11 +175,13 @@
                sc.SetState(sc.state + 1);
          }
          else if (sc.Match("-}")) {
-            sc.Forward();
-            if (sc.state == SCE_HA_COMMENTBLOCK)
-               sc.ForwardSetState(SCE_HA_DEFAULT);
-            else
-               sc.ForwardSetState(sc.state - 1);
+            if (sc.state == SCE_HA_COMMENTBLOCK) {
+              sc.Forward();
+              sc.ForwardSetState(SCE_HA_DEFAULT);
+            }
+            else {
+              sc.SetState(sc.state - 1);
+            }
          }
       }
       // New state?
@@ -182,15 +200,24 @@
          }
          // String
          else if (sc.Match('\"')) {
-            sc.SetState(SCE_HA_STRING);
+            sc.SetState(SCE_HA_STRING); 
          }
          // Character
-         else if (sc.Match('\'') && IsWhitespace(sc.GetRelative(-1)) ) {
-            sc.SetState(SCE_HA_CHARACTER);
+         else if (sc.Match('\'') && !IsAWordChar(sc.GetRelative(-1))) {
+            sc.SetState(SCE_HA_CHARACTER); 
          }
          // Stringstart
          else if (sc.Match('\"')) {
-            sc.SetState(SCE_HA_STRING);
+            sc.SetState(SCE_HA_STRING); 
+         }
+         // Preprocessor
+         else if (sc.Match('#')) {
+            sc.SetState(SCE_HA_PREPROCESSOR);
+         }
+         // Infix operator
+         else if (sc.Match('`')) {
+            infix = 1;
+            sc.SetState(SCE_HA_OPERATOR);
          }
          // Operator
          else if (isascii(sc.ch) && isoperator(static_cast<char>(sc.ch))) {
@@ -198,17 +225,17 @@
          }
          // Keyword
          else if (IsAWordStart(sc.ch)) {
-               sc.SetState(SCE_HA_IDENTIFIER);
+            sc.SetState(SCE_HA_IDENTIFIER);
          }
-
-      }
+         
+      }            
    }
    sc.Complete();
 }
 
 // External stuff - used for dynamic-loading, not implemented in wxStyledTextCtrl yet.
 // Inspired by the caml external lexer - Credits to Robert Roessler - http://www.rftp.com
-#ifdef BUILD_EXTERNAL_LEXER
+#ifdef BUILD_AS_EXTERNAL_LEXER
 static const char* LexerName = "haskell";
 
 void EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int length, int initStyle,
@@ -228,7 +255,7 @@
       wl[i]->Set(words[i]);
    }
    wl[i] = 0;
-
+   
    ColorizeHaskellDoc(startPos, length, initStyle, wl, wa);
    wa.Flush();
    for (i=nWL-1;i>=0;i--)
@@ -239,7 +266,7 @@
 void EXT_LEXER_DECL Fold (unsigned int lexer, unsigned int startPos, int length, int initStyle,
                         char *words[], WindowID window, char *props)
 {
-
+   
 }
 
 int EXT_LEXER_DECL GetLexerCount()
