diff --git a/app/components/button/upload.js b/app/components/button/upload.js
index 1926025ae072ec998dbd186a6aa4bcdee3833fd8..9c383ab6eb15f92dd2d8f89265f4f0a320812487 100644
--- a/app/components/button/upload.js
+++ b/app/components/button/upload.js
@@ -13,6 +13,7 @@ export default class UploadButtonComponent extends Component {
       <Button::Upload @node={{@node}} />
   */
   @service store;
+  @service uploader;
 
   @action
   onClickProxyUpload() {
@@ -38,61 +39,12 @@ export default class UploadButtonComponent extends Component {
       return;
     }
 
-    Array.from(files, (file) => {
-      /* Upload of documents to the server side is two stage process:
-        (1.) create document model on the server side
-        (2.) upload file and associated it with model created in (1.)
-       */
-      this._createDocumentModel({
-        file: file,
-        node: this.args.node,
-        lang: "deu"
-      }).then((doc) => {
-        // notify commander component so that it
-        // can already show new document model to the user
-        this.args.onCreateDocumentModel(doc);
-        // continue with actual file upload
-        this._uploadFile({doc, file});
-      });
-
+    this.uploader.upload({
+      files: files,
+      lang: this.args.lang,
+      node: this.args.node,
+      on_create_doc_callback: this.args.onCreateDocumentModel
     });
   }
 
-  async _createDocumentModel({file, node, lang}) {
-    /*
-      Creates document model on the server side.
-
-      This will create, on the server side, the document model
-      with specified `lang`, `title`, `parent_id` attribute.
-      Server side will take care of associating it to the correct user.
-      It is important to understand that NO FILE UPLOAD happens
-      in this method. Because there is no file uploaded at this stage,
-      server side document model will be created with
-       `size` and `page_count` attributes set to zero i.e.
-
-        size = 0
-        page_count = 0
-    */
-    let new_doc;
-
-    new_doc = this.store.createRecord('document');
-    new_doc.title = file.name;
-    new_doc.parent = node;
-    new_doc.lang = lang;
-
-    return new_doc.save();
-  }
-
-  _uploadFile({file, doc}) {
-    /*
-      Uploads given file for given document model.
-
-      Document model ``doc`` should exist on the server side.
-    */
-    let doc_adapter = this.store.adapterFor('document');
-
-
-    doc_adapter.uploadFile({file, doc});
-  }
-
 }
\ No newline at end of file
diff --git a/app/components/commander/action_buttons.hbs b/app/components/commander/action_buttons.hbs
index e21ae35e40076e2e7187fe2123638fdf83b8af25..99b100fac76ea0debecf14c505858926d6e44c57 100644
--- a/app/components/commander/action_buttons.hbs
+++ b/app/components/commander/action_buttons.hbs
@@ -38,6 +38,7 @@
     {{! No nodes are currently selected }}
     <Button::Upload
       @node={{@node}}
+      @lang={{@lang}}
       @onCreateDocumentModel={{@onCreateDocumentModel}} />
 
     <button
diff --git a/app/components/commander/index.hbs b/app/components/commander/index.hbs
index 0bfaa87b93d2a65e381b1f53ab6ffb2e0c89fc6c..7f6366a0dfb56b2ba32b6cf3dc34b0c13e348711 100644
--- a/app/components/commander/index.hbs
+++ b/app/components/commander/index.hbs
@@ -9,6 +9,7 @@
       @openConfirmDeletionModal={{this.openConfirmDeletionModal}}
       @onCreateDocumentModel={{this.onCreateDocumentModel}}
       @selectedNodes={{this.selected_nodes}}
+      @lang={{this.lang}}
       @node={{@node}} />
 
     <Commander::ActionModes
diff --git a/app/components/commander/index.js b/app/components/commander/index.js
index 7d2a9973fddfe12871bff789c950d852f43c86f0..0c5cb663bdd16efad18c81f407efe40004c4c98d 100644
--- a/app/components/commander/index.js
+++ b/app/components/commander/index.js
@@ -48,6 +48,7 @@ export default class CommanderComponent extends Component {
 
     this.websockets.addHandler(this.messageHandler, this);
     this.ws_nodes_move.addHandler(this.wsNodesMoveHandler, this);
+    this.preferences.load();
   }
 
   wsNodesMoveHandler(message) {
@@ -202,7 +203,7 @@ export default class CommanderComponent extends Component {
   }
 
   @action
-  onDrop(data) {
+  async onDrop(data) {
     /**
      * data is a dictionary of following format:
      * {
@@ -247,15 +248,12 @@ export default class CommanderComponent extends Component {
       this.requests.nodesMove(nodes_move_data);
 
     } else if (data['application/x.desktop']) {
-
       // dropping items from the Desktop file manager
       this.uploader.upload({
         files: data['application/x.desktop'],
-        parent_id: this.args.node.id,
-        lang: this.preferences.get_value({
-          key: 'ocr__lang',
-          default_value: 'deu'
-        })
+        node: this.args.node,
+        lang: this.lang,
+        on_create_doc_callback: this.onCreateDocumentModel
       });
 
     }
@@ -285,6 +283,14 @@ export default class CommanderComponent extends Component {
     console.log(`onDragendSuccess on ${this.args.hint}: id=${model.id} type=${model.nodeType}`);
   }
 
+  get lang() {
+    let _lang = this.preferences.get_value({
+      key: 'ocr__language',
+      default_value: 'deu'
+    });
+
+    return _lang;
+  }
 
   get children() {
     /**
diff --git a/app/models/preferences.js b/app/models/preferences.js
new file mode 100644
index 0000000000000000000000000000000000000000..57ceca083a401dbdc6714b2cf6662ce8d0ba2075
--- /dev/null
+++ b/app/models/preferences.js
@@ -0,0 +1,9 @@
+import Model, { attr } from '@ember-data/model';
+
+
+export default class PreferenceModel extends Model {
+  @attr name;
+  @attr value;
+  @attr section;
+  @attr identifier;
+}
\ No newline at end of file
diff --git a/app/services/preferences.js b/app/services/preferences.js
index 1cff4c0860a4ad6021923d67caf3f4fa280ab757..d509b03e03948370a8c841f5ac174f506931c0a2 100644
--- a/app/services/preferences.js
+++ b/app/services/preferences.js
@@ -5,33 +5,32 @@ import { service } from '@ember/service';
 export default class Preferences extends Service {
 
   @service requests;
+  @service store;
 
-  constructor(owner, args) {
-    super(owner, args);
+  get_value({key, default_value}) {
+    let found_item, prefs;
 
-    let that = this;
+    prefs = this.store.peekAll('preferences');
+
+    found_item = prefs.filterBy('identifier',key);
+
+    if (found_item && found_item.length == 1) {
+      return found_item[0]['value'];
+    }
 
-    this.preferences = [];
+    return default_value;
+  }
+
+  async load() {
+    let that = this;
 
     this.requests.preferences().then(
       request => request.json()
     ).then(json_data => json_data.data).then(
       list_of_attrs => {
-        that.preferences = list_of_attrs.map(attr => attr.attributes);
+        that.store.push({
+          data: list_of_attrs
+        });
     });
   }
-
-  get_value({key, default_value}) {
-    let found_item;
-
-    found_item = this.preferences.find(
-      item => item.idendifier == key
-    );
-
-    if (found_item) {
-      return found_item['value'];
-    }
-
-    return default_value;
-  }
 }
\ No newline at end of file
diff --git a/app/services/requests.js b/app/services/requests.js
index 9d426f46ba0e59ec48a7e11d82b11cf252c5b80d..c3825ce28cd1de05a40b75c0463393a9c90418a5 100644
--- a/app/services/requests.js
+++ b/app/services/requests.js
@@ -7,6 +7,7 @@ import { base_url } from 'papermerge/utils';
 
 export default class Requests extends Service {
   @service session;
+  @service store;
 
   async runOCR({doc_id, lang}) {
     /*
@@ -109,18 +110,37 @@ export default class Requests extends Service {
   }
 
   async preferencesUpdate(data) {
-    let url, headers_copy = {};
+    let url,
+      headers_copy = {},
+      response,
+      that = this;
 
     url = `${base_url()}/preferences/bulk/`;
 
     Object.assign(headers_copy, this.headers);  // create a copy of `this.headers`
     headers_copy['Content-Type'] = 'application/json';
 
-    return fetch(url, {
+    response = fetch(url, {
       method: 'POST',
       headers: headers_copy,
       body: JSON.stringify(data)
     });
+
+    response.then(response => response.json()).then(
+      list_of_attrs => {
+        list_of_attrs.data.map(item => {
+          that.store.push({data: {
+            id: item.id,
+            type: "preferences",
+            attributes: {
+              name: item.name,
+              value: item.value,
+              section: item.section,
+              identifier: item.identifier
+            }
+          }});
+        });
+    });
   }
 
   @computed('session.{data.authenticated.token,isAuthenticated}')
diff --git a/app/services/session.js b/app/services/session.js
index 07ff958fb3b8c4dc88e75d4dc673db08083981c1..dc1ba260e827cb47c31f20e112bbd58102df8c1b 100644
--- a/app/services/session.js
+++ b/app/services/session.js
@@ -1,14 +1,16 @@
-import { inject as service } from '@ember/service';
+import { service } from '@ember/service';
 import BaseSessionService from 'ember-simple-auth/services/session';
 
 
 export default class SessionService extends BaseSessionService {
   @service currentUser;
+  @service preferences;
 
   async handleAuthentication() {
     super.handleAuthentication("authenticated.index");
     try {
       await this.currentUser.loadCurrentUser();
+      await this.preferences.load();
     } catch (err) {
       await this.invalidate();
     }
diff --git a/app/services/uploader.js b/app/services/uploader.js
index 4080794d578992f6a956ce60bd853b7d9b5ce96d..83879ccf8f97a9499f66d238d6617779595a18ad 100644
--- a/app/services/uploader.js
+++ b/app/services/uploader.js
@@ -5,10 +5,62 @@ import { service } from '@ember/service';
 export default class Uploader extends Service {
 
   @service requests;
+  @service store;
 
-  upload({files, lang, parent_id}) {
-    console.log(
-      `Uploading files=${files} lang=${lang} parent_id=${parent_id}`
-    );
+  upload({files, lang, node, on_create_doc_callback}) {
+    Array.from(files, (file) => this.upload_file({
+      file, node, lang, on_create_doc_callback
+    }));
+  }
+
+  upload_file({file, lang, node, on_create_doc_callback}) {
+    /* Upload of documents to the server side is two stage process:
+      (1.) create document model on the server side
+      (2.) upload file and associated it with model created in (1.)
+    */
+    this._createDocumentModel({file, node, lang}).then((doc) => {
+      // notify commander component so that it
+      // can already show new document model to the user
+      on_create_doc_callback(doc);
+      // continue with actual file upload
+      this._uploadFile({doc, file});
+    });
+  }
+
+  async _createDocumentModel({file, node, lang}) {
+    /*
+      Creates document model on the server side.
+
+      This will create, on the server side, the document model
+      with specified `lang`, `title`, `parent_id` attribute.
+      Server side will take care of associating it to the correct user.
+      It is important to understand that NO FILE UPLOAD happens
+      in this method. Because there is no file uploaded at this stage,
+      server side document model will be created with
+       `size` and `page_count` attributes set to zero i.e.
+
+        size = 0
+        page_count = 0
+    */
+    let new_doc;
+
+    new_doc = this.store.createRecord('document');
+    new_doc.title = file.name;
+    new_doc.parent = node;
+    new_doc.lang = lang;
+
+    return new_doc.save();
+  }
+
+  _uploadFile({file, doc}) {
+    /*
+      Uploads given file for given document model.
+
+      Document model ``doc`` should exist on the server side.
+    */
+    let doc_adapter = this.store.adapterFor('document');
+
+
+    doc_adapter.uploadFile({file, doc});
   }
 }
\ No newline at end of file