diff --git a/intern/cycles/scene/image.cpp b/intern/cycles/scene/image.cpp
index 1f4d129950d142a9867e830df291a48a8890250d..5559bc8c29b92817e1572ba356d55512d6f1287f 100644
--- a/intern/cycles/scene/image.cpp
+++ b/intern/cycles/scene/image.cpp
@@ -122,7 +122,7 @@ ImageMetaData ImageHandle::metadata()
     return ImageMetaData();
   }
 
-  ImageManager::Image *img = manager->images[tile_slots.front()];
+  ImageManager::Image *img = manager->get_image_slot(tile_slots.front());
   manager->load_image_metadata(img);
   return img->metadata;
 }
@@ -134,7 +134,7 @@ int ImageHandle::svm_slot(const int tile_index) const
   }
 
   if (manager->osl_texture_system) {
-    ImageManager::Image *img = manager->images[tile_slots[tile_index]];
+    ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]);
     if (!img->loader->osl_filepath().empty()) {
       return -1;
     }
@@ -153,12 +153,12 @@ vector<int4> ImageHandle::get_svm_slots() const
     int4 node;
 
     size_t slot = tile_slots[2 * i];
-    node.x = manager->images[slot]->loader->get_tile_number();
+    node.x = manager->get_image_slot(slot)->loader->get_tile_number();
     node.y = slot;
 
     if ((2 * i + 1) < tile_slots.size()) {
       slot = tile_slots[2 * i + 1];
-      node.z = manager->images[slot]->loader->get_tile_number();
+      node.z = manager->get_image_slot(slot)->loader->get_tile_number();
       node.w = slot;
     }
     else {
@@ -178,8 +178,8 @@ device_texture *ImageHandle::image_memory(const int tile_index) const
     return NULL;
   }
 
-  ImageManager::Image *img = manager->images[tile_slots[tile_index]];
-  return img ? img->mem : NULL;
+  ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]);
+  return img ? img->mem : nullptr;
 }
 
 VDBImageLoader *ImageHandle::vdb_loader(const int tile_index) const
@@ -188,7 +188,7 @@ VDBImageLoader *ImageHandle::vdb_loader(const int tile_index) const
     return NULL;
   }
 
-  ImageManager::Image *img = manager->images[tile_slots[tile_index]];
+  ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]);
 
   if (img == NULL) {
     return NULL;
@@ -508,6 +508,13 @@ void ImageManager::remove_image_user(size_t slot)
   }
 }
 
+ImageManager::Image *ImageManager::get_image_slot(const size_t slot)
+{
+  /* Need mutex lock, images vector might get resized by another thread. */
+  const thread_scoped_lock device_lock(images_mutex);
+  return images[slot];
+}
+
 static bool image_associate_alpha(ImageManager::Image *img)
 {
   /* For typical RGBA images we let OIIO convert to associated alpha,
diff --git a/intern/cycles/scene/image.h b/intern/cycles/scene/image.h
index ee919aaa7691785fe6c434e1b884dbe0ec08689e..d63db7fb7db1c77a36d40c05b8a125b3827a71cb 100644
--- a/intern/cycles/scene/image.h
+++ b/intern/cycles/scene/image.h
@@ -227,6 +227,7 @@ class ImageManager {
   size_t add_image_slot(ImageLoader *loader, const ImageParams &params, const bool builtin);
   void add_image_user(size_t slot);
   void remove_image_user(size_t slot);
+  Image *get_image_slot(const size_t slot);
 
   void load_image_metadata(Image *img);