diff --git a/.gitattributes b/.gitattributes
index 5208687425a7660c427ce323eb0fd3501b033d24..3b237b0807f1ce34f0019167f3d3c682ba784208 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -333,6 +333,7 @@ testfont binary
 /src/modules/Regexp/testsuite.in foreign_ident
 /src/modules/SANE/Makefile.in foreign_ident
 /src/modules/SANE/configure.in foreign_ident
+/src/modules/SANE/sane.c foreign_ident
 /src/modules/Ssleay/Makefile.in foreign_ident
 /src/modules/Ssleay/acconfig.h foreign_ident
 /src/modules/Ssleay/configure.in foreign_ident
diff --git a/src/modules/SANE/sane.c b/src/modules/SANE/sane.c
index f4d518dc268c562997d6fed21a95b605bc107e1d..5d1655aee2ca3a1724e0fb02a7e7bbe4e3f5fb77 100644
--- a/src/modules/SANE/sane.c
+++ b/src/modules/SANE/sane.c
@@ -29,6 +29,18 @@
 
 #include "../Image/image.h"
 
+RCSID("$Id: sane.c,v 1.4 2000/03/02 19:22:23 per Exp $");
+
+/*
+**! module SANE
+**!
+**!	This module enables access to the SANE (Scanner Access Now Easy)
+**!     library from pike
+**!
+**! note
+**!	$Id: sane.c,v 1.4 2000/03/02 19:22:23 per Exp $
+*/
+
 static int sane_is_inited;
 
 struct scanner
@@ -53,6 +65,32 @@ static void push_device( SANE_Device *d )
 }
 
 
+/*
+**! method array(mapping) list-scanners()
+**!
+**!  Returns an array with all available scanners.
+**!
+**!    Example:
+**!     <pre>
+**!    Pike v0.7 release 120 running Hilfe v2.0 (Incremental Pike Frontend)
+**!   > SANE.list_scanners();
+**!     Result: ({
+**!            ([
+**!              "model":"Astra 1220S     ",
+**!              "name":"umax:/dev/scg1f",
+**!              "type":"flatbed scanner",
+**!              "vendor":"UMAX    "
+**!            ]),
+**!            ([
+**!              "model":"Astra 1220S     ",
+**!              "name":"net:lain.idonex.se:umax:/dev/scg1f",
+**!              "type":"flatbed scanner",
+**!              "vendor":"UMAX    "
+**!            ])
+**!        })
+**!
+**!     </pre>
+*/
 static void f_list_scanners( INT32 args )
 {
   SANE_Device **devices;
@@ -165,6 +203,10 @@ static void push_option_descriptor( const SANE_Option_Descriptor *o )
   f_aggregate_mapping( sp - osp );
 }
 
+/*
+**! class Scanner
+**!    Scanner s = Scanner( scanner name )
+*/
 static void f_scanner_create( INT32 args )
 {
   char *name;
@@ -175,6 +217,9 @@ static void f_scanner_create( INT32 args )
     error("Failed to open scanner \"%s\"\n", name );
 }
 
+/*
+**! function array(mapping) list_options( )
+*/
 static void f_scanner_list_options( INT32 args )
 {
   int i, n;
@@ -199,6 +244,12 @@ static int find_option( char *name, const SANE_Option_Descriptor **p )
   error("No such option: %s\n", name );
 }
 
+
+/*
+**! function void set_option( string name, mixed new_value )
+**! function void set_option( string name )
+**!    If no value is specified, the option is set to it's default value
+*/
 static void f_scanner_set_option( INT32 args )
 {
   char *name;
@@ -242,6 +293,10 @@ static void f_scanner_set_option( INT32 args )
   push_int( 0 );
 }
 
+
+/*
+**! function mixed get_option( string name )
+*/
 static void f_scanner_get_option( INT32 args )
 {
   char *name;
@@ -280,6 +335,9 @@ static void f_scanner_get_option( INT32 args )
   }
 }
 
+/*
+**! function mapping(string:int) get_parameters(  )
+*/
 static void f_scanner_get_parameters( INT32 args )
 {
   SANE_Parameters p;
@@ -359,6 +417,9 @@ static void assert_image_program()
     error("No Image.Image?!\n");
 }
 
+/*
+**! function Image.Image simple_scan(  )
+*/
 static void f_scanner_simple_scan( INT32 args )
 {
   SANE_Parameters p;
@@ -411,6 +472,9 @@ static void f_scanner_simple_scan( INT32 args )
   push_object( o );
 }
 
+/*
+**! function void row_scan(function(Image.Image,int,Scanner:void) callback)
+*/
 static void f_scanner_row_scan( INT32 args )
 {
   SANE_Parameters p;
@@ -553,6 +617,9 @@ static void nonblocking_row_scan_callback( int fd, void *_c )
   }
 }
 
+/*
+**! function void nonblocking_row_scan(function(Image.Image,int,Scanner,int:void) callback)
+*/
 static void f_scanner_nonblocking_row_scan( INT32 args )
 {
   SANE_Parameters p;