diff --git a/README.md b/README.md
index 2d707d18d9f35f19bc7c3776138cec8bd376a1e1..8e5861c5813302ff386bd1a476a59432184639dd 100644
--- a/README.md
+++ b/README.md
@@ -424,6 +424,36 @@ Where:
 
 Setting custom langs will not allow user to choose their own lang.
 
+### Invoices
+
+Invoices allow your Projects to manage invoices
+
+Project is mandatory.
+
+You'll need:
+
+On Server: `djangoldp_invoice` packages
+
+Module declaration, on `config.json`:
+
+```json
+    {
+      "type": "projects",
+      "extensions": [
+        {
+          "type": "invoices",
+          "endpoints": {
+            "uploads": "http://server.url/upload/"
+          }
+        }
+      ]
+    }
+```
+
+Where:
+
+* `xmpp` is your [Prosody](https://prosody.im/) with [appropriate modules](https://git.startinblox.com/infra/prosody-modules/) configured on.
+
 ### Job Offers
 
 Job Offers includes a job board with conversation. To activate them
diff --git a/src/views/page-circle.pug b/src/views/page-circle.pug
index f2ecede828b50b709c2d2bdb2dafca1e496ed451..f52c76c4f8857e706d90e1be36761d2fc900820c 100644
--- a/src/views/page-circle.pug
+++ b/src/views/page-circle.pug
@@ -18,25 +18,25 @@
       for extension of component.extensions
         if extension.type == 'events'
           div(
-            id=`${component.route}-events`
+            id=`${extension.route}-events`
             hidden
-            data-view=`${component.route}-events`
+            data-view=`${extension.route}-events`
             no-render
           )
             include partials/circle/page-circle-events.pug
         if extension.type == 'resources'
           div(
-            id=`${component.route}-resources`
+            id=`${extension.route}-resources`
             hidden
-            data-view=`${component.route}-resources`
+            data-view=`${extension.route}-resources`
             no-render
           )
             include partials/circle/page-circle-resources.pug
         if extension.type == 'polls'
           div(
-            id=`${component.route}-polls`
+            id=`${extension.route}-polls`
             hidden
-            data-view=`${component.route}-polls`
+            data-view=`${extension.route}-polls`
             no-render
           )
             include partials/circle/page-circle-polls.pug
@@ -60,17 +60,17 @@ nav.jsRightMenu.text-disable-selection.sidebar.whitespace-normal(role='navigatio
       if component.extensions
         for extension of component.extensions
           if extension.type == 'resources'
-            solid-route.segment.full(name=`${component.route}-resources` use-id)
+            solid-route.segment.full(name=`${extension.route}-resources` use-id)
               li.segment.full.padding-medium
                 span.icon.ci-file.icon-xlarge.margin-right-medium
                 a(data-trans='circle.menuRight.resources')
           if extension.type == 'events'
-            solid-route.segment.full(name=`${component.route}-events` use-id)
+            solid-route.segment.full(name=`${extension.route}-events` use-id)
               li.segment.full.padding-medium
                 span.icon.ci-appointment.icon-xlarge.margin-right-medium
                 a(data-trans='circle.menuRight.events')
           if extension.type == 'polls'
-            solid-route.segment.full(name=`${component.route}-polls` use-id)
+            solid-route.segment.full(name=`${extension.route}-polls` use-id)
               li.segment.full.padding-medium
                 span.icon.ci-list.icon-xlarge.margin-right-medium
                 a(data-trans='circle.menuRight.polls')    
diff --git a/src/views/page-project.pug b/src/views/page-project.pug
index b79b4e9b4e2a3be52ec7796632aa4be1f1372bbc..eacb578080ef88424697982a8d58379c8ef3c926 100644
--- a/src/views/page-project.pug
+++ b/src/views/page-project.pug
@@ -21,6 +21,16 @@
       no-render
     )
       include partials/project/page-project-picture.pug
+    if component.extensions
+      for extension of component.extensions
+        if extension.type == 'invoices'
+          div(
+            id=`${extension.route}-invoices`
+            hidden
+            data-view=`${extension.route}-invoices`
+            no-render
+          )
+            include partials/project/page-project-invoices.pug
 
 nav.jsRightMenu.text-disable-selection.sidebar.whitespace-normal(role='navigation')
   solid-router.segment.whitespace-normal.text-color-heading.text-bold(default-route=`${component.route}-chat`)
@@ -39,3 +49,10 @@ nav.jsRightMenu.text-disable-selection.sidebar.whitespace-normal(role='navigatio
           span.icon.ci-information.icon-xlarge.margin-right-medium
           a(data-trans='project.menuRight.information')
       solid-route(name=`${component.route}-picture` use-id)
+      if component.extensions
+        for extension of component.extensions
+          if extension.type == 'invoices'
+            solid-route.segment.full(name=`${extension.route}-invoices` use-id)
+              li.segment.full.padding-medium
+                span.icon.ci-list.icon-xlarge.margin-right-medium
+                a(data-trans='circle.menuRight.invoices')    
diff --git a/src/views/partials/project/page-project-invoices.pug b/src/views/partials/project/page-project-invoices.pug
new file mode 100644
index 0000000000000000000000000000000000000000..63eb05e678a307869ecbf07823448374bd63481f
--- /dev/null
+++ b/src/views/partials/project/page-project-invoices.pug
@@ -0,0 +1,5 @@
+solid-invoicing(
+  bind-resources
+  upload-dir=`${extension.endpoints.uploads}`
+  uniq=extension.uniq
+)
\ No newline at end of file