diff --git a/__tests__/fixtures/version-3/structures.json b/__tests__/fixtures/version-3/structures.json
index a3c255310f9866d44458e9d22c45c1546f0b6b66..bd7bfc276ea83aa84dbe510d7e1279f01b587637 100644
--- a/__tests__/fixtures/version-3/structures.json
+++ b/__tests__/fixtures/version-3/structures.json
@@ -127,7 +127,7 @@
         {
           "id": "http://foo.test/1/range/0-0-3",
           "type": "Range",
-          "label": { "none": "missing start canvas" },
+          "label": { "none": ["missing start canvas"] },
           "items": [
             {
               "id": "http://foo.test/1/canvas/c10",
@@ -145,4 +145,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/__tests__/src/selectors/manifests.test.js b/__tests__/src/selectors/manifests.test.js
index d7ee0a531fe9f82ba96b6f9ff102d27e736b9d29..0251ccb49a847c5ab968153a7dedffa58de37681 100644
--- a/__tests__/src/selectors/manifests.test.js
+++ b/__tests__/src/selectors/manifests.test.js
@@ -217,6 +217,7 @@ describe('getManifestRelatedContent', () => {
     expect(received).toEqual([
       {
         format: 'application/mods+xml',
+        label: null,
         value: 'https://purl.stanford.edu/sn904cj3429.mods',
       },
     ]);
diff --git a/__tests__/src/selectors/searches.test.js b/__tests__/src/selectors/searches.test.js
index ab6fab00b001926967dfc56a96ba967e3d37595a..3a9e3791a4e3e215d79cb17419d0785c21ea6a0e 100644
--- a/__tests__/src/selectors/searches.test.js
+++ b/__tests__/src/selectors/searches.test.js
@@ -319,7 +319,7 @@ describe('getResourceAnnotationForSearchHit', () => {
 describe('getResourceAnnotationLabel', () => {
   const companionWindowId = 'cwid';
   const annoId = 'annoId2';
-  it('returns the label from a LanguageMap JSON object', () => {
+  it('returns the label from a PropertyValue JSON object', () => {
     const state = {
       companionWindows: {
         [companionWindowId]: { locale: 'en' },
@@ -350,7 +350,7 @@ describe('getResourceAnnotationLabel', () => {
     ).toEqual(['The Annotation Label']);
   });
 
-  it('returns an empty array if the annotation resource does not have a label (to be consistent w/ the return of LanguageMap.parse)', () => {
+  it('returns an empty array if the annotation resource does not have a label (to be consistent w/ the return of PropertyValue.parse)', () => {
     const state = {
       companionWindows: {
         [companionWindowId]: { locale: 'en' },
diff --git a/package.json b/package.json
index 0d11099bccacac2674230c243d9e5c82d993b263..e0286bdba86168d504af2ed22b64e91afc02cfc2 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,7 @@
     "jss": "^10.3.0",
     "jss-rtl": "^0.3.0",
     "lodash": "^4.17.11",
-    "manifesto.js": "^4.1.0",
+    "manifesto.js": "^4.2.0",
     "normalize-url": "^4.5.0",
     "openseadragon": "^2.4.2",
     "prop-types": "^15.6.2",
diff --git a/src/components/CanvasLayers.js b/src/components/CanvasLayers.js
index d2eb7d44d8e1aa471a211b3fc14955006f290e14..c58a0eab8f7dd214dd68379f46e37616deaa8f40 100644
--- a/src/components/CanvasLayers.js
+++ b/src/components/CanvasLayers.js
@@ -34,7 +34,7 @@ export class CanvasLayers extends Component {
     return (resource
       && resource.getLabel
       && resource.getLabel().length > 0)
-      ? resource.getLabel().map(label => label.value)[0]
+      ? resource.getLabel().getValue()
       : String(index + 1);
   }
 
diff --git a/src/components/CollectionDialog.js b/src/components/CollectionDialog.js
index e1aba1a6e6db82f5bea5fde40f34c4fc983a7a3e..f66e36a48cda54890294652bb2fdbcc51ea8a4ca 100644
--- a/src/components/CollectionDialog.js
+++ b/src/components/CollectionDialog.js
@@ -37,7 +37,7 @@ export class CollectionDialog extends Component {
     return (resource
       && resource.getLabel
       && resource.getLabel().length > 0)
-      ? resource.getLabel().map(label => label.value)[0]
+      ? resource.getLabel().getValue()
       : String(index + 1);
   }
 
@@ -172,7 +172,7 @@ export class CollectionDialog extends Component {
 
     const requiredStatement = manifest
       && asArray(manifest.getRequiredStatement()).filter(l => l.getValue()).map(labelValuePair => ({
-        label: labelValuePair.getLabel(),
+        label: null,
         values: labelValuePair.getValues(),
       }));
 
diff --git a/src/components/IIIFThumbnail.js b/src/components/IIIFThumbnail.js
index 789c1499bb7be76aedc4c36f28feaf09ad8d255f..a22c153a373529256747a16923356ba68943a06e 100644
--- a/src/components/IIIFThumbnail.js
+++ b/src/components/IIIFThumbnail.js
@@ -15,7 +15,7 @@ export class IIIFThumbnail extends Component {
     return (resource
       && resource.getLabel
       && resource.getLabel().length > 0)
-      ? resource.getLabel().map(label => label.value)[0]
+      ? resource.getLabel().getValue()
       : String(index + 1);
   }
 
diff --git a/src/components/WindowSideBarCanvasPanel.js b/src/components/WindowSideBarCanvasPanel.js
index 0100d965d0329b39620dc8dc2e16901cfe1eb717..bc8297dc4a2d448495590493ad9e9bbdabfa97f5 100644
--- a/src/components/WindowSideBarCanvasPanel.js
+++ b/src/components/WindowSideBarCanvasPanel.js
@@ -31,7 +31,7 @@ export class WindowSideBarCanvasPanel extends Component {
     return (resource
       && resource.getLabel
       && resource.getLabel().length > 0)
-      ? resource.getLabel().map(label => label.value)[0]
+      ? resource.getLabel().getValue()
       : resource.id;
   }
 
diff --git a/src/components/WindowSideBarCollectionPanel.js b/src/components/WindowSideBarCollectionPanel.js
index baa41c951c26e1fea9571e3a0afe6e3b04b34ca6..78b6f2b0c93def01ae376b1375a11acbf6adff7e 100644
--- a/src/components/WindowSideBarCollectionPanel.js
+++ b/src/components/WindowSideBarCollectionPanel.js
@@ -19,7 +19,7 @@ export class WindowSideBarCollectionPanel extends Component {
     return (resource
       && resource.getLabel
       && resource.getLabel().length > 0)
-      ? resource.getLabel().map(label => label.value)[0]
+      ? resource.getLabel().getValue()
       : resource.id;
   }
 
diff --git a/src/lib/MiradorCanvas.js b/src/lib/MiradorCanvas.js
index 3c490aed07dc85da4174ce4609c205823bd2a39e..01a1eef4bd255171659b59323e539b5a3ab9a165 100644
--- a/src/lib/MiradorCanvas.js
+++ b/src/lib/MiradorCanvas.js
@@ -167,7 +167,7 @@ export default class MiradorCanvas {
    */
   getLabel() {
     return this.canvas.getLabel().length > 0
-      ? this.canvas.getLabel().map(label => label.value)[0]
+      ? this.canvas.getLabel().getValue()
       : String(this.canvas.index + 1);
   }
 }
diff --git a/src/state/selectors/canvases.js b/src/state/selectors/canvases.js
index a6408805608c234c2a1cc556e59d744e2fbf5808..8078bf823c8385a81582e75b9d9e8f13f961294c 100644
--- a/src/state/selectors/canvases.js
+++ b/src/state/selectors/canvases.js
@@ -160,7 +160,7 @@ export const getCanvasLabel = createSelector(
   [getCanvas],
   canvas => (canvas && (
     canvas.getLabel().length > 0
-      ? canvas.getLabel().map(label => label.value)[0]
+      ? canvas.getLabel().getValue()
       : String(canvas.index + 1)
   )),
 );
diff --git a/src/state/selectors/manifests.js b/src/state/selectors/manifests.js
index 5c48a79020fb27f6245e0e46a82e2e735c0fe8eb..63a726680aa8929779c2888c5cc1635b424bdbb5 100644
--- a/src/state/selectors/manifests.js
+++ b/src/state/selectors/manifests.js
@@ -1,6 +1,6 @@
 import { createSelector } from 'reselect';
 import createCachedSelector from 're-reselect';
-import { LanguageMap } from 'manifesto.js/dist-esmodule/LanguageMap';
+import { PropertyValue } from 'manifesto.js/dist-esmodule/PropertyValue';
 import { Utils } from 'manifesto.js/dist-esmodule/Utils';
 import getThumbnail from '../../lib/ThumbnailFactory';
 import { getCompanionWindow } from './companionWindows';
@@ -12,9 +12,6 @@ function createManifestoInstance(json, locale) {
   if (!json) return undefined;
   const manifestoObject = Utils.parseManifest(json, locale ? { locale } : undefined);
   // Local patching of Manifesto so that when its a Collection, it behaves similarly
-  if (typeof manifestoObject.getViewingHint != 'function') {
-    manifestoObject.getViewingHint = () => {};
-  }
   if (typeof manifestoObject.getSequences != 'function') {
     manifestoObject.getSequences = () => [];
   }
@@ -109,7 +106,7 @@ export const getManifestProvider = createSelector(
   ],
   (provider, locale) => provider
     && provider[0].label
-    && LanguageMap.parse(provider[0].label, locale).map(label => label.value)[0],
+    && PropertyValue.parse(provider[0].label, locale).getValue(),
 );
 
 /**
@@ -138,8 +135,8 @@ export const getManifestHomepage = createSelector(
   (homepages, locale) => homepages
     && asArray(homepages).map(homepage => (
       {
-        label: LanguageMap.parse(homepage.label, locale)
-          .map(label => label.value)[0],
+        label: PropertyValue.parse(homepage.label, locale)
+          .getValue(),
         value: homepage.id || homepage['@id'],
       }
     )),
@@ -158,7 +155,7 @@ export const getManifestRenderings = createSelector(
   manifest => manifest
     && manifest.getRenderings().map(rendering => (
       {
-        label: rendering.getLabel().map(label => label.value)[0],
+        label: rendering.getLabel().getValue(),
         value: rendering.id,
       }
     )),
@@ -181,8 +178,8 @@ export const getManifestRelatedContent = createSelector(
     && asArray(seeAlso).map(related => (
       {
         format: related.format,
-        label: LanguageMap.parse(related.label, locale)
-          .map(label => label.value)[0],
+        label: PropertyValue.parse(related.label, locale)
+          .getValue(),
         value: related.id || related['@id'],
       }
     )),
@@ -202,7 +199,7 @@ export const getRequiredStatement = createSelector(
     && asArray(manifest.getRequiredStatement())
       .filter(l => l.getValues().some(v => v))
       .map(labelValuePair => ({
-        label: labelValuePair.getLabel(),
+        label: (labelValuePair.label && labelValuePair.label.getValue()) || null,
         values: labelValuePair.getValues(),
       })),
 );
@@ -223,7 +220,7 @@ export const getRights = createSelector(
   ],
   (rights, license, locale) => {
     const data = rights || license;
-    return asArray(LanguageMap.parse(data, locale).map(label => label.value));
+    return asArray(PropertyValue.parse(data, locale).getValues());
   },
 );
 
@@ -256,7 +253,7 @@ export function getManifestThumbnail(state, props) {
 export const getManifestTitle = createSelector(
   [getManifestoInstance],
   manifest => manifest
-    && manifest.getLabel().map(label => label.value)[0],
+    && manifest.getLabel().getValue(),
 );
 
 /**
@@ -270,7 +267,7 @@ export const getManifestTitle = createSelector(
 export const getManifestDescription = createSelector(
   [getManifestoInstance],
   manifest => manifest
-    && manifest.getDescription().map(label => label.value)[0],
+    && manifest.getDescription().getValue(),
 );
 
 /**
diff --git a/src/state/selectors/searches.js b/src/state/selectors/searches.js
index b65ad89351d353b987ec73bfdbcd81d0195ab8e0..f679b1b59cf08a12610193dddede306ff1e9ccc0 100644
--- a/src/state/selectors/searches.js
+++ b/src/state/selectors/searches.js
@@ -1,5 +1,5 @@
 import { createSelector } from 'reselect';
-import { LanguageMap } from 'manifesto.js/dist-esmodule/LanguageMap';
+import { PropertyValue } from 'manifesto.js/dist-esmodule/PropertyValue';
 import flatten from 'lodash/flatten';
 import AnnotationList from '../../lib/AnnotationList';
 import { getCanvas, getCanvases } from './canvases';
@@ -195,7 +195,7 @@ export const getResourceAnnotationLabel = createSelector(
       !(resourceAnnotation && resourceAnnotation.resource && resourceAnnotation.resource.label)
     ) return [];
 
-    return LanguageMap.parse(resourceAnnotation.resource.label, locale).map(label => label.value);
+    return PropertyValue.parse(resourceAnnotation.resource.label, locale).getValues();
   },
 );