diff --git a/__tests__/src/sagas/iiif.test.js b/__tests__/src/sagas/iiif.test.js
index 6ca83b90a8991dc313e9b465b21566b4bcda0d08..2172dd663b97a4b032cd67070c1c2ace918e6c1f 100644
--- a/__tests__/src/sagas/iiif.test.js
+++ b/__tests__/src/sagas/iiif.test.js
@@ -166,6 +166,7 @@ describe('IIIF sagas', () => {
       const action = {
         imageResource: {},
         infoId: 'infoId',
+        windowId: 'window',
       };
 
       return expectSaga(fetchInfoResponse, action)
@@ -175,6 +176,7 @@ describe('IIIF sagas', () => {
           ok: true,
           tokenServiceId: undefined,
           type: 'mirador/RECEIVE_DEGRADED_INFO_RESPONSE',
+          windowId: 'window',
         })
         .run();
     });
diff --git a/src/state/actions/infoResponse.js b/src/state/actions/infoResponse.js
index 3aed86c00b71c5f5dcbcf8e675232fe848a77ed6..b990a9c86a894aa8a8abc6e08971c5add1821264 100644
--- a/src/state/actions/infoResponse.js
+++ b/src/state/actions/infoResponse.js
@@ -6,11 +6,12 @@ import ActionTypes from './action-types';
  * @param  {String} infoId
  * @memberof ActionCreators
  */
-export function requestInfoResponse(infoId, imageResource) {
+export function requestInfoResponse(infoId, imageResource, windowId) {
   return {
     imageResource,
     infoId,
     type: ActionTypes.REQUEST_INFO_RESPONSE,
+    windowId,
   };
 }
 
@@ -38,13 +39,14 @@ export function receiveInfoResponse(infoId, infoJson, ok, tokenServiceId) {
  * @param  {Object} manifestJson
  * @memberof ActionCreators
  */
-export function receiveDegradedInfoResponse(infoId, infoJson, ok, tokenServiceId) {
+export function receiveDegradedInfoResponse(infoId, infoJson, ok, tokenServiceId, windowId) {
   return {
     infoId,
     infoJson,
     ok,
     tokenServiceId,
     type: ActionTypes.RECEIVE_DEGRADED_INFO_RESPONSE,
+    windowId,
   };
 }
 
@@ -70,10 +72,10 @@ export function receiveInfoResponseFailure(infoId, error, tokenServiceId) {
  * @param  {String} infoId
  * @memberof ActionCreators
  */
-export function fetchInfoResponse({ imageId, imageResource }) {
+export function fetchInfoResponse({ imageId, imageResource, windowId }) {
   const imageService = imageResource && imageResource.getServices()[0];
   const infoId = (imageId || imageService.id);
-  return requestInfoResponse(infoId, imageService);
+  return requestInfoResponse(infoId, imageService, windowId);
 }
 
 /**
diff --git a/src/state/sagas/iiif.js b/src/state/sagas/iiif.js
index 862783c10fcbe1b81246bbf8cca7464de67e1f59..f29d0b53212a3b1988873f315dd4606cc977c192 100644
--- a/src/state/sagas/iiif.js
+++ b/src/state/sagas/iiif.js
@@ -132,7 +132,7 @@ function* getAccessTokenService(resource) {
 }
 
 /** @private */
-export function* fetchInfoResponse({ imageResource, infoId, tokenService: passedTokenService }) {
+export function* fetchInfoResponse({ imageResource, infoId, windowId }) {
   let iiifResource = imageResource;
   if (!iiifResource) {
     iiifResource = yield select(selectInfoResponse, { infoId });
@@ -141,7 +141,7 @@ export function* fetchInfoResponse({ imageResource, infoId, tokenService: passed
   const callbacks = {
     degraded: ({
       json, response, tokenServiceId,
-    }) => receiveDegradedInfoResponse(infoId, json, response.ok, tokenServiceId),
+    }) => receiveDegradedInfoResponse(infoId, json, response.ok, tokenServiceId, windowId),
     failure: ({
       error, json, response, tokenServiceId,
     }) => (
diff --git a/src/state/sagas/windows.js b/src/state/sagas/windows.js
index 26c8b9b1aa1ea548c0ec5db74c69629fd045361d..af08e2378d089a3d21fed758de81254586ce3f8c 100644
--- a/src/state/sagas/windows.js
+++ b/src/state/sagas/windows.js
@@ -223,7 +223,7 @@ export function* fetchInfoResponses({ visibleCanvases: visibleCanvasIds, windowI
     const miradorCanvas = new MiradorCanvas(canvas);
     return all(miradorCanvas.iiifImageResources.map(imageResource => (
       !infoResponses[imageResource.getServices()[0].id]
-        && put(fetchInfoResponse({ imageResource }))
+        && put(fetchInfoResponse({ imageResource, windowId }))
     )).filter(Boolean));
   }));
 }