diff --git a/package.json b/package.json
index 08665b1d..c5211d39 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"@nuxtjs/axios": "^5.3.6",
"axios": "^0.18.0",
"bcrypt": "^3.0.5",
+ "body-parser": "^1.18.3",
"bootstrap-vue": "^2.0.0-rc.16",
"cors": "^2.8.5",
"cross-env": "^5.2.0",
diff --git a/pages/about.vue b/pages/about.vue
new file mode 100644
index 00000000..81805c9e
--- /dev/null
+++ b/pages/about.vue
@@ -0,0 +1,34 @@
+
+ b-modal(hide-footer @hidden='$router.replace("/")' :title='$t("About")'
+ :visible='true' size='lg')
+ h5 Chi siamo
+ p.
+ Gancio e' un progetto dell'underscore hacklab e uno dei
+ servizi di cisti.org.
+
+ h5 Cos'è gancio?
+ p.
+ Uno strumento di condivisione di eventi per comunità radicali.
+ Dentro gancio puoi trovare e inserire eventi.
+ Gancio, come tutto cisti.org è uno strumento
+ antisessista, antirazzista, antifascista e anticapitalista, riflettici quando
+ pubblichi un evento.
+
+ h5 Ok, ma cosa vuol dire gancio?
+ blockquote.
+ Se vieni a Torino e dici: "ehi, ci diamo un gancio alle 8?" nessuno si presenterà con i guantoni per fare a mazzate.
+ Darsi un gancio vuol dire beccarsi alle ore X in un posto Y
+ p
+ small A: a che ora è il gancio in radio per andare al presidio?
+ p
+ small B: non so ma domani non posso venire, ho gia' un gancio per caricare il bar.
+
+
+ h5 Contatti
+ p.
+ Hai scritto una nuova interfaccia per gancio? Vuoi aprire un nuovo nodo di gancio nella tua città?
+ C'è qualcosa che vorresti migliorare? Per contribuire i sorgenti sono liberi e disponibili
+ qui. Aiuti e suggerimenti sono sempre benvenuti, puoi scriverci
+ su underscore chicciola autistici.org
+
+
\ No newline at end of file
diff --git a/pages/admin.vue b/pages/admin.vue
new file mode 100644
index 00000000..330b93f4
--- /dev/null
+++ b/pages/admin.vue
@@ -0,0 +1,196 @@
+
+ b-modal(hide-footer @hidden='$router.replace("/")' :title='$t("Admin")'
+ :visible='true' size='lg')
+ el-tabs(tabPosition='left' v-model='tab')
+
+ //- USERS
+ el-tab-pane.pt-1
+ template(slot='label')
+ v-icon(name='users')
+ span.ml-1 {{$t('Users')}}
+ el-table(:data='paginatedUsers' small)
+ el-table-column(label='Email')
+ template(slot-scope='data')
+ el-popover(trigger='hover' :content='data.row.description' width='400')
+ span(slot='reference') {{data.row.email}}
+ el-table-column(label='Azioni')
+ template(slot-scope='data')
+ el-button.mr-1(size='mini'
+ :type='data.row.is_active?"warning":"success"'
+ @click='toggle(data.row)') {{data.row.is_active?$t('Deactivate'):$t('Activate')}}
+ el-button(size='mini'
+ :type='data.row.is_admin?"danger":"warning"'
+ @click='toggleAdmin(data.row)') {{data.row.is_admin?$t('Remove Admin'):$t('Admin')}}
+ el-pagination(:page-size='perPage' :currentPage.sync='userPage' :total='users.length')
+
+ //- PLACES
+ el-tab-pane.pt-1
+ template(slot='label')
+ v-icon(name='map-marker-alt')
+ span.ml-1 {{$t('Places')}}
+ p {{$t('admin_place_explanation')}}
+ el-form.mb-2(:inline='true' label-width='120px')
+ el-form-item(:label="$t('Name')")
+ el-input.mr-1(:placeholder='$t("Name")' v-model='place.name')
+ el-form-item(:label="$t('Address')")
+ el-input.mr-1(:placeholder='$t("Address")' v-model='place.address')
+ el-button(variant='primary' @click='savePlace') {{$t('Save')}}
+ b-table(selectable :items='places' :fields='placeFields' striped hover
+ small selectedVariant='success' primary-key='id'
+ select-mode="single" @row-selected='placeSelected'
+ :per-page='perPage' :current-page='placePage')
+ el-pagination(:page-size='perPage' :currentPage.sync='placePage' :total='places.length')
+
+ //- EVENTS
+ el-tab-pane.pt-1
+ template(slot='label')
+ v-icon(name='calendar')
+ span.ml-1 {{$t('Events')}}
+ p {{$t('event_confirm_explanation')}}
+ el-table(:data='paginatedEvents' small primary-key='id' v-loading='loading')
+ el-table-column(:label='$t("Name")')
+ template(slot-scope='data') {{data.row.title}}
+ el-table-column(:label='$t("Where")')
+ template(slot-scope='data') {{data.row.place.name}}
+ el-table-column(:label='$t("Confirm")')
+ template(slot-scope='data')
+ el-button(type='primary' @click='confirm(data.row.id)' size='mini') {{$t('Confirm')}}
+ el-button(type='success' @click='preview(data.row.id)' size='mini') {{$t('Preview')}}
+
+ el-pagination(:page-size='perPage' :currentPage.sync='eventPage' :total='events.length')
+
+ //- TAGS
+ el-tab-pane.pt-1
+ template(slot='label')
+ v-icon(name='tag')
+ span {{$t('Tags')}}
+ p {{$t('admin_tag_explanation')}}
+ el-tag(v-if='tag.tag' :color='tag.color || "grey"' size='mini') {{tag.tag}}
+ el-form(:inline='true' label-width='120px')
+ el-form-item(:label="$t('Color')")
+ el-color-picker(v-model='tag.color' @change='updateColor')
+ el-table(:data='paginatedTags' striped small hover
+ highlight-current-row @current-change="tagSelected")
+ el-table-column(label='Tag')
+ template(slot-scope='data')
+ el-tag(:color='data.row.color || "grey"' size='mini') {{data.row.tag}}
+ el-pagination(:page-size='perPage' :currentPage.sync='tagPage' :total='tags.length')
+
+ //- SETTINGS
+ el-tab-pane.pt-1
+ template(slot='label')
+ v-icon(name='tools')
+ span {{$t('Settings')}}
+ el-form(inline)
+ span {{$t('admin_mastodon_explanation')}}
+ el-input(v-model="mastodon_instance")
+ span(slot='prepend') {{$t('Mastodon instance')}}
+ el-button(slot='append' @click='associate' variant='success' type='success') {{$t('Associate')}}
+
+
+
\ No newline at end of file
diff --git a/pages/Register.vue b/pages/register.vue
similarity index 95%
rename from pages/Register.vue
rename to pages/register.vue
index ce0afef8..86891161 100644
--- a/pages/Register.vue
+++ b/pages/register.vue
@@ -18,8 +18,8 @@