diff --git a/packages/file-handling/src/clipboard.js b/packages/file-handling/src/clipboard.js
index 57c45cac1b176784f1199f8bf6b8835ed07d1f7e..1cc9a43c8156cb52ccdd19c7cfc443f8922f20e1 100644
--- a/packages/file-handling/src/clipboard.js
+++ b/packages/file-handling/src/clipboard.js
@@ -1,4 +1,4 @@
-import {i18n} from './i18n';
+import {createInstance} from './i18n';
 import {css, html} from 'lit-element';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -20,7 +20,8 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
 
     constructor() {
         super();
-        this.lang = 'de';
+        this._i18n = createInstance();
+        this.lang = this._i18n.language;
         this.allowedMimeTypes = '*/*';
         this.clipboardFiles = {files: ''};
         this.clipboardSelectBtnDisabled = true;
@@ -82,7 +83,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
         changedProperties.forEach((oldValue, propName) => {
             switch (propName) {
                 case "lang":
-                    i18n.changeLanguage(this.lang);
+                    this._i18n.changeLanguage(this.lang);
                     break;
                 case "clipboardFiles":
                     this.generateClipboardTable();
@@ -105,6 +106,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
 
 
     connectedCallback() {
+        const i18n = this._i18n;
         super.connectedCallback();
         const that = this;
         this.updateComplete.then(() => {
@@ -337,6 +339,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      * @param files
      */
     async sendClipboardFiles(files) {
+        const i18n = this._i18n;
         for (let i = 0; i < files.length; i ++) {
             await this.sendFileEvent(files[i].file);
         }
@@ -363,6 +366,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      * @param event
      */
     onReceiveBeforeUnload(event) {
+        const i18n = this._i18n;
 
         // we don't need to stop if there are no signed files
         if (this.clipboardFiles.files.length === 0) {
@@ -425,6 +429,8 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      */
     saveFilesToClipboard()
     {
+        const i18n = this._i18n;
+
         //save it
         let data = {};
         let files = [];
@@ -455,6 +461,8 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      * @param event
      */
     finishedSaveFilesToClipboard(event) {
+        const i18n = this._i18n;
+
         send({
             "summary": i18n.t('clipboard.saved-files-title', {count: event.detail.count}),
             "body": i18n.t('clipboard.saved-files-body', {count: event.detail.count}),
@@ -491,6 +499,8 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      *
      */
     clearClipboard() {
+        const i18n = this._i18n;
+
         if (this.tabulatorTable && this.tabulatorTable.getSelectedData().length > 0) {
             let count = this.tabulatorTable.getSelectedData().length;
             this.tabulatorTable.deleteRow(this.tabulatorTable.getSelectedRows());
@@ -526,6 +536,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      * @returns {html}
      */
     getAdditionalButtons() {
+        const i18n = this._i18n;
         let buttonsAreDisabled = this.clipboardFiles.files.length === 0 ? true : this.clipboardSelectBtnDisabled;
         return html`
             <div class="flex-container additional-button-container">
@@ -590,6 +601,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      * @returns {html}
      */
     getClipboardSink() {
+        const i18n = this._i18n;
         const tabulatorCss = commonUtils.getAssetURL(pkgName, 'tabulator-tables/css/tabulator.min.css');
         return html`
             <div class="wrapper">
@@ -624,6 +636,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
      */
     getClipboardSource() {
         const tabulatorCss = commonUtils.getAssetURL(pkgName, 'tabulator-tables/css/tabulator.min.css');
+        const i18n = this._i18n;
         return html`
             <div class="wrapper">
                 <div class="content">
diff --git a/packages/file-handling/src/demo.js b/packages/file-handling/src/demo.js
index ede45f52aaf62783f43a612e66bf164678f0dcc0..e723a9a900f80ee620f469529223efbb5ef95dcd 100644
--- a/packages/file-handling/src/demo.js
+++ b/packages/file-handling/src/demo.js
@@ -1,4 +1,4 @@
-import {i18n} from './i18n';
+import {createInstance} from './i18n';
 import {html, LitElement} from 'lit-element';
 import {unsafeHTML} from 'lit-html/directives/unsafe-html.js';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
@@ -9,7 +9,8 @@ import * as commonUtils from '@dbp-toolkit/common/utils';
 export class FileSourceDemo extends ScopedElementsMixin(LitElement) {
     constructor() {
         super();
-        this.lang = 'de';
+        this._i18n = createInstance();
+        this.lang = this._i18n.language;
         this.url = '';
         this.selectedFiles = [];
         this.selectedFilesCount = 0;
@@ -46,7 +47,7 @@ export class FileSourceDemo extends ScopedElementsMixin(LitElement) {
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === "lang") {
-                i18n.changeLanguage(this.lang);
+                this._i18n.changeLanguage(this.lang);
             }
         });
 
@@ -77,6 +78,8 @@ export class FileSourceDemo extends ScopedElementsMixin(LitElement) {
     }
 
     render() {
+        const i18n = this._i18n;
+
         return html`
             <style>
                 dbp-file-source.clean {
diff --git a/packages/file-handling/src/file-sink.js b/packages/file-handling/src/file-sink.js
index 16b8631639850a96eef0169b21e093ae6af6db07..8c3b2afa3f1b75c1591a58f70e96f7bcd3630d66 100644
--- a/packages/file-handling/src/file-sink.js
+++ b/packages/file-handling/src/file-sink.js
@@ -1,4 +1,4 @@
-import {i18n} from './i18n';
+import {createInstance} from './i18n';
 import {css, html} from 'lit-element';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -21,7 +21,8 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     constructor() {
         super();
         this.context = '';
-        this.lang = 'de';
+        this._i18n = createInstance();
+        this.lang = this._i18n.language;
         this.nextcloudAuthUrl = '';
         this.nextcloudWebDavUrl = '';
         this.nextcloudName ='Nextcloud';
@@ -122,7 +123,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
         changedProperties.forEach((oldValue, propName) => {
             switch (propName) {
                 case "lang":
-                    i18n.changeLanguage(this.lang);
+                    this._i18n.changeLanguage(this.lang);
                     break;
                 case "enabledTargets":
                     if (!this.hasEnabledDestination(this.activeTargets)) {
@@ -163,6 +164,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     finishedFileUpload(event) {
+        const i18n = this._i18n;
         this.sendDestination();
         MicroModal.close(this._('#modal-picker'));
         if (event.detail > 0) {
@@ -268,6 +270,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     getNextcloudHtml() {
+        const i18n = this._i18n;
         if (this.enabledTargets.includes('nextcloud') && this.nextcloudWebDavUrl !== "" && this.nextcloudAuthUrl !== "") {
             return html`
                 <dbp-nextcloud-file-picker id="nextcloud-file-picker"
@@ -336,7 +339,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     render() {
-
+        const i18n = this._i18n;
         return html`
             <vpu-notification lang="de" client-id="my-client-id"></vpu-notification>
             <div class="modal micromodal-slide" id="modal-picker" aria-hidden="true">
diff --git a/packages/file-handling/src/file-source.js b/packages/file-handling/src/file-source.js
index 0a564b41eb71b7193f2913e6d9efafaf8d3b6a39..baab40161580c52668748f517a40812feda03261 100644
--- a/packages/file-handling/src/file-source.js
+++ b/packages/file-handling/src/file-source.js
@@ -1,4 +1,4 @@
-import {i18n} from './i18n';
+import {createInstance} from './i18n';
 import {css, html} from 'lit-element';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -37,7 +37,8 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
     constructor() {
         super();
         this.context = '';
-        this.lang = 'de';
+        this._i18n = createInstance();
+        this.lang = this._i18n.language;
         this.nextcloudAuthUrl = '';
         this.nextcloudName ='Nextcloud';
         this.nextcloudWebDavUrl = '';
@@ -96,7 +97,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
         changedProperties.forEach((oldValue, propName) => {
             switch (propName) {
                 case "lang":
-                    i18n.changeLanguage(this.lang);
+                    this._i18n.changeLanguage(this.lang);
                     break;
                 case "enabledTargets":
                     if (!this.hasEnabledSource(this.activeTarget)) {
@@ -321,6 +322,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
 
         // no suitable files found
         if (filesToHandle.length === 0) {
+            const i18n = this._i18n;
             console.error('ZIP file does not contain any files of ' + this.allowedMimeTypes);
             //throw new Error('ZIP file does not contain any files of ' + this.allowedMimeTypes);
             notify({
@@ -541,6 +543,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
     }
 
     render() {
+        const i18n = this._i18n;
         let allowedMimeTypes = this.allowedMimeTypes;
 
         if (this.decompressZip && this.allowedMimeTypes !== "*/*") {
diff --git a/packages/file-handling/src/i18n.js b/packages/file-handling/src/i18n.js
index 498d9f037b0a5ca481ec8de5df24640900285808..975c1993e2a567940c74f8d957a6b2a018125548 100644
--- a/packages/file-handling/src/i18n.js
+++ b/packages/file-handling/src/i18n.js
@@ -1,6 +1,8 @@
-import {createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
 
-export const i18n = createInstance({en: en, de: de}, 'de', 'en');
\ No newline at end of file
+export function createInstance() {
+    return _createInstance({en: en, de: de}, 'de', 'en');
+}
\ No newline at end of file
diff --git a/packages/file-handling/src/nextcloud-file-picker.js b/packages/file-handling/src/nextcloud-file-picker.js
index c8b2c88691b9d27d8fe51dc091f9d14371984b7d..14c62bb778595cedf7b4c076f9cf802421f64142 100644
--- a/packages/file-handling/src/nextcloud-file-picker.js
+++ b/packages/file-handling/src/nextcloud-file-picker.js
@@ -1,4 +1,4 @@
-import {i18n} from './i18n';
+import {createInstance} from './i18n';
 import {css, html} from 'lit-element';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -19,7 +19,9 @@ import * as fileHandlingStyles from './styles';
 export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
     constructor() {
         super();
-        this.lang = 'de';
+        this._i18n = createInstance();
+        this.lang = this._i18n.language;
+        
         this.authUrl = '';
         this.webDavUrl = '';
         this.nextcloudName = 'Nextcloud';
@@ -37,7 +39,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         this.loading = false;
         this._onReceiveWindowMessage = this.onReceiveWindowMessage.bind(this);
 
-        this.folderIsSelected = i18n.t('nextcloud-file-picker.load-in-folder');
+        this.folderIsSelected = this._i18n.t('nextcloud-file-picker.load-in-folder');
         this.generatedFilename = '';
         this.replaceFilename = '';
         this.customFilename = '';
@@ -97,7 +99,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         changedProperties.forEach((oldValue, propName) => {
             switch (propName) {
                 case "lang":
-                    i18n.changeLanguage(this.lang);
+                    this._i18n.changeLanguage(this.lang);
                     break;
                 case "directoriesOnly":
                     if (this.directoriesOnly && this._("#select_all_wrapper")) {
@@ -136,6 +138,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
     connectedCallback() {
         super.connectedCallback();
         const that = this;
+        const i18n = this._i18n;
         this.updateComplete.then(() => {
             // see: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
             window.addEventListener('message', this._onReceiveWindowMessage);
@@ -377,6 +380,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
     }
 
     openFilePicker() {
+        const i18n = this._i18n;
         if (this.webDavClient === null) {
             this.loading = true;
             this.statusText = i18n.t('nextcloud-file-picker.auth-progress');
@@ -428,6 +432,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param path
      */
     loadDirectory(path) {
+        const i18n = this._i18n;
         if (typeof this.directoryPath === 'undefined' || this.directoryPath === undefined) {
             this.directoryPath = '';
         }
@@ -572,6 +577,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param fileData
      */
     downloadFile(fileData) {
+        const i18n = this._i18n;
         this.loading = true;
         this.statusText = "Loading " + fileData.filename + "...";
 
@@ -602,6 +608,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param directory
      */
     sendDirectory(directory) {
+        const i18n = this._i18n;
         this.tabulatorTable.deselectRow();
         let path;
 
@@ -626,6 +633,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param directory
      */
     uploadFiles(files, directory) {
+        const i18n = this._i18n;
         this.loading = true;
         this.statusText = i18n.t('nextcloud-file-picker.upload-to', {path: directory});
         this.fileList = files;
@@ -646,6 +654,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param directory
      */
     async uploadFile(directory) {
+        const i18n = this._i18n;
         if (this.abortUpload) {
             this.abortUpload = false;
             this.abortUploadButton = false;
@@ -712,6 +721,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      *
      */
     async uploadFileAfterConflict() {
+        const i18n = this._i18n;
         if (this.abortUpload) {
             this.abortUpload = false;
             this.abortUploadButton = false;
@@ -861,6 +871,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param directory
      */
     replaceModalDialog(file, directory) {
+        const i18n = this._i18n;
         this.uploadFileObject = file;
         this.uploadFileDirectory = directory;
         let rights = this.checkRights(file);
@@ -969,6 +980,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @returns {string} correct cancel text
      */
     getCancelText() {
+        const i18n = this._i18n;
         if (this.fileList.length > 1) {
             return i18n.t('nextcloud-file-picker.replace-cancel-all');
         }
@@ -996,6 +1008,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      *
      */
     openAddFolderDialogue() {
+        const i18n = this._i18n;
         if (this._('.addRowAnimation')) {
             this._('.addRowAnimation').classList.remove('addRowAnimation');
         }
@@ -1015,6 +1028,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      *
      */
     addFolder() {
+        const i18n = this._i18n;
         if (this._('#new-folder').value !== "") {
             let folderName = this._('#new-folder').value;
             if (typeof this.directoryPath === 'undefined') {
@@ -1095,6 +1109,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @returns {string} clickable breadcrumb path
      */
     getBreadcrumb() {
+        const i18n = this._i18n;
         if (typeof this.directoryPath === 'undefined') {
             this.directoryPath = '';
         }
@@ -1601,6 +1616,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
     }
 
     render() {
+        const i18n = this._i18n;
         const tabulatorCss = commonUtils.getAssetURL(pkgName, 'tabulator-tables/css/tabulator.min.css');
 
         return html`