diff --git a/README.md b/README.md
index ade4659e..47c957fe 100644
--- a/README.md
+++ b/README.md
@@ -48,5 +48,5 @@ Note that on the FTP and sFTP, sessions connections aren't destroyed on every re
Nuage is an open source software with its source code available under the AGPL license. Commercial license and support is available upon request, contact me for details: mickael@kerjean.me
# Credits
-- Icons from www.flaticon.com
-- Folks developing awesome [libraries](https://github.com/mickael-kerjean/nuage/blob/master/package.json) as Nuage is just butter and cream on top.
+- Iconography: www.flaticon.com, fontawesome.com and material.io
+- Folks developing awesome [libraries](https://github.com/mickael-kerjean/nuage/blob/master/package.json)
diff --git a/client/assets/img/arrow-down-double.svg b/client/assets/img/arrow-down-double.svg
new file mode 100644
index 00000000..9351e57d
--- /dev/null
+++ b/client/assets/img/arrow-down-double.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/client/assets/img/arrow-down.svg b/client/assets/img/arrow-down.svg
new file mode 100644
index 00000000..3504d73f
--- /dev/null
+++ b/client/assets/img/arrow-down.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/client/assets/img/arrow-up-double.svg b/client/assets/img/arrow-up-double.svg
new file mode 100644
index 00000000..6aa6b854
--- /dev/null
+++ b/client/assets/img/arrow-up-double.svg
@@ -0,0 +1,90 @@
+
+
diff --git a/client/assets/img/arrow_right.svg b/client/assets/img/arrow_right.svg
new file mode 100644
index 00000000..fca0fafb
--- /dev/null
+++ b/client/assets/img/arrow_right.svg
@@ -0,0 +1,59 @@
+
+
diff --git a/client/assets/img/calendar.svg b/client/assets/img/calendar.svg
new file mode 100644
index 00000000..b9b6eeca
--- /dev/null
+++ b/client/assets/img/calendar.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/client/assets/img/calendar_white.svg b/client/assets/img/calendar_white.svg
new file mode 100644
index 00000000..c869463d
--- /dev/null
+++ b/client/assets/img/calendar_white.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/client/assets/img/close.svg b/client/assets/img/close.svg
new file mode 100644
index 00000000..7fc48d3e
--- /dev/null
+++ b/client/assets/img/close.svg
@@ -0,0 +1,100 @@
+
+
+
+
\ No newline at end of file
diff --git a/client/assets/img/deadline.svg b/client/assets/img/deadline.svg
new file mode 100644
index 00000000..5184283e
--- /dev/null
+++ b/client/assets/img/deadline.svg
@@ -0,0 +1,52 @@
+
+
diff --git a/client/assets/img/download_white.svg b/client/assets/img/download_white.svg
new file mode 100644
index 00000000..1c5218eb
--- /dev/null
+++ b/client/assets/img/download_white.svg
@@ -0,0 +1,60 @@
+
+
diff --git a/client/assets/img/error.svg b/client/assets/img/error.svg
index e5bcec14..9be16548 100644
--- a/client/assets/img/error.svg
+++ b/client/assets/img/error.svg
@@ -1,37 +1,98 @@
-
+
-
\ No newline at end of file
diff --git a/client/assets/img/more.svg b/client/assets/img/more.svg
new file mode 100644
index 00000000..4219a16c
--- /dev/null
+++ b/client/assets/img/more.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
diff --git a/client/assets/img/schedule.svg b/client/assets/img/schedule.svg
new file mode 100644
index 00000000..c14abb36
--- /dev/null
+++ b/client/assets/img/schedule.svg
@@ -0,0 +1,52 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
diff --git a/client/assets/img/todo_white.svg b/client/assets/img/todo_white.svg
new file mode 100644
index 00000000..04942415
--- /dev/null
+++ b/client/assets/img/todo_white.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/client/components/dropdown.js b/client/components/dropdown.js
new file mode 100644
index 00000000..b6e3306a
--- /dev/null
+++ b/client/components/dropdown.js
@@ -0,0 +1,114 @@
+/*
+ * This component was build as an alternative to the select component. The idea is
+ * we replace the dirty select on desktop by something more fancy but not on ios/android
+ * as there's just no reason for doing that.
+ */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+import { Icon, NgIf } from "./";
+import { debounce } from "../helpers/";
+import './dropdown.scss';
+
+export class Dropdown extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {
+ button: false
+ };
+ this.$dropdown = null;
+ this.closeDropdown = this.closeDropdown.bind(this);
+ this.toggleDropdown = this.toggleDropdown.bind(this);
+ }
+
+ componentDidMount(){
+ this.$dropdown = ReactDOM.findDOMNode(this).querySelector(".dropdown_button");
+ // This is not really the "react" way of doing things but we needed to use both a
+ // click on the button and on the body (to exit the dropdown). we had issues
+ // that were impossible to solve the "react" way such as the dropdown button click
+ // event was triggered after the body click which makes it hard to cancel it ...
+ this.$dropdown.addEventListener("click", this.toggleDropdown);
+ }
+
+ componentWillUnmount(){
+ this.$dropdown.removeEventListener("click", this.toggleDropdown);
+ document.body.removeEventListener("click", this.closeDropdown);
+ }
+
+ onSelect(name){
+ this.props.onChange(name);
+ }
+
+ closeDropdown(){
+ document.body.removeEventListener("click", this.closeDropdown);
+ this.setState({button: false});
+ }
+
+ toggleDropdown(e){
+ document.body.removeEventListener("click", this.closeDropdown);
+ this.setState({button: !this.state.button}, () => {
+ if(this.state.button === true){
+ requestAnimationFrame(() => {
+ document.body.addEventListener("click", this.closeDropdown);
+ });
+ }
+ });
+ }
+
+ render(){
+ const button = this.props.children[0];
+ if(button.type.name !== 'DropdownButton') throw("First children should be of type DropdownButton");
+
+ const dropdown = React.cloneElement(this.props.children[1], {onSelect: this.onSelect.bind(this)});
+ if(dropdown.type.name !== 'DropdownList') throw("Second children should be of type DropdownList");
+
+ return (
+