diff --git a/packages/data-table-view/src/data-table-view.js b/packages/data-table-view/src/data-table-view.js
index 2d9499168b4746d89bb66313e7a6220942ff833b..45cb17d6f6ddf6538ef444ba8a060dce4ed8b0a3 100644
--- a/packages/data-table-view/src/data-table-view.js
+++ b/packages/data-table-view/src/data-table-view.js
@@ -3,6 +3,7 @@ import dt from 'datatables.net';
 import {setting, getAPiUrl, getAssetURL, } from './utils.js';
 import {i18n} from './i18n';
 import {html, LitElement} from 'lit-element';
+import JSONLD from 'vpu-common/jsonld';
 import commonUtils from 'vpu-common/utils';
 
 dt(window, $);
@@ -11,6 +12,12 @@ class DataTableView extends LitElement {
     constructor() {
         super();
         this.lang = 'de';
+        this.entryPointUrl = getAPiUrl();
+        this.jsonld = null;
+        this.value = null;
+        this.filter = null;
+        this.apiUrl = null;
+        this.blacklist_cols = '';
     }
 
     static get properties() {
@@ -18,32 +25,104 @@ class DataTableView extends LitElement {
             lang: { type: String },
             value: { type: String },
             entryPointUrl: { type: String, attribute: 'entry-point-url' },
+            filter: { type: String },
+            apiUrl: { type: String, attribute: false },
+            blacklist_cols: { type: String, attribute: 'blacklisted-columns' },
         };
     }
 
+    connectedCallback() {
+        super.connectedCallback();
+        const that = this;
+
+        JSONLD.initialize(this.entryPointUrl, function (jsonld) {
+            that.jsonld = jsonld;
+            that.apiUrl = that.jsonld.getApiUrlForIdentifier("http://schema.org/" + that.value);
+        });
+
+        // disabled, load first on toggle to visible
+        window.addEventListener("vpu-auth-init", () => that.loadWebPageElement());
+    }
+
     loadWebPageElement() {
         if (window.VPUAuthToken === undefined || window.VPUAuthToken === "") {
             return;
         }
+        if (this.apiUrl === null || this.jsonld === null) {
+            return;
+        }
+
+        const apiUrlWithFilter = this.apiUrl + '?search=' + this.filter;
+        console.log('apiUrlWithFilter = ' + apiUrlWithFilter);
 
-        const apiUrl = this.entryPointUrl + this.value; // TODO
         var that = this;
 
-        fetch(apiUrl, {
+        fetch(apiUrlWithFilter, {
             headers: {
                 'Content-Type': 'application/ld+json',
                 'Authorization': 'Bearer ' + window.VPUAuthToken,
             },
         })
             .then(res => res.json())
-            .then() // TODO
+            .then(function (data) {
+                console.log(data);
+                // TODO
+                console.log(data['hydra:member']);
+                const persons = data['hydra:member'];
+                const blacklist_cols = that.blacklist_cols.split(' ');
+                let cols = [];
+                for(let i=0; i < persons.length; ++i) {
+                    let new_cols = Object.keys(persons[i]);
+                    cols = cols.concat(new_cols.filter(item => (!~cols.indexOf(item) && !~blacklist_cols.indexOf(item))));
+                }
+                console.log('cols = ' + cols);
+                let rows = [];
+                let columns = [];
+                for(let i=0; i < cols.length; ++i) {
+                    columns[i] = { title: cols[i] };
+                    for(let j=0; j < persons.length; ++j) {
+                        if (rows[j] === undefined) {
+                            rows[j] = [];
+                        }
+                        rows[j][i] = persons[j][cols[i]] || '';
+                    }
+                }
+
+                const lang_de_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/German.json';
+                const lang_en_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/English.json';
+
+                const table = $(that.shadowRoot.querySelector('#dt')).DataTable({
+                    destroy: true,
+                    language: {
+                        url: that.lang === 'de' ? lang_de_url : lang_en_url,
+                    },
+                    columns: columns,
+                    data: rows,
+                    }
+                );
+
+            })
             .catch();
     }
 
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
-            if (propName === "lang") {
-                i18n.changeLanguage(this.lang);
+            switch (propName) {
+                case "lang":
+                    i18n.changeLanguage(this.lang);
+                    break;
+                case "filter":
+                    this.loadWebPageElement();
+                    break;
+                case "value":
+                case "entryPointUrl":
+                    const that = this;
+                    JSONLD.initialize(this.entryPointUrl, function (jsonld) {
+                        that.jsonld = jsonld;
+                        that.apiUrl = that.jsonld.getApiUrlForIdentifier("http://schema.org/" + that.value);
+                    });
+                    this.loadWebPageElement();
+                    break;
             }
         });
 
diff --git a/packages/data-table-view/src/demo.js b/packages/data-table-view/src/demo.js
index a6499f01f64a5fe1e785b430e9e3c4a66b9d1557..80c80779e75841e9213d328f29bee852a09227ca 100644
--- a/packages/data-table-view/src/demo.js
+++ b/packages/data-table-view/src/demo.js
@@ -27,9 +27,19 @@ class DataTableViewDemo extends LitElement {
         super.update(changedProperties);
     }
 
+    filterChange(e) {
+        let datatable = this.shadowRoot.querySelector('#dt1');
+        datatable.filter = e.target.value;
+    }
+
     render() {
         return html`
             <style>
+                .box {
+                    margin: 10px;
+                    padding: 10px;
+                    border: 1px solid orange;
+                }
             </style>
             <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css">
 
@@ -41,7 +51,17 @@ class DataTableViewDemo extends LitElement {
                     <vpu-auth lang="${this.lang}" client-id="${setting('keyCloakClientId')}" load-person force-login></vpu-auth>
                 </div>
                 <div class="content">
-                    <data-table-view lang="${this.lang}" value=""></data-table-view>
+                    <label for="filter">Filter für die Suche:</label>
+                    <input type="text" id="filter" value="" placeholder="Geben Sie mindestens 3 Zeichen ein" @change="${this.filterChange}">
+                    <div class="box">
+                    <vpu-data-table-view
+                        lang="${this.lang}"
+                        value="Person"
+                        filter=""
+                        blacklisted-columns="@id @type functions roles accountTypes"
+                        id="dt1"
+                    ></vpu-data-table-view>
+                    </div>
                 </div>
             </section>
         `;