Index: frmts/netcdf/netcdfdataset.h
===================================================================
--- frmts/netcdf/netcdfdataset.h	(revision 15685)
+++ frmts/netcdf/netcdfdataset.h	(working copy)
@@ -153,6 +153,7 @@
     int          *paDimIds;
     size_t        xdim, ydim;
     int           nDimXid, nDimYid;
+    bool          bBottomUp;
 
 		netCDFDataset( );
 		~netCDFDataset( );
Index: frmts/netcdf/netcdfdataset.cpp
===================================================================
--- frmts/netcdf/netcdfdataset.cpp	(revision 15685)
+++ frmts/netcdf/netcdfdataset.cpp	(working copy)
@@ -495,7 +495,12 @@
 /* -------------------------------------------------------------------- */
 	
     start[nBandXPos] = 0;          // x dim can move arround in array
-    start[nBandYPos] = nBlockYOff; // y
+    // check y order
+    if( ( ( netCDFDataset *) poDS )->bBottomUp ) {
+        start[nBandYPos] = ( ( netCDFDataset * ) poDS )->ydim - 1 - nBlockYOff;
+    } else {
+        start[nBandYPos] = nBlockYOff; // y
+    }
         
     edge[nBandXPos] = nBlockXSize; 
     edge[nBandYPos] = 1;
@@ -596,6 +601,7 @@
     papszName        = NULL;
     pszFilename      = NULL;
     cdfid             = 0;
+    bBottomUp        = FALSE;
 }
 
 
@@ -678,6 +684,7 @@
     double       *pdfXCoord;
     double       *pdfYCoord;
     char         szDimNameX[ MAX_NC_NAME ];
+    char         szDimNameY[ MAX_NC_NAME ];
     int          nSpacingBegin;
     int          nSpacingMiddle;
     int          nSpacingLast;
@@ -728,6 +735,11 @@
 	szDimNameX[i] = tolower( ( poDS->papszDimName[poDS->nDimXid] )[i] );
     }
     szDimNameX[3] = '\0';
+    for( i = 0; (i < strlen( poDS->papszDimName[ poDS->nDimYid ] )  && 
+		 i < 3 ); i++ ) {
+	szDimNameY[i] = tolower( ( poDS->papszDimName[poDS->nDimYid] )[i] );
+    }
+    szDimNameY[3] = '\0';
 
 /* -------------------------------------------------------------------- */
 /*      Read grid_mappinginformation and set projections               */
@@ -932,8 +944,10 @@
                     yMinMax[1] = pdfYCoord[ydim-1];
                     node_offset = 0;
                 }
+                /* for CF-1 conventions, assume bottom first */
+                if( EQUAL( szDimNameY, "lat" ) && pdfYCoord[0] < pdfYCoord[1] )
+                    poDS->bBottomUp = TRUE;
 
-#ifdef notdef
                 // Check for reverse order of y-coordinate
                 if ( yMinMax[0] > yMinMax[1] ) {
                     dummy[0] = yMinMax[1];
@@ -941,7 +955,6 @@
                     yMinMax[0] = dummy[0];
                     yMinMax[1] = dummy[1];
                 }
-#endif
 
                 poDS->adfGeoTransform[0] = xMinMax[0];
                 poDS->adfGeoTransform[2] = 0;

