diff -Naur mapserver-5.2.0-svn/mapcontext.c mapserver-5.2.0-ignf/mapcontext.c
--- mapserver-5.2.0-svn/mapcontext.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapcontext.c	2008-10-14 11:35:15.000000000 +0200
@@ -1075,7 +1075,13 @@
               if(strlen(pszProj) > 10)
               {
                   pszProj = (char*) malloc(sizeof(char) * (strlen(pszProj)));
-                  sprintf( pszProj, "EPSG:%s", 
+
+/* IGN 2007-12-28 BEGIN */
+                  if (strstr(pszProj,"IGNF") != NULL)
+                    sprintf( pszProj, "%s", pszProj);
+                  else
+/* IGN 2007-12-28 END   */
+                   sprintf( pszProj, "EPSG:%s", 
                            map->projection.args[map->projection.numargs-1]+10);
                   msInsertHashTable(&(layer->metadata),"wms_srs", pszProj);
               }
diff -Naur mapserver-5.2.0-svn/mapfile.c mapserver-5.2.0-ignf/mapfile.c
--- mapserver-5.2.0-svn/mapfile.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapfile.c	2008-10-15 12:07:10.000000000 +0200
@@ -1092,6 +1092,17 @@
       p->args[0] = strdup(init_string);
       p->numargs = 1;
   }
+  else if (strncasecmp(value, "IGNF:", 5) == 0)
+  {
+      char init_string[100];
+
+      /* translate into PROJ.4 format. */
+      sprintf( init_string, "init=IGNF:%s", value+5 );
+
+      p->args = (char**)malloc(sizeof(char*) * 2);
+      p->args[0] = strdup(init_string);
+      p->numargs = 1;
+  }
   else if (strncasecmp(value, "urn:ogc:def:crs:EPSG:",21) == 0)
   { /* this is very preliminary urn support ... expand later */ 
       char init_string[100];
diff -Naur mapserver-5.2.0-svn/maplayer.c mapserver-5.2.0-ignf/maplayer.c
--- mapserver-5.2.0-svn/maplayer.c	2008-10-15 09:35:22.000000000 +0200
+++ mapserver-5.2.0-ignf/maplayer.c	2008-10-14 11:21:53.000000000 +0200
@@ -26,7 +26,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  ****************************************************************************/
-/*NV*/
+
 #include "mapserver.h"
 #include "maptime.h"
 #include "mapogcfilter.h"
diff -Naur mapserver-5.2.0-svn/mapogcfilter.c mapserver-5.2.0-ignf/mapogcfilter.c
--- mapserver-5.2.0-svn/mapogcfilter.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapogcfilter.c	2008-10-15 14:33:52.000000000 +0200
@@ -131,7 +131,21 @@
         if (tokens && nTokens == 2)
         {
             char szTmp[32];
+/* IGN 2007-12-28 BEGIN */
+#if 0
             sprintf(szTmp, "init=epsg:%s",tokens[1]);
+#else
+            if (strstr(pszEpsg,"RIG") != NULL)
+            {
+              sprintf(szTmp, "init=IGNF:%s",tokens[1]);
+            }
+            else
+            {
+              sprintf(szTmp, "init=epsg:%s",tokens[1]);
+            }
+#endif /* 0 */
+/* IGN 2007-12-28 END   */
+
             msInitProjection(psProj);
             if (msLoadProjectionString(psProj, szTmp) == 0)
               nStatus = MS_TRUE;
@@ -161,6 +175,16 @@
                 if (msLoadProjectionString(psProj, szTmp) == 0)
                   nStatus = MS_TRUE;
             }
+/* IGN 2007-12-28 BEGIN */
+            else if (strcmp(tokens[0],"IGNF") == 0)
+            {
+                char szTmp[32];
+                sprintf(szTmp, "init=IGNF:%s",tokens[1]);
+                msInitProjection(psProj);
+                if (msLoadProjectionString(psProj, szTmp) == 0)
+                  nStatus = MS_TRUE;
+            }
+/* IGN 2007-12-28 END   */
         }
         if (tokens)
           msFreeCharArray(tokens, nTokens);
@@ -917,7 +941,20 @@
         if (tokens && nTokens == 2)
         {
             char szTmp[32];
+/* IGN 2007-12-28 BEGIN */
+#if 0
             sprintf(szTmp, "init=epsg:%s",tokens[1]);
+#else
+            if (strstr(szEPSG,"RIG") != NULL)
+            {
+              sprintf(szTmp, "init=IGNF:%s",tokens[1]);
+            }
+            else
+            {
+              sprintf(szTmp, "init=epsg:%s",tokens[1]);
+            }
+#endif /* 0 */
+/* IGN 2007-12-28 END   */
             msInitProjection(&sProjTmp);
             if (msLoadProjectionString(&sProjTmp, szTmp) == 0)
               msProjectRect(&sProjTmp, &map->projection,  &sQueryRect);
@@ -947,6 +984,16 @@
                 if (msLoadProjectionString(&sProjTmp, szTmp) == 0)
                   msProjectRect(&sProjTmp, &map->projection,  &sQueryRect);
             }
+/* IGN 2007-12-28 BEGIN */
+            else if (strcmp(tokens[0],"IGNF") == 0)
+            {
+                char szTmp[32];
+                sprintf(szTmp, "init=IGNF:%s",tokens[1]);
+                msInitProjection(&sProjTmp);
+                if (msLoadProjectionString(&sProjTmp, szTmp) == 0)
+                  msProjectRect(&sProjTmp, &map->projection,  &sQueryRect);
+            }
+/* IGN 2007-12-28 END   */
         }
         if (tokens)
           msFreeCharArray(tokens, nTokens);
diff -Naur mapserver-5.2.0-svn/mapows.c mapserver-5.2.0-ignf/mapows.c
--- mapserver-5.2.0-svn/mapows.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapows.c	2008-10-14 13:34:18.000000000 +0200
@@ -1562,6 +1562,11 @@
   } else if (proj && proj->numargs > 0 && strncasecmp(proj->args[0], "AUTO:", 5) == 0 ) {
     return proj->args[0];
   }
+/* IGN 2007-12-28 BEGIN */
+  else if (proj && proj->numargs > 0 && (value = strstr(proj->args[0], "init=IGNF:")) != NULL && strlen(value) < 20) {
+    sprintf(epsgCode, "IGNF:%s", value+9);
+  }
+/* IGN 2007-12-28 END   */
 
   return NULL;
 }
diff -Naur mapserver-5.2.0-svn/mapwcs.c mapserver-5.2.0-ignf/mapwcs.c
--- mapserver-5.2.0-svn/mapwcs.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapwcs.c	2008-10-15 11:35:24.000000000 +0200
@@ -1440,6 +1440,7 @@
       crs_to_use = params->crs;
 
     if (strncasecmp(crs_to_use, "EPSG:", 5) == 0
+        || strncasecmp(crs_to_use, "IGNF:", 5) == 0
         || strncasecmp(crs_to_use,"urn:ogc:def:crs:",16) == 0 ) {
       if (msLoadProjectionString(&(map->projection), (char *) crs_to_use) != 0)
           return msWCSException( map, NULL, NULL,params->version);
diff -Naur mapserver-5.2.0-svn/mapwfs.c mapserver-5.2.0-ignf/mapwfs.c
--- mapserver-5.2.0-svn/mapwfs.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapwfs.c	2008-10-14 14:15:50.000000000 +0200
@@ -1476,6 +1476,16 @@
 	return msWFSException(map, "mapserv", "NoApplicableCode", paramsObj->pszVersion);
       }
     }
+/* IGN 2007-12-28 BEGIN */
+    else if (pszOutputSRS && strncasecmp(pszOutputSRS, "IGNF:", 5) == 0) {
+      char szBuf[32];
+      sprintf(szBuf, "init=IGNF:%s", pszOutputSRS+5);
+
+      if (msLoadProjectionString(&(map->projection), szBuf) != 0)
+        msSetError(MS_WFSERR, "msLoadProjectionString() failed", "msWFSGetFeature()");
+        return msWFSException(map, "mapserv", "NoApplicableCode", paramsObj->pszVersion);
+    }
+/* IGN 2007-12-28 END   */
 
     /*
     ** Perform Query (only BBOX for now)
diff -Naur mapserver-5.2.0-svn/mapwms.c mapserver-5.2.0-ignf/mapwms.c
--- mapserver-5.2.0-svn/mapwms.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapwms.c	2008-10-14 14:18:58.000000000 +0200
@@ -510,6 +510,13 @@
           map->units = iUnits;
         */
       }
+/* IGN 2007-12-28 BEGIN */
+      else if (strncasecmp(values[i], "IGNF:", 5) == 0)
+      {
+        snprintf(srsbuffer, 100, "init=%s",  values[i]);
+        snprintf(epsgbuf, 100, "IGNF:%s",values[i]+5);
+      }
+/* IGN 2007-12-28 END   */
       else
       {
         msSetError(MS_WMSERR,
diff -Naur mapserver-5.2.0-svn/mapwmslayer.c mapserver-5.2.0-ignf/mapwmslayer.c
--- mapserver-5.2.0-svn/mapwmslayer.c	2008-10-14 15:33:29.000000000 +0200
+++ mapserver-5.2.0-ignf/mapwmslayer.c	2008-10-15 14:14:51.000000000 +0200
@@ -548,7 +548,12 @@
                                            NULL, NULL, MS_TRUE)) != NULL &&
         (pszEPSG = strdup(pszEPSG)) != NULL &&
         (strncasecmp(pszEPSG, "EPSG:", 5) == 0 ||
-         strncasecmp(pszEPSG, "AUTO:", 5) == 0) )
+         strncasecmp(pszEPSG, "AUTO:", 5) == 0 
+/* IGN 2007-12-28 BEGIN */
+         || strncasecmp(pszEPSG, "IGNF:", 5) == 0
+/* IGN 2007-12-28 END   */
+       ))
+
     {
         const char *pszLyrEPSG, *pszFound;
         int nLen;
@@ -584,7 +589,12 @@
                                             "MO", MS_TRUE)) == NULL ||
          (pszEPSG = strdup(pszEPSG)) == NULL ||
          (strncasecmp(pszEPSG, "EPSG:", 5) != 0 &&
-          strncasecmp(pszEPSG, "AUTO:", 5) != 0 ) ) )
+          strncasecmp(pszEPSG, "AUTO:", 5) != 0 ) 
+/* IGN 2007-12-28 BEGIN */
+         && strncasecmp(pszEPSG, "IGNF:", 5) != 0
+/* IGN 2007-12-28 END   */
+        ))
+
     {
         msSetError(MS_WMSCONNERR, "Layer must have an EPSG or AUTO projection code (in its PROJECTION object or wms_srs metadata)", "msBuildWMSLayerURL()");
         if (pszEPSG) free(pszEPSG);
@@ -628,6 +638,15 @@
             if (msLoadProjectionString(&(lp->projection), szProj) != 0)
                 return MS_FAILURE;
         }
+/* IGN 2007-12-28 BEGIN */
+        else if (strncasecmp(pszEPSG, "IGNF:", 5) == 0)
+        {
+            char szProj[20];
+            sprintf(szProj, "init=IGNF:%s", pszEPSG+5);
+            if (msLoadProjectionString(&(lp->projection), szProj) != 0)
+                return MS_FAILURE;
+        }
+/* IGN 2007-12-28 END   */
         else
         {
             if (msLoadProjectionString(&(lp->projection), pszEPSG) != 0)

