diff --git a/package-lock.json b/package-lock.json
index e19c8104949dece36368dc2ed7e20f1d849e018f..b19c5da3e7f523785f8df52458bd99058f1d9411 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5255,6 +5255,11 @@
         }
       }
     },
+    "moment": {
+      "version": "2.24.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
diff --git a/package.json b/package.json
index 9342b58b7c21d1930633def3fafe20062f54f32a..f707eca61a00903716c836237fd07906bcccb7fa 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
   "dependencies": {
     "axios": "^0.19.0",
     "bootstrap": "^4.3.1",
-    "jquery": "^3.4.1"
+    "jquery": "^3.4.1",
+    "moment": "^2.24.0"
   }
 }
diff --git a/src/components/isIterable.js b/src/components/isIterable.js
new file mode 100644
index 0000000000000000000000000000000000000000..352501262bd1119ae54531a89f1e0fff58ac4f0a
--- /dev/null
+++ b/src/components/isIterable.js
@@ -0,0 +1,9 @@
+const isIterable = function(obj){
+    // checks for null and undefined
+    if (obj == null) {
+      return false;
+    }
+    return typeof obj[Symbol.iterator] === 'function';
+};
+
+module.exports = isIterable;
\ No newline at end of file
diff --git a/src/components/views/SubDoc.js b/src/components/views/SubDoc.js
new file mode 100644
index 0000000000000000000000000000000000000000..97a1d05fae6f582659c9c66bf97caf9e7ae8f41a
--- /dev/null
+++ b/src/components/views/SubDoc.js
@@ -0,0 +1,26 @@
+const $ = require("jquery");
+const isIterable = require('../isIterable');
+
+const SubDoc = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data.value)) {
+    for (let key of data.value) {
+      try {
+        const subDiv = $('<div class="col-sm">');
+        const item = JSON.parse(data.value);
+        // TODO: talk to Michael Lynch
+        const display = eval("`"  + data.template + "`");
+        const dis = $('<span>').html(display);
+        subDiv.append(dis);
+        div.append(subDiv);
+      } catch (e) {
+        div.append('')
+      }
+    }
+  }
+  return div;
+}
+
+module.exports = SubDoc;
\ No newline at end of file
diff --git a/src/components/views/SubDocDate.js b/src/components/views/SubDocDate.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddf9b872fc303866924fecadeaef7c07ca7dbb22
--- /dev/null
+++ b/src/components/views/SubDocDate.js
@@ -0,0 +1,19 @@
+const $ = require('jquery');
+const moment = require('moment');
+const isIterable = require('../isIterable');
+
+const SubDocDate = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data['value'])) {
+    for (let key of data['value']) {
+      const value = moment(key).format('LL');
+      const eleDiv = $('<div class="col-sm-6">').html(value);
+      div.append(eleDiv);
+    }
+  }
+
+  return div;
+};
+module.exports = SubDocDate;
\ No newline at end of file
diff --git a/src/components/views/SubDocHorizontal.js b/src/components/views/SubDocHorizontal.js
new file mode 100644
index 0000000000000000000000000000000000000000..45c9298e5c675461fbfe0d2134171c8db31da11e
--- /dev/null
+++ b/src/components/views/SubDocHorizontal.js
@@ -0,0 +1,29 @@
+const $ = require("jquery");
+const isIterable = require('../isIterable');
+
+const SubDocHorizontal = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data.value)) {
+    for (let key of data.value) {
+      try {
+        const a = $('<a>');
+        const subDiv = $('<div class="col-sm">');
+        const sub = JSON.parse(key);
+        const href = `/#view/${sub['@id']}`;
+        a.attr('href', href);
+        a.attr('title', sub['name']);
+        a.text(sub['name']);
+        a.addClass("link");
+        subDiv.append(a);
+        div.append(subDiv);
+      } catch (e) {
+        div.append('')
+      }
+    }
+  }
+  return div;
+}
+
+module.exports = SubDocHorizontal;
\ No newline at end of file
diff --git a/src/components/views/ViewDoc.js b/src/components/views/ViewDoc.js
index fc9b3cba1bc05b9fe1fc48698b003863d0d3e56b..6917ad072b684d69ba4f4cefc241959c72def8cf 100644
--- a/src/components/views/ViewDoc.js
+++ b/src/components/views/ViewDoc.js
@@ -2,6 +2,7 @@ const $ = require("jquery");
 const ViewTable = require('./ViewTable');
 const ViewErrorElement = require('./ViewErrorElement');
 const ViewRelated = require('./ViewRelated');
+const isIterable = require('../isIterable');
 
 const ViewDoc = function (data) {
 
@@ -11,7 +12,6 @@ const ViewDoc = function (data) {
   if (doc) {
     const heading = $('<h1>').html(doc.name);
     const desc = $('<p>').html(doc.description);
-    const date = $('<p>').html(doc.datePublished);
     const related = $('<div>');
     if (data.main.related.length > 0) {
       const relatedInfo = $('<h3>').html('Related Objects');
@@ -24,9 +24,28 @@ const ViewDoc = function (data) {
       }
       related.append(relatedUl);
     }
-    const fields = ["author"];
+    const linkTo = $('<div>');
+    if (isIterable(doc['uri_id'])) {
+      for (let resolve of doc['uri_id']) {
+        const goTo = $('<a>');
+        goTo.attr('href', `${data.config.repo}${resolve}`);
+        goTo.attr('title', 'Open Record');
+        goTo.attr('target', 'blank');
+        goTo.text('Open Record');
+        goTo.addClass("link");
+        linkTo.append(goTo);
+      }
+    }
+    let tableFields = data.main.viewFields || [];
+    // if (doc['record_type_s'] === data.main.tabledDoc) {
+    //   tableFields = data.main.viewFields;
+    // }
 
-    summary.append(heading).append(desc).append(date).append(ViewTable(doc, fields)).append(related);
+    summary.append(heading)
+        .append(desc)
+        .append(ViewTable(doc, tableFields))
+        .append(related)
+        .append(linkTo);
     dummy.append(summary);
     return dummy.html();
   } else {
diff --git a/src/components/views/ViewTable.js b/src/components/views/ViewTable.js
index 34fd38fc34a5e7cd2c5eea1f277c89795b40038d..1c11ad83c37f003113817e667b8582bd97441b08 100644
--- a/src/components/views/ViewTable.js
+++ b/src/components/views/ViewTable.js
@@ -1,23 +1,48 @@
 const $ = require("jquery");
 const ViewSubDoc = require('./ViewSubDoc');
+const SubDocHorizontal = require('./SubDocHorizontal');
+const SubDocDate = require('./SubDocDate');
+const SubDoc = require('./SubDoc');
+
 const ViewTable = function (doc, fields) {
 
-  //"fields" =  ["name", "author", "description", "publisher", "date"]
   const dummy = $('<div>');
-  const table = $('<table class="table">');
+  const div = $('<div class="table table-responsive">');
 
   for (let key of fields) {
-    const tr = $('<tr>');
-    if (key === 'author') {
-      const subDoc = ViewSubDoc(doc[key]);
-      tr.append(subDoc);
-    } else {
-      tr.append($('<th>').html(key));
-      tr.append($('<td>').html(doc[key]));
+    const list = $('<div class="table">');
+    let subDoc;
+    switch (key.display) {
+      case 'SubDocHorizontal':
+        if(doc[key.field]) {
+          subDoc = SubDocHorizontal({key: key.field, value: doc[key.field], fieldName: key.fieldName});
+          list.append(subDoc);
+        }
+        break;
+      case 'SubDocDate':
+        if(doc[key.field]) {
+          subDoc = SubDocDate({key: key.field, value: doc[key.field], fieldName: key.fieldName});
+          list.append(subDoc);
+        }
+        break;
+      case 'SubDoc':
+        if(doc[key.field]) {
+          subDoc = SubDoc({key: key.field, value: doc[key.field], fieldName: key.fieldName, template: key.template});
+          list.append(subDoc);
+        }
+        break;
+      default:
+        if(doc[key.field]) {
+          const row = $('<div class="row">');
+          const defaultKey = $('<div class="col-sm-2">').html(`${key.fieldName}`);
+          const defaultValue = $('<div class="col-sm-6">').html(doc[key.field]);
+          row.append(defaultKey).append(defaultValue);
+          list.append(row);
+        }
     }
-    table.append(tr);
+    div.append(list);
   }
-  dummy.append(table);
+  dummy.append(div);
   return dummy;
 };
 
diff --git a/src/index.js b/src/index.js
index ddba3bee0565a343342b4d818274a8891c37ad00..b950518e5108fbf02b349142124880fabb7f2431 100644
--- a/src/index.js
+++ b/src/index.js
@@ -37,7 +37,13 @@ let state = {
     numFound: 0,
     pageSize: 10,
     searchText: '',
-    related: []
+    related: [],
+    viewFields: [
+      {display: "SubDocHorizontal", field: "author", fieldName: 'Author/s'},
+      {display: "", field: "license", fieldName: 'Licence'},
+      {display: "SubDocDate", field: "datePublished", fieldName: 'Date Published'},
+      {display: "SubDoc", field: "contactPoint", fieldName: 'Contact Point', template: '${item.name} ${item.email}'},
+    ]
   },
   config: config
 };