diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
index 6082215..b6a3d5a 100644
--- a/src/cairo-image-surface.c
+++ b/src/cairo-image-surface.c
@@ -54,6 +54,12 @@
 #define MAX_IMAGE_SIZE 32767
 #define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */
 
+static pixman_image_t *
+_cairo_pixman_image_ref(pixman_image_t *image);
+
+static pixman_bool_t
+_cairo_pixman_image_unref(pixman_image_t *image);
+
 /**
  * SECTION:cairo-image
  * @Title: Image Surfaces
@@ -335,7 +341,7 @@ _cairo_image_surface_create_with_pixman_format (unsigned char		*data,
     surface = _cairo_image_surface_create_for_pixman_image (pixman_image,
 							    pixman_format);
     if (unlikely (surface->status)) {
-	pixman_image_unref (pixman_image);
+	_cairo_pixman_image_unref (pixman_image);
 	return surface;
     }
 
@@ -731,7 +737,7 @@ _cairo_image_surface_finish (void *abstract_surface)
     cairo_image_surface_t *surface = abstract_surface;
 
     if (surface->pixman_image) {
-	pixman_image_unref (surface->pixman_image);
+	_cairo_pixman_image_unref (surface->pixman_image);
 	surface->pixman_image = NULL;
     }
 
@@ -861,6 +867,25 @@ _cairo_image_surface_unset_clip_region (cairo_image_surface_t *surface)
     pixman_image_set_clip_region32 (surface->pixman_image, NULL);
 }
 
+static pixman_image_t *
+_cairo_pixman_image_ref(pixman_image_t *image)
+{
+    CAIRO_MUTEX_LOCK(_cairo_image_pixman_ref_mutex);
+    image = pixman_image_ref(image);
+    CAIRO_MUTEX_UNLOCK(_cairo_image_pixman_ref_mutex);
+    return image;
+}
+
+static pixman_bool_t
+_cairo_pixman_image_unref(pixman_image_t *image)
+{
+    pixman_bool_t b;
+    CAIRO_MUTEX_LOCK(_cairo_image_pixman_ref_mutex);
+    b = pixman_image_unref(image);
+    CAIRO_MUTEX_UNLOCK(_cairo_image_pixman_ref_mutex);
+    return b;
+}
+
 #if HAS_ATOMIC_OPS
 static pixman_image_t *__pixman_transparent_image;
 static pixman_image_t *__pixman_black_image;
@@ -887,10 +912,10 @@ _pixman_transparent_image (void)
 	if (_cairo_atomic_ptr_cmpxchg (&__pixman_transparent_image,
 				       NULL, image))
 	{
-	    pixman_image_ref (image);
+	    _cairo_pixman_image_ref (image);
 	}
     } else {
-	pixman_image_ref (image);
+	_cairo_pixman_image_ref (image);
     }
 
     return image;
@@ -917,10 +942,10 @@ _pixman_black_image (void)
 	if (_cairo_atomic_ptr_cmpxchg (&__pixman_black_image,
 				       NULL, image))
 	{
-	    pixman_image_ref (image);
+	    _cairo_pixman_image_ref (image);
 	}
     } else {
-	pixman_image_ref (image);
+	_cairo_pixman_image_ref (image);
     }
 
     return image;
@@ -947,10 +972,10 @@ _pixman_white_image (void)
 	if (_cairo_atomic_ptr_cmpxchg (&__pixman_white_image,
 				       NULL, image))
 	{
-	    pixman_image_ref (image);
+	    _cairo_pixman_image_ref (image);
 	}
     } else {
-	pixman_image_ref (image);
+	_cairo_pixman_image_ref (image);
     }
 
     return image;
@@ -992,21 +1017,21 @@ void
 _cairo_image_reset_static_data (void)
 {
     while (n_cached)
-	pixman_image_unref (cache[--n_cached].image);
+	_cairo_pixman_image_unref (cache[--n_cached].image);
 
 #if HAS_ATOMIC_OPS
     if (__pixman_transparent_image) {
-	pixman_image_unref (__pixman_transparent_image);
+	_cairo_pixman_image_unref (__pixman_transparent_image);
 	__pixman_transparent_image = NULL;
     }
 
     if (__pixman_black_image) {
-	pixman_image_unref (__pixman_black_image);
+	_cairo_pixman_image_unref (__pixman_black_image);
 	__pixman_black_image = NULL;
     }
 
     if (__pixman_white_image) {
-	pixman_image_unref (__pixman_white_image);
+	_cairo_pixman_image_unref (__pixman_white_image);
 	__pixman_white_image = NULL;
     }
 #endif
@@ -1043,7 +1068,7 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern)
     CAIRO_MUTEX_LOCK (_cairo_image_solid_cache_mutex);
     for (i = 0; i < n_cached; i++) {
 	if (_cairo_color_equal (&cache[i].color, &pattern->color)) {
-	    image = pixman_image_ref (cache[i].image);
+	    image = _cairo_pixman_image_ref (cache[i].image);
 	    goto UNLOCK;
 	}
     }
@@ -1061,9 +1086,9 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern)
 	i = n_cached++;
     } else {
 	i = hars_petruska_f54_1_random () % ARRAY_LENGTH (cache);
-	pixman_image_unref (cache[i].image);
+	_cairo_pixman_image_unref (cache[i].image);
     }
-    cache[i].image = pixman_image_ref (image);
+    cache[i].image = _cairo_pixman_image_ref (image);
     cache[i].color = pattern->color;
 
 UNLOCK:
@@ -1138,7 +1163,7 @@ _pixman_image_for_gradient (const cairo_gradient_pattern_t *pattern,
 	if (unlikely (status != CAIRO_STATUS_SUCCESS) ||
 	    ! pixman_image_set_transform (pixman_image, &pixman_transform))
 	{
-	    pixman_image_unref (pixman_image);
+	    _cairo_pixman_image_unref (pixman_image);
 	    return NULL;
 	}
     }
@@ -1345,7 +1370,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern,
 		_cairo_matrix_is_pixman_translation (&pattern->base.matrix,
 						     filter, ix, iy))
 	    {
-		return pixman_image_ref (source->pixman_image);
+		return _cairo_pixman_image_ref (source->pixman_image);
 	    }
 
 	    pixman_image = pixman_image_create_bits (source->pixman_format,
@@ -1387,7 +1412,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern,
 		_cairo_matrix_is_pixman_translation (&pattern->base.matrix,
 						     filter, ix, iy))
 	    {
-		return pixman_image_ref (source->pixman_image);
+		return _cairo_pixman_image_ref (source->pixman_image);
 	    }
 
 	    /* Avoid sub-byte offsets, force a copy in that case. */
@@ -1448,7 +1473,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern,
 	cleanup = malloc (sizeof (*cleanup));
 	if (unlikely (cleanup == NULL)) {
 	    _cairo_surface_release_source_image (pattern->surface, image, extra);
-	    pixman_image_unref (pixman_image);
+	    _cairo_pixman_image_unref (pixman_image);
 	    return NULL;
 	}
 
@@ -1484,7 +1509,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern,
 		       ! pixman_image_set_transform (pixman_image,
 						     &pixman_transform)))
     {
-	pixman_image_unref (pixman_image);
+	_cairo_pixman_image_unref (pixman_image);
 	return NULL;
     }
     else
@@ -1595,7 +1620,7 @@ _pixman_image_for_pattern (const cairo_pattern_t *pattern,
 
 	_cairo_mesh_pattern_rasterize ((cairo_mesh_pattern_t *) pattern,
 				       data, width, height, stride, *tx, *ty);
-	r = pixman_image_ref (((cairo_image_surface_t *)image)->pixman_image);
+	r = _cairo_pixman_image_ref (((cairo_image_surface_t *)image)->pixman_image);
 	cairo_surface_destroy (image);
 	return r;
     }
@@ -1879,7 +1904,7 @@ _create_composite_mask_pattern (cairo_clip_t                  *clip,
 	pixman_region32_translate (&clip_region->rgn, extents->x, extents->y);
 
 	if (! ret) {
-	    pixman_image_unref (mask);
+	    _cairo_pixman_image_unref (mask);
 	    return NULL;
 	}
     }
@@ -1891,7 +1916,7 @@ _create_composite_mask_pattern (cairo_clip_t                  *clip,
 			&dst->base.device_transform,
 			extents, NULL);
     if (unlikely (status)) {
-	pixman_image_unref (mask);
+	_cairo_pixman_image_unref (mask);
 	return NULL;
     }
 
@@ -1900,16 +1925,16 @@ _create_composite_mask_pattern (cairo_clip_t                  *clip,
 
 	tmp = _cairo_image_surface_create_for_pixman_image (mask, PIXMAN_a8);
 	if (unlikely (tmp->status)) {
-	    pixman_image_unref (mask);
+	    _cairo_pixman_image_unref (mask);
 	    return NULL;
 	}
 
-	pixman_image_ref (mask);
+	_cairo_pixman_image_ref (mask);
 
 	status = _cairo_clip_combine_with_surface (clip, tmp, extents->x, extents->y);
 	cairo_surface_destroy (tmp);
 	if (unlikely (status)) {
-	    pixman_image_unref (mask);
+	    _cairo_pixman_image_unref (mask);
 	    return NULL;
 	}
     }
@@ -1950,7 +1975,7 @@ _clip_and_composite_with_mask (cairo_clip_t                  *clip,
 
 	    src = _pixman_white_image ();
 	    if (unlikely (src == NULL)) {
-		pixman_image_unref (mask);
+		_cairo_pixman_image_unref (mask);
 		return _cairo_error (CAIRO_STATUS_NO_MEMORY);
 	    }
 
@@ -1959,7 +1984,7 @@ _clip_and_composite_with_mask (cairo_clip_t                  *clip,
                                       0, 0, 0, 0,
                                       extents->x,      extents->y,
                                       extents->width,  extents->height);
-	    pixman_image_unref (src);
+	    _cairo_pixman_image_unref (src);
 	}
     } else {
 	pixman_image_t *src;
@@ -1967,7 +1992,7 @@ _clip_and_composite_with_mask (cairo_clip_t                  *clip,
 
 	src = _pixman_image_for_pattern (pattern, FALSE, extents, &dst->base.device_transform, &src_x, &src_y);
 	if (unlikely (src == NULL)) {
-	    pixman_image_unref (mask);
+	    _cairo_pixman_image_unref (mask);
 	    return _cairo_error (CAIRO_STATUS_NO_MEMORY);
 	}
 
@@ -1977,10 +2002,10 @@ _clip_and_composite_with_mask (cairo_clip_t                  *clip,
                                   0, 0,
                                   extents->x,          extents->y,
                                   extents->width,      extents->height);
-	pixman_image_unref (src);
+	_cairo_pixman_image_unref (src);
     }
 
-    pixman_image_unref (mask);
+    _cairo_pixman_image_unref (mask);
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -2087,7 +2112,7 @@ _clip_and_composite_combine (cairo_clip_t                  *clip,
     }
 
  CLEANUP_SURFACE:
-    pixman_image_unref (tmp);
+    _cairo_pixman_image_unref (tmp);
 
     return status;
 }
@@ -2132,7 +2157,7 @@ _clip_and_composite_source (cairo_clip_t                  *clip,
 
     src = _pixman_image_for_pattern (pattern, FALSE, extents, &dst->base.device_transform, &src_x, &src_y);
     if (unlikely (src == NULL)) {
-	pixman_image_unref (mask);
+	_cairo_pixman_image_unref (mask);
 	return _cairo_error (CAIRO_STATUS_NO_MEMORY);
     }
 
@@ -2169,8 +2194,8 @@ _clip_and_composite_source (cairo_clip_t                  *clip,
                                   extents->width, extents->height);
     }
 
-    pixman_image_unref (src);
-    pixman_image_unref (mask);
+    _cairo_pixman_image_unref (src);
+    _cairo_pixman_image_unref (mask);
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -2414,11 +2439,11 @@ _composite_traps (void                          *closure,
                               extents->x - dst_x, extents->y - dst_y,
                               extents->width, extents->height);
 
-    pixman_image_unref (mask);
+    _cairo_pixman_image_unref (mask);
 
     status = CAIRO_STATUS_SUCCESS;
  CLEANUP_SOURCE:
-    pixman_image_unref (src);
+    _cairo_pixman_image_unref (src);
 
     return status;
 }
@@ -2693,9 +2718,9 @@ _fill_unaligned_boxes (cairo_image_surface_t *dst,
 
   CLEANUP_CONVERTER:
     converter.base.destroy (&converter.base);
-    pixman_image_unref (renderer.src);
+    _cairo_pixman_image_unref (renderer.src);
   CLEANUP_MASK:
-    pixman_image_unref (renderer.mask);
+    _cairo_pixman_image_unref (renderer.mask);
 
     return status;
 }
@@ -2814,11 +2839,11 @@ _composite_unaligned_boxes (cairo_image_surface_t *dst,
                               0, 0,
                               extents->bounded.x, extents->bounded.y,
                               extents->bounded.width, extents->bounded.height);
-    pixman_image_unref (src);
+    _cairo_pixman_image_unref (src);
 
   CLEANUP:
     converter.base.destroy (&converter.base);
-    pixman_image_unref (mask);
+    _cairo_pixman_image_unref (mask);
 
     return status;
 }
@@ -2951,7 +2976,7 @@ _composite_boxes (cairo_image_surface_t *dst,
 	}
 
 	if (pattern != NULL)
-	    pixman_image_unref (src);
+	    _cairo_pixman_image_unref (src);
 
 	if (! extents->is_bounded) {
 	    status =
@@ -3272,7 +3297,7 @@ _composite_mask (void				*closure,
 
 	mask = _pixman_image_for_pattern (mask_pattern, TRUE, extents, dst_device_transform, &mask_x, &mask_y);
 	if (unlikely (mask == NULL)) {
-	    pixman_image_unref (src);
+	    _cairo_pixman_image_unref (src);
 	    return _cairo_error (CAIRO_STATUS_NO_MEMORY);
 	}
 
@@ -3291,8 +3316,8 @@ _composite_mask (void				*closure,
                               extents->width,      extents->height);
 
     if (mask != NULL)
-	pixman_image_unref (mask);
-    pixman_image_unref (src);
+	_cairo_pixman_image_unref (mask);
+    _cairo_pixman_image_unref (src);
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -3450,12 +3475,12 @@ _composite_spans (void                          *closure,
                                   0, 0, /* mask.x, mask.y */
                                   extents->x - dst_x, extents->y - dst_y,
                                   extents->width, extents->height);
-	pixman_image_unref (src);
+	_cairo_pixman_image_unref (src);
     }
 
  CLEANUP_RENDERER:
     if (dst != NULL)
-	pixman_image_unref (mask);
+	_cairo_pixman_image_unref (mask);
  CLEANUP_CONVERTER:
 #if USE_BOTOR_SCAN_CONVERTER
     converter.base.destroy (&converter.base);
@@ -3750,7 +3775,7 @@ _composite_glyphs_via_mask (void			*closure,
 
     white = _pixman_white_image ();
     if (unlikely (white == NULL)) {
-	pixman_image_unref (src);
+	_cairo_pixman_image_unref (src);
 	return _cairo_error (CAIRO_STATUS_NO_MEMORY);
     }
 
@@ -3811,7 +3836,7 @@ _composite_glyphs_via_mask (void			*closure,
                                       0, 0, 0, 0, 0, 0,
                                       extents->width, extents->height);
 
-	    pixman_image_unref (mask);
+	    _cairo_pixman_image_unref (mask);
 	    mask = new_mask;
 	    if (PIXMAN_FORMAT_RGB (mask_format))
 		pixman_image_set_component_alpha (mask, TRUE);
@@ -3850,9 +3875,9 @@ _composite_glyphs_via_mask (void			*closure,
 CLEANUP:
     _cairo_scaled_font_thaw_cache (font);
     if (mask != NULL)
-	pixman_image_unref (mask);
-    pixman_image_unref (src);
-    pixman_image_unref (white);
+	_cairo_pixman_image_unref (mask);
+    _cairo_pixman_image_unref (src);
+    _cairo_pixman_image_unref (white);
 
     return status;
 }
@@ -3947,7 +3972,7 @@ _composite_glyphs (void				*closure,
     }
     _cairo_scaled_font_thaw_cache (info->font);
 
-    pixman_image_unref (src);
+    _cairo_pixman_image_unref (src);
 
     return status;
 }
@@ -4156,7 +4181,7 @@ _cairo_image_surface_composite (cairo_operator_t	 op,
 
 	mask = _pixman_image_for_pattern (mask_pattern, TRUE, &extents.mask, &dst->base.device_transform, &mask_offset_x, &mask_offset_y);
 	if (unlikely (mask == NULL)) {
-	    pixman_image_unref (src);
+	    _cairo_pixman_image_unref (src);
 	    return _cairo_error (CAIRO_STATUS_NO_MEMORY);
 	}
 
@@ -4168,7 +4193,7 @@ _cairo_image_surface_composite (cairo_operator_t	 op,
                                   mask_y + mask_offset_y,
 				  dst_x, dst_y, width, height);
 
-	pixman_image_unref (mask);
+	_cairo_pixman_image_unref (mask);
     } else {
 	pixman_image_composite32 (_pixman_operator (op),
                                   src, NULL, dst->pixman_image,
@@ -4178,7 +4203,7 @@ _cairo_image_surface_composite (cairo_operator_t	 op,
                                   dst_x, dst_y, width, height);
     }
 
-    pixman_image_unref (src);
+    _cairo_pixman_image_unref (src);
 
     if (! extents.is_bounded)
 	status = _cairo_image_surface_fixup_unbounded (dst, &extents, NULL);
@@ -4403,7 +4428,7 @@ _cairo_image_surface_span_renderer_destroy (void *abstract_renderer)
     if (renderer == NULL)
 	return;
 
-    pixman_image_unref (renderer->mask);
+    _cairo_pixman_image_unref (renderer->mask);
 
     free (renderer);
 }
diff --git a/src/cairo-mutex-list-private.h b/src/cairo-mutex-list-private.h
index 7d5ba02..b06f131 100644
--- a/src/cairo-mutex-list-private.h
+++ b/src/cairo-mutex-list-private.h
@@ -47,6 +47,8 @@ CAIRO_MUTEX_DECLARE (_cairo_scaled_font_map_mutex)
 CAIRO_MUTEX_DECLARE (_cairo_scaled_glyph_page_cache_mutex)
 CAIRO_MUTEX_DECLARE (_cairo_scaled_font_error_mutex)
 
+CAIRO_MUTEX_DECLARE (_cairo_image_pixman_ref_mutex)
+
 #if CAIRO_HAS_FT_FONT
 CAIRO_MUTEX_DECLARE (_cairo_ft_unscaled_font_map_mutex)
 #endif
