diff --git a/magick/montage.c b/magick/montage.c
index 904665c..75f5c49 100644
--- a/magick/montage.c
+++ b/magick/montage.c
@@ -268,31 +268,31 @@
 %
 */
 
-static void GetMontageGeometry(char *geometry,const unsigned long number_images,
-  long *x_offset,long *y_offset,unsigned long *tiles_per_column,
-  unsigned long *tiles_per_row)
+static void GetMontageGeometry(char *geometry,const size_t number_images,
+  ssize_t *x_offset,ssize_t *y_offset,size_t *tiles_per_column,
+  size_t *tiles_per_row)
 {
   *tiles_per_column=0;
   *tiles_per_row=0;
   (void) GetGeometry(geometry,x_offset,y_offset,tiles_per_row,tiles_per_column);
   if ((*tiles_per_column == 0) && (*tiles_per_row == 0))
-    *tiles_per_column=(unsigned long) sqrt((double) number_images);
+    *tiles_per_column=(size_t) sqrt((double) number_images);
   if (*tiles_per_column == 0)
-    *tiles_per_column=(unsigned long)
+    *tiles_per_column=(size_t)
       ceil((double) number_images/(*tiles_per_row));
   if (*tiles_per_row == 0)
-    *tiles_per_row=(unsigned long)
+    *tiles_per_row=(size_t)
       ceil((double) number_images/(*tiles_per_column));
 }
 
-static inline long MagickMax(const long x,const long y)
+static inline ssize_t MagickMax(const ssize_t x,const ssize_t y)
 {
   if (x > y)
     return(x);
   return(y);
 }
 
-static inline long MagickMin(const long x,const long y)
+static inline ssize_t MagickMin(const ssize_t x,const ssize_t y)
 {
   if (x < y)
     return(x);
@@ -364,7 +364,7 @@
   ImageInfo
     *clone_info;
 
-  long
+  ssize_t
     tile,
     x,
     x_offset,
@@ -385,7 +385,7 @@
   MagickProgressMonitor
     progress_monitor;
 
-  register long
+  register ssize_t
     i;
 
   RectangleInfo
@@ -399,7 +399,7 @@
   TypeMetric
     metrics;
 
-  unsigned long
+  size_t
     bevel_width,
     border_width,
     height,
@@ -433,7 +433,7 @@
   if (master_list == (Image **) NULL)
     ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
   thumbnail=NewImageList();
-  for (i=0; i < (long) number_images; i++)
+  for (i=0; i < (ssize_t) number_images; i++)
   {
     image=CloneImage(image_list[i],0,0,MagickTrue,exception);
     if (image == (Image *) NULL)
@@ -447,16 +447,17 @@
       break;
     image_list[i]=thumbnail;
     (void) SetImageProgressMonitor(image,progress_monitor,image->client_data);
-    proceed=SetImageProgress(image,TileImageTag,i,number_images);
+    proceed=SetImageProgress(image,TileImageTag,(MagickOffsetType) i,
+      number_images);
     if (proceed == MagickFalse)
       break;
     image=DestroyImage(image);
   }
-  if (i < (long) number_images)
+  if (i < (ssize_t) number_images)
     {
       if (thumbnail == (Image *) NULL)
         i--;
-      for (tile=0; (long) tile <= i; tile++)
+      for (tile=0; (ssize_t) tile <= i; tile++)
         if (image_list[tile] != (Image *) NULL)
           image_list[tile]=DestroyImage(image_list[tile]);
       master_list=(Image **) RelinquishMagickMemory(master_list);
@@ -465,17 +466,17 @@
   /*
     Sort image list by increasing tile number.
   */
-  for (i=0; i < (long) number_images; i++)
+  for (i=0; i < (ssize_t) number_images; i++)
     if (image_list[i]->scene == 0)
       break;
-  if (i == (long) number_images)
+  if (i == (ssize_t) number_images)
     qsort((void *) image_list,(size_t) number_images,sizeof(*image_list),
       SceneCompare);
   /*
     Determine tiles per row and column.
   */
-  tiles_per_column=(unsigned long) sqrt((double) number_images);
-  tiles_per_row=(unsigned long) ceil((double) number_images/tiles_per_column);
+  tiles_per_column=(size_t) sqrt((double) number_images);
+  tiles_per_row=(size_t) ceil((double) number_images/tiles_per_column);
   x_offset=0;
   y_offset=0;
   if (montage_info->tile != (char *) NULL)
@@ -486,8 +487,8 @@
   */
   concatenate=MagickFalse;
   SetGeometry(image_list[0],&extract_info);
-  extract_info.x=(long) montage_info->border_width;
-  extract_info.y=(long) montage_info->border_width;
+  extract_info.x=(ssize_t) montage_info->border_width;
+  extract_info.y=(ssize_t) montage_info->border_width;
   if (montage_info->geometry != (char *) NULL)
     {
       /*
@@ -516,17 +517,17 @@
       if ((flags & HeightValue) == 0)
         frame_info.height=frame_info.width;
       if ((flags & XiValue) == 0)
-        frame_info.outer_bevel=(long) frame_info.width/2;
+        frame_info.outer_bevel=(ssize_t) frame_info.width/2;
       if ((flags & PsiValue) == 0)
         frame_info.inner_bevel=frame_info.outer_bevel;
-      frame_info.x=(long) frame_info.width;
-      frame_info.y=(long) frame_info.height;
-      bevel_width=(unsigned long) MagickMax(frame_info.inner_bevel,
+      frame_info.x=(ssize_t) frame_info.width;
+      frame_info.y=(ssize_t) frame_info.height;
+      bevel_width=(size_t) MagickMax(frame_info.inner_bevel,
         frame_info.outer_bevel);
-      border_width=(unsigned long) MagickMax((long) frame_info.width,
-        (long) frame_info.height);
+      border_width=(size_t) MagickMax((ssize_t) frame_info.width,
+        (ssize_t) frame_info.height);
     }
-  for (i=0; i < (long) number_images; i++)
+  for (i=0; i < (ssize_t) number_images; i++)
   {
     if (image_list[i]->columns > extract_info.width)
       extract_info.width=image_list[i]->columns;
@@ -562,10 +563,10 @@
   title=InterpretImageProperties(clone_info,image_list[0],montage_info->title);
   title_offset=0;
   if (montage_info->title != (char *) NULL)
-    title_offset=(unsigned long) (2*(metrics.ascent-metrics.descent)*
+    title_offset=(size_t) (2*(metrics.ascent-metrics.descent)*
       MultilineCensus(title)+2*extract_info.y);
   number_lines=0;
-  for (i=0; i < (long) number_images; i++)
+  for (i=0; i < (ssize_t) number_images; i++)
   {
     value=GetImageProperty(image_list[i],"label");
     if (value == (const char *) NULL)
@@ -581,8 +582,8 @@
   montage->scene=0;
   images_per_page=(number_images-1)/(tiles_per_row*tiles_per_column)+1;
   tiles=0;
-  total_tiles=(unsigned long) number_images;
-  for (i=0; i < (long) images_per_page; i++)
+  total_tiles=(size_t) number_images;
+  for (i=0; i < (ssize_t) images_per_page; i++)
   {
     /*
       Determine bounding box.
@@ -594,14 +595,14 @@
       GetMontageGeometry(montage_info->tile,number_images,&x_offset,&y_offset,
         &sans,&sans);
     tiles_per_page=tiles_per_row*tiles_per_column;
-    y_offset+=(long) title_offset;
+    y_offset+=(ssize_t) title_offset;
     max_height=0;
     bounds.width=0;
     bounds.height=0;
     width=0;
-    for (tile=0; tile < (long) tiles_per_page; tile++)
+    for (tile=0; tile < (ssize_t) tiles_per_page; tile++)
     {
-      if (tile < (long) number_images)
+      if (tile < (ssize_t) number_images)
         {
           width=concatenate != MagickFalse ? image_list[tile]->columns :
             extract_info.width;
@@ -609,9 +610,9 @@
             max_height=image_list[tile]->rows;
         }
       x_offset+=width+(extract_info.x+border_width)*2;
-      if (x_offset > (long) bounds.width)
-        bounds.width=(unsigned long) x_offset;
-      if (((tile+1) == (long) tiles_per_page) ||
+      if (x_offset > (ssize_t) bounds.width)
+        bounds.width=(size_t) x_offset;
+      if (((tile+1) == (ssize_t) tiles_per_page) ||
           (((tile+1) % tiles_per_row) == 0))
         {
           x_offset=0;
@@ -619,11 +620,11 @@
             GetMontageGeometry(montage_info->tile,number_images,&x_offset,&y,
               &sans,&sans);
           height=concatenate != MagickFalse ? max_height : extract_info.height;
-          y_offset+=(unsigned long) (height+(extract_info.y+border_width)*2+
+          y_offset+=(size_t) (height+(extract_info.y+border_width)*2+
             (metrics.ascent-metrics.descent+4)*number_lines+
             (montage_info->shadow != MagickFalse ? 4 : 0));
-          if (y_offset > (long) bounds.height)
-            bounds.height=(unsigned long) y_offset;
+          if (y_offset > (ssize_t) bounds.height)
+            bounds.height=(size_t) y_offset;
           max_height=0;
         }
     }
@@ -643,7 +644,7 @@
     montage->montage=AcquireString((char *) NULL);
     tile=0;
     extent=1;
-    while (tile < MagickMin((long) tiles_per_page,(long) number_images))
+    while (tile < MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images))
     {
       extent+=strlen(image_list[tile]->filename)+1;
       tile++;
@@ -658,15 +659,15 @@
     if (montage_info->tile != (char *) NULL)
       GetMontageGeometry(montage_info->tile,number_images,&x_offset,&y_offset,
         &sans,&sans);
-    y_offset+=(long) title_offset;
+    y_offset+=(ssize_t) title_offset;
     (void) FormatMagickString(montage->montage,MaxTextExtent,"%ldx%ld%+ld%+ld",
-      (long) (extract_info.width+(extract_info.x+border_width)*2),
-      (long) (extract_info.height+(extract_info.y+border_width)*2+
+      (ssize_t) (extract_info.width+(extract_info.x+border_width)*2),
+      (ssize_t) (extract_info.height+(extract_info.y+border_width)*2+
       (metrics.ascent-metrics.descent+4)*number_lines+
       (montage_info->shadow != MagickFalse ? 4 : 0)),x_offset,y_offset);
     *montage->directory='\0';
     tile=0;
-    while (tile < MagickMin((long) tiles_per_page,(long) number_images))
+    while (tile < MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images))
     {
       (void) ConcatenateMagickString(montage->directory,
         image_list[tile]->filename,extent);
@@ -696,8 +697,8 @@
         clone_info->pointsize*=2.0;
         (void) GetTypeMetrics(image_list[0],clone_info,&metrics);
         (void) FormatMagickString(geometry,MaxTextExtent,"%lux%lu%+ld%+ld",
-          montage->columns,(unsigned long) (metrics.ascent-metrics.descent),
-          0L,(long) extract_info.y+4);
+          montage->columns,(size_t) (metrics.ascent-metrics.descent),
+          0L,(ssize_t) extract_info.y+4);
         (void) CloneString(&clone_info->geometry,geometry);
         (void) CloneString(&clone_info->text,title);
         (void) AnnotateImage(montage,clone_info);
@@ -714,9 +715,9 @@
       GetMontageGeometry(montage_info->tile,number_images,&x_offset,&y_offset,
         &sans,&sans);
     x_offset+=extract_info.x;
-    y_offset+=(long) title_offset+extract_info.y;
+    y_offset+=(ssize_t) title_offset+extract_info.y;
     max_height=0;
-    for (tile=0; tile < MagickMin((long) tiles_per_page,(long) number_images); tile++)
+    for (tile=0; tile < MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images); tile++)
     {
       /*
         Copy this tile to the composite.
@@ -767,8 +768,8 @@
       (void) FormatMagickString(tile_geometry,MaxTextExtent,"%lux%lu+0+0",
         image->columns,image->rows);
       flags=ParseGravityGeometry(tile_image,tile_geometry,&geometry,exception);
-      x=(long) (geometry.x+border_width);
-      y=(long) (geometry.y+border_width);
+      x=(ssize_t) (geometry.x+border_width);
+      y=(ssize_t) (geometry.y+border_width);
       if ((montage_info->frame != (char *) NULL) && (bevel_width != 0))
         {
           FrameInfo
@@ -785,7 +786,7 @@
           extract_info.height=height+2*frame_info.height;
           value=GetImageProperty(image,"label");
           if (value != (const char *) NULL)
-            extract_info.height+=(unsigned long) ((metrics.ascent-
+            extract_info.height+=(size_t) ((metrics.ascent-
               metrics.descent+4)*MultilineCensus(value));
           frame_image=FrameImage(image,&extract_info,exception);
           if (frame_image != (Image *) NULL)
@@ -833,7 +834,7 @@
               */
               (void) FormatMagickString(geometry,MaxTextExtent,
                 "%lux%lu%+ld%+ld",(montage_info->frame ? image->columns :
-                width)-2*border_width,(unsigned long) (metrics.ascent-
+                width)-2*border_width,(size_t) (metrics.ascent-
                 metrics.descent+4)*MultilineCensus(value),x_offset+
                 border_width,(montage_info->frame ? y_offset+height+
                 border_width+4 : y_offset+extract_info.height+border_width+
@@ -844,11 +845,11 @@
             }
         }
       x_offset+=width+(extract_info.x+border_width)*2;
-      if (((tile+1) == (long) tiles_per_page) ||
+      if (((tile+1) == (ssize_t) tiles_per_page) ||
           (((tile+1) % tiles_per_row) == 0))
         {
           x_offset=extract_info.x;
-          y_offset+=(unsigned long) (height+(extract_info.y+border_width)*2+
+          y_offset+=(size_t) (height+(extract_info.y+border_width)*2+
             (metrics.ascent-metrics.descent+4)*number_lines+
             (montage_info->shadow != MagickFalse ? 4 : 0));
           max_height=0;
@@ -866,7 +867,7 @@
       image=DestroyImage(image);
       tiles++;
     }
-    if ((i+1) < (long) images_per_page)
+    if ((i+1) < (ssize_t) images_per_page)
       {
         /*
           Allocate next image structure.