diff --git a/__tests__/src/selectors/index.test.js b/__tests__/src/selectors/index.test.js
index 22a5c8f147ee9090044197cee48a377c2f821ff6..d168e48949333ca6f561cbc0e85402b734c335b9 100644
--- a/__tests__/src/selectors/index.test.js
+++ b/__tests__/src/selectors/index.test.js
@@ -19,7 +19,8 @@ import {
   getManifestProvider,
   getManifestTitle,
   getManifestThumbnail,
-  getSelectedCanvasAnnotations,
+  getSelectedTargetAnnotations,
+  getSelectedTargetsAnnotations,
   getWindowViewType,
   getIdAndLabelOfCanvases,
   getCompanionWindowsOfWindow,
@@ -325,7 +326,7 @@ describe('getDestructuredMetadata', () => {
   });
 });
 
-describe('getSelectedCanvasAnnotations', () => {
+describe('getSelectedTargetAnnotations', () => {
   it('returns annotations for the given canvasId that have resources', () => {
     const state = {
       annotations: {
@@ -337,15 +338,42 @@ describe('getSelectedCanvasAnnotations', () => {
       },
     };
 
-    expect(getSelectedCanvasAnnotations(state, 'abc123').length).toEqual(1);
+    expect(getSelectedTargetAnnotations(state, 'abc123').length).toEqual(1);
   });
 
   it('returns an empty array if there are no annotations', () => {
     const state = { annotations: { xyz321: {} } };
     const expected = [];
 
-    expect(getSelectedCanvasAnnotations({}, 'abc123')).toEqual(expected);
-    expect(getSelectedCanvasAnnotations(state, 'abc123')).toEqual(expected);
+    expect(getSelectedTargetAnnotations({}, 'abc123')).toEqual(expected);
+    expect(getSelectedTargetAnnotations(state, 'abc123')).toEqual(expected);
+  });
+});
+
+describe('getSelectedTargetsAnnotations', () => {
+  it('returns annotations for multiple canvasIds', () => {
+    const state = {
+      annotations: {
+        abc123: {
+          annoId1: { '@id': 'annoId1', json: { resources: ['aResource'] } },
+          annoId2: { '@id': 'annoId2' },
+          annoId3: { '@id': 'annoId3', json: { resources: [] } },
+        },
+        def456: {
+          annoId4: { '@id': 'annoId4', json: { resources: ['helloWorld'] } },
+        },
+      },
+    };
+
+    expect(getSelectedTargetsAnnotations(state, ['abc123', 'def456']).length).toEqual(2);
+  });
+
+  it('returns an empty array if there are no annotations', () => {
+    const state = { annotations: { xyz321: {} } };
+    const expected = [];
+
+    expect(getSelectedTargetsAnnotations({}, ['abc123'])).toEqual(expected);
+    expect(getSelectedTargetsAnnotations(state, ['abc123'])).toEqual(expected);
   });
 });
 
diff --git a/src/containers/OpenSeadragonViewer.js b/src/containers/OpenSeadragonViewer.js
index 176c92cc32eaf2418df723ac51990e57fa751505..5d6570d46688c1ae91a93468da764e160ddb2082 100644
--- a/src/containers/OpenSeadragonViewer.js
+++ b/src/containers/OpenSeadragonViewer.js
@@ -8,7 +8,7 @@ import * as actions from '../state/actions';
 import {
   getCanvasLabel,
   getSelectedCanvas,
-  getSelectedCanvasAnnotations,
+  getSelectedTargetsAnnotations,
 } from '../state/selectors';
 
 /**
@@ -24,7 +24,7 @@ const mapStateToProps = ({
     getSelectedCanvas({ windows, manifests }, windowId),
     windows[windowId].canvasIndex,
   ),
-  annotations: getSelectedCanvasAnnotations(
+  annotations: getSelectedTargetsAnnotations(
     { annotations },
     currentCanvases.map(canvas => canvas.id),
   ),
diff --git a/src/containers/WindowSideBarAnnotationsPanel.js b/src/containers/WindowSideBarAnnotationsPanel.js
index 2480d1c64d4a91883de0da4abfe44a3908ca8c21..0fe2ea737e16b0d38e8917703a0ac976b8a8aa20 100644
--- a/src/containers/WindowSideBarAnnotationsPanel.js
+++ b/src/containers/WindowSideBarAnnotationsPanel.js
@@ -4,7 +4,7 @@ import { withTranslation } from 'react-i18next';
 import {
   getIdAndContentOfResources,
   getSelectedCanvas,
-  getSelectedCanvasAnnotations,
+  getSelectedTargetAnnotations,
   getAnnotationResourcesByMotivation,
 } from '../state/selectors';
 import { WindowSideBarAnnotationsPanel } from '../components/WindowSideBarAnnotationsPanel';
@@ -17,7 +17,7 @@ import { WindowSideBarAnnotationsPanel } from '../components/WindowSideBarAnnota
 const mapStateToProps = (state, { windowId }) => ({
   annotations: getIdAndContentOfResources(
     getAnnotationResourcesByMotivation(
-      getSelectedCanvasAnnotations(state, getSelectedCanvas(state, windowId).id),
+      getSelectedTargetAnnotations(state, getSelectedCanvas(state, windowId).id),
       ['oa:commenting', 'sc:painting'],
     ),
   ),
diff --git a/src/containers/WindowSideBarButtons.js b/src/containers/WindowSideBarButtons.js
index 71738d39c430b0a663a3787c88cbd990070a26f3..d534d4e2dcc8c85e45dcdf45307e5a6d98367eca 100644
--- a/src/containers/WindowSideBarButtons.js
+++ b/src/containers/WindowSideBarButtons.js
@@ -7,7 +7,7 @@ import * as actions from '../state/actions';
 import {
   getCompanionWindowForPosition,
   getSelectedCanvas,
-  getSelectedCanvasAnnotations,
+  getSelectedTargetAnnotations,
   getAnnotationResourcesByMotivation,
 } from '../state/selectors';
 import { WindowSideBarButtons } from '../components/WindowSideBarButtons';
@@ -32,7 +32,7 @@ const mapDispatchToProps = (dispatch, { windowId }) => ({
  */
 const mapStateToProps = (state, { windowId }) => ({
   hasAnnotations: getAnnotationResourcesByMotivation(
-    getSelectedCanvasAnnotations(state, (getSelectedCanvas(state, windowId) || {}).id),
+    getSelectedTargetAnnotations(state, (getSelectedCanvas(state, windowId) || {}).id),
     ['oa:commenting', 'sc:painting'],
   ).length > 0,
   sideBarPanel: (getCompanionWindowForPosition(state, windowId, 'left') || {}).content,
diff --git a/src/state/selectors/index.js b/src/state/selectors/index.js
index eb620776a090d07dc3577af8b61c2312a92938f3..f244050a94b3918f48d3b51321e7aa83461ab0b8 100644
--- a/src/state/selectors/index.js
+++ b/src/state/selectors/index.js
@@ -126,17 +126,32 @@ export function getSelectedCanvas(state, windowId) {
 }
 
 /**
-* Return the current canvas' (selected in a window) annotations
+* Return annotations for an array of targets
 * @param {object} state
-* @param {String} windowId
+* @param {Array} targets
+* @return {Array}
+*/
+export function getSelectedTargetsAnnotations(state, targets) {
+  const annotations = state.annotations
+    && targets.map(target => getSelectedTargetAnnotations(state, target));
+  if (!annotations) return [];
+
+  return flatten(annotations);
+}
+
+/**
+* Return a single target's annotations
+* @param {object} state
+* @param {String} target
 * @return {Array}
 */
-export function getSelectedCanvasAnnotations(state, canvasId) {
-  const annotations = state.annotations && state.annotations[canvasId];
+export function getSelectedTargetAnnotations(state, target) {
+  const annotations = state.annotations && state.annotations[target];
+
   if (!annotations) return [];
 
   return filter(
-    Object.keys(annotations).map(id => new Annotation(annotations[id].json)),
+    Object.keys(annotations).map(id => new Annotation(annotations[id].json, target)),
     annotation => annotation
                   && annotation.present(),
   );