diff --git a/__tests__/integration/mirador/video.html b/__tests__/integration/mirador/video.html
new file mode 100644
index 0000000000000000000000000000000000000000..45c8db36dbbbd11ad70e73f814a55bfcf9eecf03
--- /dev/null
+++ b/__tests__/integration/mirador/video.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="theme-color" content="#000000">
+    <title>Mirador</title>
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
+  </head>
+  <body>
+    <div id="mirador" style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;"></div>
+    <script>document.write("<script type='text/javascript' src='../../../dist/mirador.min.js?v=" + Date.now() + "'><\/script>");</script>
+    <script type="text/javascript">
+     var miradorInstance = Mirador.viewer({
+       id: 'mirador',
+       windows: [
+         {
+           manifestId: 'https://preview.iiif.io/cookbook/master/recipe/0003-mvm-video/manifest.json',
+           view: 'av'
+         },
+         {
+           manifestId: 'https://preview.iiif.io/cookbook/0026_0064_0065-opera-recipes/recipe/0064-opera-one-canvas/manifest.json',
+           view: 'av'
+         }
+      ],
+     });
+    </script>
+  </body>
+</html>
diff --git a/src/components/AVViewer.js b/src/components/AVViewer.js
new file mode 100644
index 0000000000000000000000000000000000000000..d06c1cfa06a4e2ee8e67fa9a3f8fefc7d1cf9338
--- /dev/null
+++ b/src/components/AVViewer.js
@@ -0,0 +1,23 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+/** */
+export class AVViewer extends Component {
+  /** */
+  render() {
+    const { currentCanvases } = this.props;
+    const video = currentCanvases[0].getContent()[0].getBody()[0];
+    return (
+      <div style={{ display: 'flex', 'alignItems': 'center' }}>
+        <video controls>
+          <source src={video.id} type={video.format} />
+        </video>
+      </div>
+    );
+  }
+}
+
+AVViewer.propTypes = {
+  currentCanvases: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
+  windowId: PropTypes.string.isRequired,
+};
diff --git a/src/components/PrimaryWindow.js b/src/components/PrimaryWindow.js
index 05a9c2f55ac9bc13c4876183db250f65f3db644e..df0e9e89ac23a8ec42aa5479329cd139e5b893dd 100644
--- a/src/components/PrimaryWindow.js
+++ b/src/components/PrimaryWindow.js
@@ -9,6 +9,7 @@ import ns from '../config/css-ns';
 const GalleryView = lazy(() => import('../containers/GalleryView'));
 const SelectCollection = lazy(() => import('../containers/SelectCollection'));
 const WindowViewer = lazy(() => import('../containers/WindowViewer'));
+const AVViewer = lazy(() => import('../containers/AVViewer'));
 
 GalleryView.displayName = 'GalleryView';
 SelectCollection.displayName = 'SelectCollection';
@@ -46,6 +47,13 @@ export class PrimaryWindow extends Component {
           />
         );
       }
+      if (view === 'av') {
+        return (
+          <AVViewer
+            windowId={windowId}
+          />
+        );
+      }
       return (
         <WindowViewer
           windowId={windowId}
diff --git a/src/containers/AVViewer.js b/src/containers/AVViewer.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6e452ef3a26f5fcb633b3fccc4f24fad51ab1a7
--- /dev/null
+++ b/src/containers/AVViewer.js
@@ -0,0 +1,21 @@
+import { connect } from 'react-redux';
+import { compose } from 'redux';
+import { withTranslation } from 'react-i18next';
+import { withPlugins } from '../extend/withPlugins';
+import { AVViewer } from '../components/AVViewer';
+import { getVisibleCanvases } from '../state/selectors';
+
+/** */
+const mapStateToProps = (state, { windowId }) => (
+  {
+    currentCanvases: getVisibleCanvases(state, { windowId }) || [],
+  }
+);
+
+const enhance = compose(
+  withTranslation(),
+  connect(mapStateToProps, null),
+  withPlugins('AVViewer'),
+);
+
+export default enhance(AVViewer);