diff --git a/res/resources.xml b/res/resources.xml
index a1c7a1c..c4a0744 100644
--- a/res/resources.xml
+++ b/res/resources.xml
@@ -10,5 +10,6 @@
ui/section_editor.ui
ui/window.ui
ui/work_editor.ui
+ ui/work_selector.ui
diff --git a/res/ui/work_selector.ui b/res/ui/work_selector.ui
new file mode 100644
index 0000000..a2d41f6
--- /dev/null
+++ b/res/ui/work_selector.ui
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/dialogs/mod.rs b/src/dialogs/mod.rs
index 8b6df96..ddba104 100644
--- a/src/dialogs/mod.rs
+++ b/src/dialogs/mod.rs
@@ -24,3 +24,6 @@ pub use selector_row::*;
pub mod work_editor;
pub use work_editor::*;
+
+pub mod work_selector;
+pub use work_selector::*;
diff --git a/src/dialogs/work_selector.rs b/src/dialogs/work_selector.rs
new file mode 100644
index 0000000..70a1254
--- /dev/null
+++ b/src/dialogs/work_selector.rs
@@ -0,0 +1,250 @@
+use super::*;
+use crate::backend::Backend;
+use crate::database::*;
+use gio::prelude::*;
+use glib::clone;
+use gtk::prelude::*;
+use gtk_macros::get_widget;
+use libhandy::prelude::*;
+use libhandy::HeaderBarExt;
+use std::cell::Cell;
+use std::convert::TryInto;
+use std::rc::Rc;
+
+enum WorkSelectorState {
+ Loading,
+ Persons(Vec),
+ PersonLoading(Person),
+ Person(Vec),
+}
+
+pub struct WorkSelector
+where
+ F: Fn(WorkDescription) -> () + 'static,
+{
+ window: libhandy::Window,
+ backend: Rc,
+ callback: F,
+ leaflet: libhandy::Leaflet,
+ sidebar_stack: gtk::Stack,
+ person_search_entry: gtk::SearchEntry,
+ person_list: gtk::ListBox,
+ stack: gtk::Stack,
+ header: libhandy::HeaderBar,
+ search_entry: gtk::SearchEntry,
+ content_stack: gtk::Stack,
+ work_list: gtk::ListBox,
+ person_list_row_activated_handler_id: Cell