diff --git a/__tests__/fixtures/version-2/001.json b/__tests__/fixtures/version-2/001.json
new file mode 100644
index 0000000000000000000000000000000000000000..8301ee2656b2e5e0f2d8fec981a509ebc6dbad1b
--- /dev/null
+++ b/__tests__/fixtures/version-2/001.json
@@ -0,0 +1,170 @@
+{
+  "@context": "http://iiif.io/api/presentation/2/context.json",
+  "@id": "https://iiif.bodleian.ox.ac.uk/iiif/manifest/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+  "@type": "sc:Manifest",
+  "label": "Bodleian Library Human Freaks 2 (33)",
+  "description": "[Handbill of Mr. Becket, [1787] ]",
+  "metadata": [
+    {
+      "label": "Homepage",
+      "value": "<span><a href=\"https://digital.bodleian.ox.ac.uk/inquire/p/9cca8fdd-4a61-4429-8ac1-f648764b4d6d\">View on Digital Bodleian</a></span>"
+    },
+    {
+      "label": "Title",
+      "value": "[Handbill of Mr. Becket, [1787] ]"
+    },
+    {
+      "label": "Other Titles",
+      "value": "To the nobility, gentry, and the curious for inspecting most extraordinary human beings, of the wild species born. Just arrived from abroad, and to be seen at Mr. Becket's, trunk maker, no. 31, Hay-market, ... three wonderful ph†nomena, wild-born, of the human species: these are two females and a male, of a very small stature, ..."
+    },
+    {
+      "label": "Creator",
+      "value": "Becket, Mr ([London], England) [author]"
+    },
+    {
+      "label": "Contributor",
+      "value": "Becket Mr [funder/Sponsor]"
+    },
+    {
+      "label": "Contributor",
+      "value": "Incledon, Charles Benjamin, 1763-1826 [performer]"
+    },
+    {
+      "label": "Language",
+      "value": "English"
+    },
+    {
+      "label": "Date Statement",
+      "value": "[1787]"
+    },
+    {
+      "label": "Description",
+      "value": "Handbill of Mr. Becket, [1787] announcing curiosities and wonders"
+    },
+    {
+      "label": "Collection",
+      "value": "Ephemera"
+    },
+    {
+      "label": "Collection",
+      "value": "Entertainment Ephemera"
+    },
+    {
+      "label": "Subject",
+      "value": "Curiosities and wonders"
+    },
+    {
+      "label": "Subject",
+      "value": "Dwarfs"
+    },
+    {
+      "label": "Subject",
+      "value": "Abnormalities, Human"
+    },
+    {
+      "label": "Subject",
+      "value": "Printed ephemera"
+    },
+    {
+      "label": "Subject",
+      "value": "Human curiosities"
+    },
+    {
+      "label": "Subject",
+      "value": "Dwarfs"
+    },
+    {
+      "label": "Subject",
+      "value": "Hills"
+    },
+    {
+      "label": "Subject",
+      "value": "Umbrellas"
+    },
+    {
+      "label": "Other Identifier",
+      "value": "Human Freaks 2 (33)"
+    },
+    {
+      "label": "Other Identifier",
+      "value": "003134"
+    },
+    {
+      "label": "Other Identifier",
+      "value": "t188499"
+    },
+    {
+      "label": "Record Created",
+      "value": "2015-07-10T00:00:00Z"
+    },
+    {
+      "label": "Holding Institution",
+      "value": "Bodleian Libraries, University of Oxford"
+    }
+  ],
+  "rendering": {
+    "@id": "https://digital.bodleian.ox.ac.uk/inquire/p/9cca8fdd-4a61-4429-8ac1-f648764b4d6d",
+    "label": "View on Digital Bodleian",
+    "format": "text/html"
+  },
+  "attribution": "http://creativecommons.org/licenses/by-nc-sa/3.0/.",
+  "logo": {
+    "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/b83fe9b4-3ffb-4890-aa3f-7d551dfd8b38/full/256,/0/default.jpg",
+    "service": {
+      "@context": "http://iiif.io/api/image/2/context.json",
+      "profile": "http://iiif.io/api/image/2/level1.json",
+      "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/b83fe9b4-3ffb-4890-aa3f-7d551dfd8b38"
+    }
+  },
+  "thumbnail": {
+    "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d/full/256,/0/default.jpg",
+    "service": {
+      "@context": "http://iiif.io/api/image/2/context.json",
+      "profile": "http://iiif.io/api/image/2/level1.json",
+      "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d"
+    }
+  },
+  "viewingHint": "individuals",
+  "sequences": [
+    {
+      "@id": "https://iiif.bodleian.ox.ac.uk/iiif/sequence/9cca8fdd-4a61-4429-8ac1-f648764b4d6d_default.json",
+      "@type": "sc:Sequence",
+      "label": "Default",
+      "canvases": [
+        {
+          "@id": "https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+          "@type": "sc:Canvas",
+          "label": "Whole Page",
+          "width": 5776,
+          "height": 9125,
+          "images": [
+            {
+              "@id": "https://iiif.bodleian.ox.ac.uk/iiif/annotation/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+              "@type": "oa:Annotation",
+              "motivation": "sc:painting",
+              "on": "https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+              "resource": {
+                "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d",
+                "@type": "dctypes:Image",
+                "format": "image/jpeg",
+                "width": 5776,
+                "height": 9125,
+                "service": {
+                  "@context": "http://iiif.io/api/image/2/context.json",
+                  "profile": "http://iiif.io/api/image/2/level1.json",
+                  "@id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d"
+                }
+              }
+            }
+          ],
+          "metadata": [
+            {
+              "label": "Label",
+              "value": "Whole Page"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/__tests__/fixtures/2.json b/__tests__/fixtures/version-2/002.json
similarity index 100%
rename from __tests__/fixtures/2.json
rename to __tests__/fixtures/version-2/002.json
diff --git a/__tests__/fixtures/24.json b/__tests__/fixtures/version-2/024.json
similarity index 100%
rename from __tests__/fixtures/24.json
rename to __tests__/fixtures/version-2/024.json
diff --git a/__tests__/fixtures/sn904cj3439.json b/__tests__/fixtures/version-2/sn904cj3439.json
similarity index 100%
rename from __tests__/fixtures/sn904cj3439.json
rename to __tests__/fixtures/version-2/sn904cj3439.json
diff --git a/__tests__/fixtures/version-3/001.json b/__tests__/fixtures/version-3/001.json
new file mode 100644
index 0000000000000000000000000000000000000000..55207456dcf55dc899f8ce53c117f3180f70fb78
--- /dev/null
+++ b/__tests__/fixtures/version-3/001.json
@@ -0,0 +1,288 @@
+{
+  "@context": [
+    "http://www.w3.org/ns/anno.jsonld",
+    "http://iiif.io/api/presentation/3/context.json"
+  ],
+  "id": "https://iiif.bodleian.ox.ac.uk/iiif/manifest/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+  "type": "Manifest",
+  "label": {
+    "en": [
+      "Bodleian Library: Human Freaks 2 (33)"
+    ]
+  },
+  "summary": "[Handbill of Mr. Becket, [1787] ]",
+  "metadata": [
+    {
+      "label": {
+        "en": [
+          "Title"
+        ]
+      },
+      "value": {
+        "en": [
+          "[Handbill of Mr. Becket, [1787] ]"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Other Titles"
+        ]
+      },
+      "value": {
+        "en": [
+          "To the nobility, gentry, and the curious for inspecting most extraordinary human beings, of the wild species born. Just arrived from abroad, and to be seen at Mr. Becket's, trunk maker, no. 31, Hay-market, ... three wonderful ph\u0086nomena, wild-born, of the human species: these are two females and a male, of a very small stature, ..."
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Creator"
+        ]
+      },
+      "value": {
+        "en": [
+          "Becket, Mr ([London], England) [author]"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Contributor"
+        ]
+      },
+      "value": {
+        "en": [
+          "Becket Mr [funder/Sponsor]",
+          "Incledon, Charles Benjamin, 1763-1826 [performer]"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Language"
+        ]
+      },
+      "value": {
+        "en": [
+          "English"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Date Statement"
+        ]
+      },
+      "value": {
+        "en": [
+          "[1787]"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Description"
+        ]
+      },
+      "value": {
+        "en": [
+          "Handbill of Mr. Becket, [1787] announcing curiosities and wonders"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Collection"
+        ]
+      },
+      "value": {
+        "en": [
+          "Ephemera",
+          "Entertainment Ephemera"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Subject"
+        ]
+      },
+      "value": {
+        "en": [
+          "Curiosities and wonders",
+          "Dwarfs",
+          "Abnormalities, Human",
+          "Printed ephemera",
+          "Human curiosities",
+          "Dwarfs",
+          "Hills",
+          "Umbrellas"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Other Identifier"
+        ]
+      },
+      "value": {
+        "en": [
+          "Human Freaks 2 (33)",
+          "003134",
+          "t188499"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Record Created"
+        ]
+      },
+      "value": {
+        "en": [
+          "2015-07-10T00:00:00Z"
+        ]
+      }
+    },
+    {
+      "label": {
+        "en": [
+          "Holding Institution"
+        ]
+      },
+      "value": {
+        "en": [
+          "Bodleian Libraries, University of Oxford"
+        ]
+      }
+    }
+  ],
+  "homepage": [
+    {
+      "id": "https://digital.bodleian.ox.ac.uk/inquire/p/9cca8fdd-4a61-4429-8ac1-f648764b4d6d",
+      "type": "Text",
+      "label": {
+        "en": [
+          "View on Digital Bodleian"
+        ]
+      },
+      "format": "text/html"
+    }
+  ],
+  "logo": [
+    {
+      "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/b83fe9b4-3ffb-4890-aa3f-7d551dfd8b38/full/256,/0/default.jpg",
+      "type": "Image",
+      "service": {
+        "type": "ImageService2",
+        "profile": "level1",
+        "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/b83fe9b4-3ffb-4890-aa3f-7d551dfd8b38"
+      }
+    }
+  ],
+  "thumbnail": [
+    {
+      "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d/full/256,/0/default.jpg",
+      "service": {
+        "type": "ImageService2",
+        "profile": "level1",
+        "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d"
+      }
+    }
+  ],
+  "requiredStatement": {
+    "label": {
+      "en": [
+        "Terms of Use"
+      ]
+    },
+    "value": {
+      "en": [
+        null
+      ]
+    }
+  },
+  "partOf": [
+    {
+      "id": "https://iiif.bodleian.ox.ac.uk/iiif/collection/ephemera",
+      "type": "Collection",
+      "label": {
+        "en": [
+          "Ephemera"
+        ]
+      }
+    },
+    {
+      "id": "https://iiif.bodleian.ox.ac.uk/iiif/collection/entertainment-ephemera",
+      "type": "Collection",
+      "label": {
+        "en": [
+          "Entertainment Ephemera"
+        ]
+      }
+    }
+  ],
+  "behavior": [
+    "individuals"
+  ],
+  "items": [
+    {
+      "id": "https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+      "type": "Canvas",
+      "label": "Whole Page",
+      "width": 5776,
+      "height": 9125,
+      "items": [
+        {
+          "id": "https://iiif.bodleian.ox.ac.uk/iiif/annotationpage/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+          "type": "AnnotationPage",
+          "items": [
+            {
+              "id": "https://iiif.bodleian.ox.ac.uk/iiif/annotation/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+              "type": "Annotation",
+              "motivation": "painting",
+              "target": "https://iiif.bodleian.ox.ac.uk/iiif/canvas/9cca8fdd-4a61-4429-8ac1-f648764b4d6d.json",
+              "body": {
+                "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d",
+                "type": "Image",
+                "format": "image/jpeg",
+                "width": 5776,
+                "height": 9125,
+                "service": {
+                  "type": "ImageService2",
+                  "profile": "level1",
+                  "id": "https://iiif.bodleian.ox.ac.uk/iiif/image/9cca8fdd-4a61-4429-8ac1-f648764b4d6d"
+                }
+              }
+            }
+          ]
+        }
+      ],
+      "metadata": [
+        {
+          "label": {
+            "en": [
+              "Label"
+            ]
+          },
+          "value": {
+            "en": [
+              "Whole Page"
+            ]
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/__tests__/integration/mirador/basic.test.js b/__tests__/integration/mirador/basic.test.js
index b8484b1ebf47ea6ef43cef7961f7b3e58efc27c1..b8d7f7c78bc219b33c3d7a05f49a3fd723a7eb3f 100644
--- a/__tests__/integration/mirador/basic.test.js
+++ b/__tests__/integration/mirador/basic.test.js
@@ -7,11 +7,11 @@ describe('Basic end to end Mirador', () => {
     expect(title).toBe('Mirador');
   });
   it('loads a manifest and displays it', async () => {
-    await expect(page).toFill('#manifestURL', 'http://localhost:5000/sn904cj3439.json');
+    await expect(page).toFill('#manifestURL', 'http://localhost:5000/api/sn904cj3439');
     await expect(page).toClick('#fetchBtn');
     // TODO: Refactor the app so we get rid of the wait
     await page.waitFor(1000);
-    await expect(page).toMatchElement('li', { text: 'http://localhost:5000/sn904cj3439.json' });
+    await expect(page).toMatchElement('li', { text: 'http://localhost:5000/api/sn904cj3439' });
     await expect(page).toMatchElement(
       'h3',
       "Peter's San Francisco Locator. The Birds-Eye-View Map of the Exposition City. Published by Locator Publishing Co",
diff --git a/__tests__/integration/mirador/negotiated-api-response.test.js b/__tests__/integration/mirador/negotiated-api-response.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d86a6d63b7bff870f77185382ba6f1aa3fd24bc6
--- /dev/null
+++ b/__tests__/integration/mirador/negotiated-api-response.test.js
@@ -0,0 +1,21 @@
+const supertest = require('supertest');
+
+describe('GET Negotiated API Response', () => {
+  let request;
+  beforeAll(() => {
+    request = supertest('http://localhost:5000');
+  });
+  it('responds with API v3 json', () => request
+    .get('/api/001')
+    .set('Accept', 'application/ld+json;profile="http://iiif.io/api/presentation/3/context.json"')
+    .expect(200)
+    .then((res) => {
+      expect(res.text).toMatch(/http:\/\/iiif\.io\/api\/presentation\/3\/context\.json/);
+    }));
+  it('responds with API v2 json', () => request
+    .get('/api/001')
+    .expect(200)
+    .then((res) => {
+      expect(res.text).toMatch(/http:\/\/iiif\.io\/api\/presentation\/2\/context\.json/);
+    }));
+});
diff --git a/__tests__/integration/mirador/plugins.test.js b/__tests__/integration/mirador/plugins.test.js
index e1263fbf5b1e3f01ff5576fc11faefc4c9fec5c9..51d7321636d2d77db60f64f3842dacb5f0d468f5 100644
--- a/__tests__/integration/mirador/plugins.test.js
+++ b/__tests__/integration/mirador/plugins.test.js
@@ -3,7 +3,7 @@
 describe('Mirador plugin use', () => {
   beforeAll(async () => {
     await page.goto('http://127.0.0.1:4488/__tests__/integration/mirador/plugins.html');
-    await expect(page).toFill('#manifestURL', 'http://localhost:5000/sn904cj3439.json');
+    await expect(page).toFill('#manifestURL', 'http://localhost:5000/api/sn904cj3439');
     await expect(page).toClick('#fetchBtn');
     // TODO: Refactor the app so we get rid of the wait
     await page.waitFor(1000);
diff --git a/__tests__/integration/mirador/window_actions.test.js b/__tests__/integration/mirador/window_actions.test.js
index e8eedbe134b1ddd3f8a6145940323e8da7c14c56..49829dfadb0c723c579eaf58fe3149296c5df327 100644
--- a/__tests__/integration/mirador/window_actions.test.js
+++ b/__tests__/integration/mirador/window_actions.test.js
@@ -3,7 +3,7 @@ describe('Window actions', () => {
     await page.goto('http://127.0.0.1:4488/__tests__/integration/mirador/');
   });
   it('opens a window and closes it', async () => {
-    await expect(page).toFill('#manifestURL', 'http://localhost:5000/sn904cj3439.json');
+    await expect(page).toFill('#manifestURL', 'http://localhost:5000/api/sn904cj3439');
     await expect(page).toClick('#fetchBtn');
     // TODO: Refactor the app so we get rid of the wait
     await page.waitFor(1000);
diff --git a/__tests__/integration/vanilla-js.test.js b/__tests__/integration/vanilla-js.test.js
index 691f7b1eabdf5ff4900d0aa9979103d561e1dcac..08ae20a863cded4f0a5c1263e303d3a508407ad0 100644
--- a/__tests__/integration/vanilla-js.test.js
+++ b/__tests__/integration/vanilla-js.test.js
@@ -7,7 +7,7 @@ describe('Plain JavaScript example', () => {
     expect(title).toBe('Examples');
   });
   it('loads a manifest and displays it', async () => {
-    await expect(page).toFill('#manifestURL', 'http://localhost:5000/sn904cj3439.json');
+    await expect(page).toFill('#manifestURL', 'http://localhost:5000/api/sn904cj3439');
     await expect(page).toClick('#fetchBtn');
     // TODO: Refactor the app so we get rid of the wait
     await page.waitFor(1000);
diff --git a/__tests__/src/components/Display.test.js b/__tests__/src/components/Display.test.js
index 0ef95154d5265e706f9bf8b22d5789373d80e88a..80e31232c8e86c960b14802f197343f230f63527 100644
--- a/__tests__/src/components/Display.test.js
+++ b/__tests__/src/components/Display.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import Display from '../../../src/components/Display';
 import ManifestMetadata from '../../../src/components/ManifestMetadata';
-import fixture from '../../fixtures/2.json';
+import fixture from '../../fixtures/version-2/002.json';
 
 describe('Display', () => {
   it('renders without an error', () => {
diff --git a/__tests__/src/components/ManifestMetadata.test.js b/__tests__/src/components/ManifestMetadata.test.js
index 404ab7c47741ce9b68a86ee7f0761446e3e86352..03aef1cd0042dd59dc567df8301477e35892a975 100644
--- a/__tests__/src/components/ManifestMetadata.test.js
+++ b/__tests__/src/components/ManifestMetadata.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import ManifestMetadata from '../../../src/components/ManifestMetadata';
-import fixture from '../../fixtures/2.json';
+import fixture from '../../fixtures/version-2/002.json';
 
 describe('ManifestMetadata', () => {
   let wrapper;
diff --git a/__tests__/src/components/Window.test.js b/__tests__/src/components/Window.test.js
index c6433653aeddd99dc5d0201f2e9802754f4fce3c..94a630b92a6c32441b7a5cd6f70614aa1ba51af1 100644
--- a/__tests__/src/components/Window.test.js
+++ b/__tests__/src/components/Window.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { mount, shallow } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import Window from '../../../src/components/Window';
-import fixture from '../../fixtures/24.json';
+import fixture from '../../fixtures/version-2/024.json';
 
 describe('Window', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowBackground.test.js b/__tests__/src/components/WindowBackground.test.js
index f3fe49abf9c40a65321ae5c3756756aaea7f392c..ce37f0c4924dc6c050ce5446805e8277ebbc0f7a 100644
--- a/__tests__/src/components/WindowBackground.test.js
+++ b/__tests__/src/components/WindowBackground.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import WindowBackground from '../../../src/components/WindowBackground';
-import fixture from '../../fixtures/24.json';
+import fixture from '../../fixtures/version-2/024.json';
 
 describe('WindowBackground', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowViewer.test.js b/__tests__/src/components/WindowViewer.test.js
index 2bed4303aa1be9c591fa3df8d8a0b33db9605b0d..797d2e04abc69fde894a7ff73d143a37c20de306 100644
--- a/__tests__/src/components/WindowViewer.test.js
+++ b/__tests__/src/components/WindowViewer.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { mount } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import WindowViewer from '../../../src/components/WindowViewer';
-import fixture from '../../fixtures/24.json';
+import fixture from '../../fixtures/version-2/024.json';
 
 describe('WindowViewer', () => {
   let wrapper;
diff --git a/__tests__/src/components/Workspace.test.js b/__tests__/src/components/Workspace.test.js
index c93549885a40ad040d261befa94b8ae94aa825a5..e36ce348298d3b9591604ad41e3d54974469e106 100644
--- a/__tests__/src/components/Workspace.test.js
+++ b/__tests__/src/components/Workspace.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import Workspace from '../../../src/components/Workspace';
-import fixture from '../../fixtures/2.json';
+import fixture from '../../fixtures/version-2/002.json';
 
 describe('Workspace', () => {
   let wrapper;
diff --git a/__tests__/src/components/WorkspaceControlPanel.test.js b/__tests__/src/components/WorkspaceControlPanel.test.js
index 6e26b9fde4828d83f007cd3156d9f0bd7b531466..5c5de82aea97cd21c20fd6826d34dfd3c3fd2304 100644
--- a/__tests__/src/components/WorkspaceControlPanel.test.js
+++ b/__tests__/src/components/WorkspaceControlPanel.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import { actions, store } from '../../../src/store';
 import WorkspaceControlPanel from '../../../src/components/WorkspaceControlPanel';
-import fixture from '../../fixtures/2.json';
+import fixture from '../../fixtures/version-2/002.json';
 
 describe('WorkspaceControlPanel', () => {
   let wrapper;
diff --git a/package.json b/package.json
index d312076b2ce5991f1c1513fc2e7e8d144404b464..34a875945a308be11b880505229ad4524261a377 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,7 @@
     "eslint-plugin-jsx-a11y": "^6.1.2",
     "eslint-plugin-react": "^7.12.4",
     "http-server": "^0.11.1",
-    "jest": "^22.4.4",
+    "jest": "^23.6.0",
     "jest-fetch-mock": "^1.5.0",
     "jest-puppeteer": "^3.0.1",
     "json-server": "^0.14.2",
@@ -71,6 +71,7 @@
     "redux-mock-store": "^1.5.1",
     "sass-lint": "^1.12.1",
     "style-loader": "^0.22.1",
+    "supertest": "^3.4.1",
     "terser-webpack-plugin": "^1.2.1",
     "webpack": "^4.27.1",
     "webpack-cli": "^3.1.2"
diff --git a/scripts/json-server/fixture-server-config.json b/scripts/json-server/routes.json
similarity index 100%
rename from scripts/json-server/fixture-server-config.json
rename to scripts/json-server/routes.json
diff --git a/scripts/json-server/server.js b/scripts/json-server/server.js
index fd93d86d76861af883c7c8f5a6cccf489f1b7635..cbf9c77e32cabc4e1b5015a031bb762ecf8cb7ed 100644
--- a/scripts/json-server/server.js
+++ b/scripts/json-server/server.js
@@ -1,13 +1,26 @@
 const jsonServer = require('json-server'); // eslint-disable-line import/no-extraneous-dependencies
 
 const server = jsonServer.create();
-const router = jsonServer.router('./scripts/json-server/fixture-server-config.json');
+const router = jsonServer.router('./scripts/json-server/routes.json');
 const defaults = {
   static: './__tests__/fixtures',
 };
-
 const middlewares = jsonServer.defaults(defaults);
-
 server.use(middlewares);
+
+const options = {
+  root: './__tests__/fixtures/',
+};
+server.get('/api/:id?', (req, res) => {
+  let apiVersion;
+  if (req.get('Accept') === 'application/ld+json;profile="http://iiif.io/api/presentation/3/context.json"') {
+    apiVersion = '3';
+  } else {
+    apiVersion = '2';
+  }
+  const fileId = req.params.id;
+  res.sendFile(`/version-${apiVersion}/${fileId}.json`, options);
+});
+
 server.use(router);
 server.listen(5000, () => {});