diff --git a/plugins/recruit-resources/src/components/CreateCandidate.svelte b/plugins/recruit-resources/src/components/CreateCandidate.svelte
index 42be8e2293..859d357bc4 100644
--- a/plugins/recruit-resources/src/components/CreateCandidate.svelte
+++ b/plugins/recruit-resources/src/components/CreateCandidate.svelte
@@ -16,8 +16,10 @@
 <script lang="ts">
   import { createEventDispatcher } from 'svelte'
   import type { Ref, Space, Doc } from '@anticrm/core'
+  import { generateId } from '@anticrm/core'
 
   import { getClient, Card, Channels } from '@anticrm/presentation'
+  import { uploadFile } from '../utils'
 
   import recruit from '../plugin'
   import chunter from '@anticrm/chunter'
@@ -38,12 +40,13 @@
 
   export let space: Ref<Space>
 
+  let _space = space
+
   const object: Candidate = {
     lastName: '',
     firstName: '',
     city: ''
   } as Candidate
-  const newValue = Object.assign({}, object)
 
   let resume = {} as {
     id: Ref<Attachment> | undefined
@@ -57,21 +60,21 @@
   const client = getClient()
 
   async function createCandidate() {
-    console.log(newValue)
+    console.log(_space)
     // create candidate      
-    const candidateId = await client.createDoc(recruit.class.Candidate, space, {
-      firstName: newValue.firstName,
-      lastName: newValue.lastName,
-      city: newValue.city,
-      channels: newValue.channels,
+    const candidateId = await client.createDoc(recruit.class.Candidate, _space, {
+      firstName: object.firstName,
+      lastName: object.lastName,
+      city: object.city,
+      channels: object.channels,
     })
 
     console.log('resume name', resume.name)
 
     if (resume.id !== undefined) {
       // create attachment
-      console.log('creaing attachment space', space)
-      client.createDoc(chunter.class.Attachment, space, {
+      console.log('creaing attachment space', _space)
+      client.createDoc(chunter.class.Attachment, _space, {
         attachmentTo: candidateId,
         collection: 'resume',
         name: resume.name,
@@ -80,7 +83,7 @@
         size: resume.size,
       }, resume.id)
 
-      client.updateDoc(recruit.class.Candidate, space, candidateId, {
+      client.updateDoc(recruit.class.Candidate, _space, candidateId, {
         resume: resume.id
       })
     }
@@ -89,18 +92,34 @@
   }
 
   let inputFile: HTMLInputElement
-  let kl: number = 0
-  let changed = false
+  let loading = false
 
-  function isChanged(): void {
-    for (const key in newValue) {
-      if (!equals((newValue as any)[key], (object as any)[key])) {
-        changed = true
-        return
-      }
+  async function createAttachment(file: File) {
+    loading = true
+    try {
+      const id = generateId<Attachment>()
+      resume.uuid = await uploadFile(id, space, file)
+      resume.id = id
+      resume.name = file.name
+      resume.size = file.size
+      resume.type = file.type
+
+      object.resume = id
+
+      console.log('uploaded file uuid', resume.uuid)
+
+    } finally {
+      loading = false
     }
-    changed = false
   }
+
+  function fileSelected() {
+    console.log(inputFile.files)
+    const file = inputFile.files?.[0]
+    if (file !== undefined) { createAttachment(file) }
+  }
+
+  let kl: number = 0
 </script>
 
 <!-- <DialogHeader {space} {object} {newValue} {resume} create={true} on:save={createCandidate}/> -->
@@ -108,7 +127,9 @@
 <Card label={'Create Candidate'} 
       okLabel={'Save'}
       okAction={createCandidate}
-      bind:space={space}
+      canSave={object.firstName.length > 0 && object.lastName.length > 0}
+      spaceClass={recruit.class.Candidates}
+      bind:space={_space}
       on:close={() => { dispatch('close') }}>
 
   <div class="flex">
@@ -126,22 +147,22 @@
     </div>
 
     <div class="flex-col">
-      <div class="name"><EditBox placeholder="Name*" maxWidth="9.5rem"/></div>
-      <div class="name"><EditBox placeholder="Surname*" maxWidth="9.5rem" /></div>
-      <div class="city"><EditBox placeholder="Location" maxWidth="9.5rem" /></div>
+      <div class="name"><EditBox placeholder="John" maxWidth="9.5rem" bind:value={object.firstName}/></div>
+      <div class="name"><EditBox placeholder="Appleseed" maxWidth="9.5rem" bind:value={object.lastName}/></div>
+      <div class="city"><EditBox placeholder="Location" maxWidth="9.5rem" bind:value={object.city}/></div>
       <div class="flex resume">
-        {#if kl === 0}
-          <a href={'#'} on:click={ () => { showPopup(PDFViewer, { file: resume.uuid }, 'right') } }>Upload resume</a>
+        {#if resume.id}
+          <Link label={resume.name} href={'#'} icon={FileIcon} on:click={ () => { showPopup(PDFViewer, { file: resume.uuid }, 'right') } }/>
         {:else}
-          <a href={'#'} on:click={ () => { inputFile.click() } }>Resume</a>
-          <input bind:this={inputFile} type="file" name="file" id="file" style="display: none" on:change/>
+          <a href={'#'} on:click={ () => { inputFile.click() } }>Upload resume</a>
+          <input bind:this={inputFile} type="file" name="file" id="file" style="display: none" on:change={fileSelected}/>
         {/if}
       </div>
     </div>
   </div>
   <svelte:fragment slot="contacts">
-    <Channels value={newValue.channels} />
-    <CircleButton icon={Edit} label={'Edit'} on:click={(ev) => showPopup(SocialEditor, { values: newValue.channels ?? [] }, ev.target, (result) => { newValue.channels = result; isChanged() })} />
+    <Channels value={object.channels} />
+    <CircleButton icon={Edit} label={'Edit'} on:click={(ev) => showPopup(SocialEditor, { values: object.channels ?? [] }, ev.target, (result) => { object.channels = result })} />
   </svelte:fragment>
 </Card>