diff --git a/xmlIO.c b/xmlIO.c
index 2811058..e3c16fb 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -33,14 +33,6 @@
 #include <zlib.h>
 #endif
 
-#ifdef HAVE_SYS_MMAN_H
-#include <sys/mman.h>
-/* seems needed for Solaris */
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void *) -1)
-#endif
-#endif
-
 /* Figure a portable way to know if a file is a directory. */
 #ifndef HAVE_STAT
 #  ifdef HAVE__STAT
@@ -1955,84 +1947,6 @@
     return(ret);
 }
 
-#ifdef HAVE_SYS_MMAN_H
-typedef struct _xmlMMapContext xmlMMapContext;
-typedef xmlMMapContext *xmlMMapContextPtr;
-struct _xmlMMapContext {
-    int fd;
-    const char *mem;
-    size_t size;
-};
-
-/**
- * xmlParserInputBufferCloseMMapFile:
- * @ctxt:  the mmaped context
- *
- * Free up the resources associated to the mmaped file
- */
-static void
-xmlParserInputBufferCloseMMapFile(xmlMMapContextPtr ctxt) {
-    if (ctxt == NULL)
-	return;
-    if (ctxt->mem != (void *) MAP_FAILED)
-	munmap((char *) ctxt->mem, ctxt->size);
-    if (ctxt->fd >= 0)
-	close(ctxt->fd);
-    xmlFree(ctxt);
-}
-
-/**
- * xmlParserInputBufferCreateMMapFile:
- * @fd:  the descriptor associated to the mmaped file.
- * @base:  the mmaped start
- * @size:  the length of the memory block
- * @enc:  the charset encoding if known
- *
- * Create a buffered parser input for the progressive parsing for the input
- * from a memory area.
- *
- * Returns the new parser input or NULL
- */
-static xmlParserInputBufferPtr
-xmlParserInputBufferCreateMMapFile(int fd, const char *mem, size_t size,
-	                           xmlCharEncoding enc) {
-    xmlParserInputBufferPtr ret;
-    xmlMMapContextPtr ctxt;
-
-    if (fd < 0) return(NULL);
-    if (size <= 0) return(NULL);
-    if (mem == NULL) return(NULL);
-
-    ctxt = (xmlMMapContextPtr) xmlMalloc(sizeof(xmlMMapContext));
-    if (ctxt == NULL)
-	return(NULL);
-    ctxt->fd = fd;
-    ctxt->mem = mem;
-    ctxt->size = size;
-
-
-    ret = xmlAllocParserInputBuffer(enc);
-    if (ret != NULL) {
-        ret->context = (void *) ctxt;
-	ret->readcallback = (xmlInputReadCallback) xmlNop;
-	ret->closecallback = (xmlInputCloseCallback)
-	                       xmlParserInputBufferCloseMMapFile;
-	if (ret->buffer->content != NULL) {
-	    xmlFree(ret->buffer->content);
-	}
-	ret->buffer->alloc = XML_BUFFER_ALLOC_UNMUTABLE;
-	ret->buffer->content = (xmlChar *) mem;
-	ret->buffer->size = size;
-	ret->buffer->use = size;
-    } else {
-	xmlFree(ctxt);
-	return(NULL);
-    }
-
-    return(ret);
-}
-#endif
-
 /**
  * xmlOutputBufferCreateFd:
  * @fd:  a file descriptor number
@@ -2519,7 +2433,8 @@
  *								*
  ****************************************************************/
 
-static const char * xmlSysIDExists(const char *URL, size_t *size) {
+#ifdef LIBXML_CATALOG_ENABLED
+static int xmlSysIDExists(const char *URL) {
 #ifdef HAVE_STAT
     int ret;
     struct stat info;
@@ -2539,16 +2454,12 @@
     } else 
 	path = URL;
     ret = stat(path, &info);
-    if (ret == 0) {
-	if (size)
-	    *size = info.st_size;
-	return(path);
-    }
+    if (ret == 0)
+	return(1);
 #endif
-    if (size)
-	*size = -1;
-    return(NULL);
+    return(0);
 }
+#endif
 
 /**
  * xmlDefaultExternalEntityLoader:
@@ -2569,57 +2480,7 @@
 #ifdef LIBXML_CATALOG_ENABLED
     xmlCatalogAllow pref;
 #endif
-    const char *exist;
-    size_t length;
 
-    exist = xmlSysIDExists(URL, &length);
-#ifdef HAVE_SYS_MMAN_H
-    /*
-     * Shortcut, if asked for a file, the file is present, mmap it !
-     */
-    if ((exist != NULL) && (length > 0)) {
-	int fd = -1;
-	const char *base = NULL;
-	xmlParserInputBufferPtr buf = NULL;
-
-	if ((fd = open(exist, O_RDONLY)) >= 0) {
-	    /*
-	     * Magic test: don't drop back native compressed content support
-	     */
-	    char tmpbuf[2];
-	    if (read(fd, tmpbuf, 2) != 2)
-		goto failed;
-	    if ((tmpbuf[0] == 0x1F) && (tmpbuf[1] == 0x8B))
-		goto failed;
-
-	    base = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, 0);
-	    if (base != (void *) MAP_FAILED) {
-		buf = xmlParserInputBufferCreateMMapFile(fd, base, length,
-			                 XML_CHAR_ENCODING_NONE);
-		if (buf != NULL) {
-		    ret = xmlNewInputStream(ctxt);
-		    if (ret != NULL) {
-			ret->filename = (const char *) xmlCharStrdup(exist);
-			ret->directory = (const char *)
-			                  xmlParserGetDirectory(exist);
-			ret->buf = buf;
-			ret->base = ret->buf->buffer->content;
-			ret->cur = ret->buf->buffer->content;
-			ret->end = &ret->base[ret->buf->buffer->use];
-			return(ret);
-		    }
-		}
-	    }
-	}
-failed:
-	if (buf != NULL)
-	    xmlFreeParserInputBuffer(buf);
-	if (base != (void *) MAP_FAILED)
-	    munmap((char *) base, length);
-	if (fd >= 0)
-	    close(fd);
-    }
-#endif
 #ifdef DEBUG_EXTERNAL_ENTITIES
     xmlGenericError(xmlGenericErrorContext,
 	    "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL);
@@ -2631,7 +2492,7 @@
      */
     pref = xmlCatalogGetDefaults();
 
-    if ((pref != XML_CATA_ALLOW_NONE) && (exist == NULL)) {
+    if ((pref != XML_CATA_ALLOW_NONE) && (!xmlSysIDExists(URL))) {
 	/*
 	 * Do a local lookup
 	 */
@@ -2657,8 +2518,7 @@
 	/*
 	 * TODO: do an URI lookup on the reference
 	 */
-	exist = xmlSysIDExists(URL, &length);
-	if ((resource != NULL) && (exist == NULL)) {
+	if ((resource != NULL) && (!xmlSysIDExists((const char *)resource))) {
 	    xmlChar *tmp = NULL;
 
 	    if ((ctxt->catalogs != NULL) &&
