diff --git a/app/components/button/upload.js b/app/components/button/upload.js
index d0e25d0149de06637684ec99ec17ec47f6071aeb..1926025ae072ec998dbd186a6aa4bcdee3833fd8 100644
--- a/app/components/button/upload.js
+++ b/app/components/button/upload.js
@@ -1,6 +1,6 @@
 import Component from '@glimmer/component';
 import { action } from '@ember/object';
-import { inject as service } from '@ember/service';
+import { service } from '@ember/service';
 
 
 export default class UploadButtonComponent extends Component {
diff --git a/app/components/choice_field/index.hbs b/app/components/choice_field/index.hbs
index 500a12b9d2302261bf4bafac929f288622d23ed6..5b9bf2ac16977291d744a42983872a7f61aa5c41 100644
--- a/app/components/choice_field/index.hbs
+++ b/app/components/choice_field/index.hbs
@@ -2,7 +2,13 @@
   <label for={{this.name}} class="form-label">{{capitalize this.name}}</label>:
   <select class="form-select" {{on 'change' this.onChange}}>
     {{#each this.choices as |choice|}}
-      <option value="{{get choice 0}}">{{get choice 1}}</option>
+      {{#let (get choice 0) (get choice 1) as |choice_key choice_value|}}
+        {{#if (is_equal choice_key this.value)}}
+          <option selected value="{{choice_key}}">{{choice_value}}</option>
+        {{else}}
+          <option value="{{choice_key}}">{{choice_value}}</option>
+        {{/if}}
+      {{/let}}
     {{/each}}
   </select>
 </div>
\ No newline at end of file
diff --git a/app/components/choice_field/index.js b/app/components/choice_field/index.js
index e1d43921744670912bf3c68f4cf32cd02d8c2a40..d17f9dd1c6e66bfdd624a87e8afc2985667fd81f 100644
--- a/app/components/choice_field/index.js
+++ b/app/components/choice_field/index.js
@@ -41,6 +41,10 @@ export default class PreferenceChoiceFieldComponent extends Component {
     return this.args.model.identifier;
   }
 
+  get value() {
+    return this.args.model.value;
+  }
+
   @action
   onChange(event) {
     const new_value = event.target.value;
diff --git a/app/components/commander/index.js b/app/components/commander/index.js
index 28b0edc2b94992333dea9c7b5b5df76815b19b1d..7d2a9973fddfe12871bff789c950d852f43c86f0 100644
--- a/app/components/commander/index.js
+++ b/app/components/commander/index.js
@@ -20,6 +20,8 @@ export default class CommanderComponent extends Component {
   @service ws_nodes_move;
   @service store;
   @service requests;
+  @service preferences;
+  @service uploader;
 
   // show create new folder modal dialog?
   @tracked show_new_folder_modal = false;
@@ -200,19 +202,64 @@ export default class CommanderComponent extends Component {
   }
 
   @action
-  onDrop(source_data) {
-    let nodes_move_data;
-
-    nodes_move_data = {
-      'nodes': [{ 'id': source_data.node.id }],
-      'source_parent': {
-        'id': source_data.source_parent.id
-      },
-      'target_parent': {
-        'id': this.args.node.id
+  onDrop(data) {
+    /**
+     * data is a dictionary of following format:
+     * {
+     *    'application/x.node': source_data
+     *    'application/x.desktop': source_data
+     * }
+     *
+     * (1) 'application/x.node' - when incoming data is a node
+     * being dropped from another commander panel
+     * (2) 'application/x.desktop' - when incoming data is being
+     * drop from desktop's file manager
+     *
+     * In (1) case, source_data is {
+     *  node: <node being droppped>
+     *  source_parent: <parent of the node being droppped>
+     * }
+     *
+     * In (2) case, source_data is an array of File instances
+     * */
+    let nodes_move_data,
+      source_data;
+
+    /*
+      Data can be droppped from:
+        - another panel i.e. as x.node
+        - from desktop file manager i.e. as x.desktop
+    */
+
+    if (data['application/x.node']) {
+
+      // dropping items from another panel
+      source_data = data['application/x.node'];
+      nodes_move_data = {
+        'nodes': [{ 'id': source_data.node.id }],
+        'source_parent': {
+          'id': source_data.source_parent.id
+        },
+        'target_parent': {
+          'id': this.args.node.id
+        }
       }
+      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'
+        })
+      });
+
     }
-    this.requests.nodesMove(nodes_move_data);
+
   }
 
   @action
diff --git a/app/helpers/is_equal.js b/app/helpers/is_equal.js
index 84c9bad63750c35781197feda72b7865e7a0182d..bffc2db3e84aa4b69099363371660fcb831f46d9 100644
--- a/app/helpers/is_equal.js
+++ b/app/helpers/is_equal.js
@@ -1,6 +1,7 @@
 import { helper } from '@ember/component/helper';
 import { isEqual as emberIsEqual } from '@ember/utils';
 
+
 export function is_equal([a, b]) {
   return emberIsEqual(a, b);
 }
diff --git a/app/modifiers/droppable.js b/app/modifiers/droppable.js
index e0340af1b0436a825e72929637c9780062258650..3ec0d98161b392f1c73456a33318813a47533f3f 100644
--- a/app/modifiers/droppable.js
+++ b/app/modifiers/droppable.js
@@ -30,16 +30,28 @@ export default class DrappableModifier extends Modifier {
 
   @action
   onDrop(event) {
-    let data;
-    const isNode = event.dataTransfer.types.includes("application/x.node");
+    let data, files_list;
+    const isNodeDrop = event.dataTransfer.types.includes("application/x.node");
     const callback = this.args.named['onDrop'];
 
     event.preventDefault();
     this.element.classList.remove('droparea');
-    if (isNode && callback) {
+
+    if (isNodeDrop && callback) {
+      // drop incoming from another panel
       data = event.dataTransfer.getData('application/x.node');
-      callback(JSON.parse(data));
+      if (data) {
+        callback(JSON.parse({
+          'application/x.node': data
+        }));
+      }
+    } else if (this._is_desktop_drop(event)) {
+      files_list = this._get_desktop_files(event);
+      callback({
+        'application/x.desktop': files_list
+      });
     }
+
   }
 
   @action
@@ -63,4 +75,38 @@ export default class DrappableModifier extends Modifier {
     event.preventDefault();
     this.element.classList.remove('droparea');
   }
+
+  _is_desktop_drop(event) {
+    // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
+    let items = event.dataTransfer.items;
+    let files = event.dataTransfer.files;
+
+    if (items && items.length > 0) {
+      return true;
+    }
+
+    return files && files.length > 0;
+  }
+
+  _get_desktop_files(event) {
+    // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
+    let result = [], i;
+
+    if (event.dataTransfer.items) {
+      // Use DataTransferItemList interface to access the file(s)
+      for (i = 0; i < event.dataTransfer.items.length; i++) {
+        // If dropped items aren't files, reject them
+        if (event.dataTransfer.items[i].kind === 'file') {
+          result.push(event.dataTransfer.items[i].getAsFile());
+        }
+      }
+    } else {
+      // Use DataTransfer interface to access the file(s)
+      for (i = 0; i < event.dataTransfer.files.length; i++) {
+        result.push(event.dataTransfer.files[i]);
+      }
+    }
+
+    return result;
+  }
 }
diff --git a/app/services/current-user.js b/app/services/current-user.js
index e44dee03fd75ce346df9ee3b2608e90037e71511..809e7f36b2ddad957d0d162678e249e52f5fe0f5 100644
--- a/app/services/current-user.js
+++ b/app/services/current-user.js
@@ -1,5 +1,5 @@
 import Service from '@ember/service';
-import { inject as service } from '@ember/service';
+import { service } from '@ember/service';
 
 
 export default class CurrentUserService extends Service {
diff --git a/app/services/preferences.js b/app/services/preferences.js
new file mode 100644
index 0000000000000000000000000000000000000000..1cff4c0860a4ad6021923d67caf3f4fa280ab757
--- /dev/null
+++ b/app/services/preferences.js
@@ -0,0 +1,37 @@
+import Service from '@ember/service';
+import { service } from '@ember/service';
+
+
+export default class Preferences extends Service {
+
+  @service requests;
+
+  constructor(owner, args) {
+    super(owner, args);
+
+    let that = this;
+
+    this.preferences = [];
+
+    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);
+    });
+  }
+
+  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/uploader.js b/app/services/uploader.js
new file mode 100644
index 0000000000000000000000000000000000000000..4080794d578992f6a956ce60bd853b7d9b5ce96d
--- /dev/null
+++ b/app/services/uploader.js
@@ -0,0 +1,14 @@
+import Service from '@ember/service';
+import { service } from '@ember/service';
+
+
+export default class Uploader extends Service {
+
+  @service requests;
+
+  upload({files, lang, parent_id}) {
+    console.log(
+      `Uploading files=${files} lang=${lang} parent_id=${parent_id}`
+    );
+  }
+}
\ No newline at end of file