diff --git a/assets/sass/_theme/_configuration.sass b/assets/sass/_theme/_configuration.sass
index 12b503085d043ef0b625e6390e547ad76d106a61..4a4d1b8dfd767c3a70b6f4e5a5f56066c072d996 100644
--- a/assets/sass/_theme/_configuration.sass
+++ b/assets/sass/_theme/_configuration.sass
@@ -4,6 +4,7 @@
 $main-color: black !default // Text color
 $main-background-color: white !default // Background color
 $main-border-color: lightgray !default // Border color
+$main-light-color: #f8f9fa !default
 // TODO : faut-il mettre les largeur de border dans le config ? overkill ?
 
 $body-color: $main-color !default
@@ -50,6 +51,7 @@ $btn-padding-y: px2rem(6) !default
 $breadcrumb-color: invert($main-color) !default
 
 // Spacing
+$spacing0: 12px !default
 $spacing1: 24px !default
 $spacing2: 48px !default
 $spacing3: 64px !default
@@ -57,15 +59,16 @@ $spacing4: 128px !default
 $spacing5: 256px !default
 
 // Grid
-$grid-gutter: 60px
+$grid-gutter: $spacing3 !default
 $grid-max-width: 1980px
-$grid-gutter-sm: 20px
+$grid-gutter-sm: $spacing1 !default
 
 // Z-index
 $zindex-nav-accessibility: 1010 !default
 $zindex-stretched-link: 2 !default
 $zindex-header: 10 !default
 $zindex-body-overlay: 9 !default
+$zindex-toc: 50 !default
 
 // Header
 $header-color: $main-color !default
@@ -161,6 +164,12 @@ $post-time-color: lighten($main-color, 2) !default
 $toc-color: $main-color !default
 $toc-active-color: $main-color !default // TODO : checker ce que ça fait
 
+// Person
+$persons-avatar-background-color: $main-light-color !default
+
+// Program
+$program-zindex-toc: $zindex-toc !default
+
 // MISC
 
 // Animations
diff --git a/assets/sass/_theme/_utils.sass b/assets/sass/_theme/_utils.sass
index 8f341fb108958a47626899a0a5088e7239569194..21805a7e01dc6d30e3dd47191b7581f1db209e40 100644
--- a/assets/sass/_theme/_utils.sass
+++ b/assets/sass/_theme/_utils.sass
@@ -77,11 +77,11 @@
     @if $breakpoint
         @include media-breakpoint-up($breakpoint)
             display: grid
-            grid-gap: 0 $grid-gutter
+            grid-gap: $grid-gutter/2 $grid-gutter
             grid-template-columns: repeat($cols, 1fr)
-    @else 
+    @else
         display: grid
-        grid-gap: 0 $grid-gutter
+        grid-gap: $grid-gutter/2 $grid-gutter
         grid-template-columns: repeat($cols, 1fr)
 
 @function col($nb, $base: 12)
@@ -99,23 +99,26 @@
         top: 0
         z-index: $zindex-stretched-link
 
-@mixin aspect-ratio($width, $height, $selector: 'iframe')
-    #{$selector}
-        aspect-ratio: #{$width}/#{$height}
-        display: block
-        width: 100%
-    @supports not (aspect-ratio: 1)
-        position: relative
-        &::before
-            content: ''
-            padding-top: ($height / $width) * 100%
-            width: 100%
+@mixin aspect-ratio($width, $height, $selector: null)
+    @if $selector
         #{$selector}
-            bottom: 0
-            left: 0
-            position: absolute
-            right: 0
-            top: 0
+            aspect-ratio: #{$width}/#{$height}
+            display: block
+            width: 100%
+        @supports not (aspect-ratio: 1)
+            position: relative
+            &::before
+                content: ''
+                padding-top: ($height / $width) * 100%
+                width: 100%
+            #{$selector}
+                bottom: 0
+                left: 0
+                position: absolute
+                right: 0
+                top: 0
+    @else
+        aspect-ratio: #{$width}/#{$height}
 
 @mixin visually-hidden
     clip: rect(0,0,0,0) !important
@@ -144,3 +147,12 @@
     list-style: none
     padding-left: 0
     margin-bottom: 0
+
+@mixin inset($top: 0, $right: $top, $bottom: $top, $left: $top)
+    inset: $top $right $bottom $left
+    // polyfill for inset
+    @supports not (inset: $top)
+        bottom: $bottom
+        left: $left
+        right: $right
+        top: $top
diff --git a/assets/sass/_theme/blocks/blocks.sass b/assets/sass/_theme/blocks/blocks.sass
deleted file mode 100644
index 0c6945fe41dd9a5fe40e95dbeee3e1649ce569b6..0000000000000000000000000000000000000000
--- a/assets/sass/_theme/blocks/blocks.sass
+++ /dev/null
@@ -1,3 +0,0 @@
-.blocks
-    > *
-        margin-top: $spacing1
diff --git a/assets/sass/_theme/blocks/call_to_action.sass b/assets/sass/_theme/blocks/call_to_action.sass
index 0a206caad5e2dfce52d1f9f07d96b5496f6bc058..25f50809b1ef2effc44e7652a695baa2c5c967e8 100644
--- a/assets/sass/_theme/blocks/call_to_action.sass
+++ b/assets/sass/_theme/blocks/call_to_action.sass
@@ -5,14 +5,23 @@
             margin-bottom: 0
 
         > div
+            [role="group"]
+                @include media-breakpoint-down(md)
+                    display: flex
+                    flex-direction: column
             // button
             div + div,
             & >
                 a
-                    @extend .btn
                     margin-top: 1rem
-                    background: $block-call-to-action-button-background
-                    color: $block-call-to-action-button-color
+                    color: $block-call-to-action-color
+                    text-decoration-color: rgba($block-call-to-action-color, .3)
+                    &:hover
+                        text-decoration-color: $block-call-to-action-color
+                    &:first-of-type
+                        @extend .btn
+                        background: $block-call-to-action-button-background
+                        color: $block-call-to-action-button-color
         @include in-page-with-aside
             display: flex
             flex-direction: column
@@ -38,6 +47,9 @@
                     padding-right: col(3, 8)
                 > div
                     padding: col(1, 8)
+                [role="group"]
+                    a
+                        margin-right: px2rem(20)
 
     @include in-page-without-aside
         .block-content
diff --git a/assets/sass/_theme/blocks/files.sass b/assets/sass/_theme/blocks/files.sass
index faf9292d1c366ad50dd42a7a380392d9723bfe34..9f5799c278468b50f806c3c71f4db8cd2fee892d 100644
--- a/assets/sass/_theme/blocks/files.sass
+++ b/assets/sass/_theme/blocks/files.sass
@@ -1,6 +1,7 @@
 .block-files
     ul
         @include list-reset
+        @include grid(1)
         @include in-page-with-aside
             @include grid(2, md)
         @include in-page-without-aside
@@ -17,11 +18,11 @@
             flex-shrink: 0
             height: px2rem(60)
             justify-content: center
-            // margin-right: px2rem(15)
+            margin-right: $spacing0
             transition: background 0.3s ease, border 0.3s ease
             width: px2rem(60)
         &::after
-            content: none
+            content: none !important // Remove default icon _blank
         &:hover
             &::before
                 background-color: $main-border-color
diff --git a/assets/sass/_theme/blocks/testimonials.sass b/assets/sass/_theme/blocks/testimonials.sass
index a7605505b80032a7180d5135792167c3f9fb75e2..bf59ea5a5db440257e8c5580e88a09d2597f0588 100644
--- a/assets/sass/_theme/blocks/testimonials.sass
+++ b/assets/sass/_theme/blocks/testimonials.sass
@@ -20,7 +20,8 @@
             font-size: calc(#{$block-testimonials-font-size} * 3)
             line-height: 1
             position: absolute
-            // TODO : ajuster en fonctiond e la typo
+            transform: translateY(-50%)
+            // TODO : ajuster en fonction de la typo
 
     figure
         font-size: px2rem(16)
@@ -89,11 +90,13 @@
                     background-color: $block-testimonials-pagination-progress-background
                     width: 0
 
-    @include in-page-without-aside
-        .testimonials
-            @include media-breakpoint-up(md)
-                padding-right: col(4)
+    body:not(.programs__section)
+        @include in-page-without-aside
+            .testimonials
+                @include media-breakpoint-up(md)
+                    padding-right: col(4)
 
+        // TODO : en discuter en créa
         // figure
         //     display: flex
         //     figcaption
diff --git a/assets/sass/_theme/design-system/layout.sass b/assets/sass/_theme/design-system/layout.sass
index 28877a4d68c1939e3fbec0f73f98861618b38b1b..38df8d75d0c8e1e3ebf6b4ecb05dd1f9b82e4f8e 100644
--- a/assets/sass/_theme/design-system/layout.sass
+++ b/assets/sass/_theme/design-system/layout.sass
@@ -39,3 +39,10 @@ img
 
 ul
     padding-left: px2rem(15)
+
+main
+    padding-bottom: $spacing3
+
+.blocks
+    > *
+        margin-top: $spacing3
diff --git a/assets/sass/_theme/design-system/table_of_content.sass b/assets/sass/_theme/design-system/table_of_content.sass
index 55a7cc47486b1a8afb28065abaf489cb042431d9..87cb5a1317830a81406d0e845fde8253fff34500 100644
--- a/assets/sass/_theme/design-system/table_of_content.sass
+++ b/assets/sass/_theme/design-system/table_of_content.sass
@@ -15,6 +15,7 @@
                 line-height: px2rem(30)
                 padding: $spacing1/2
                 margin-left: -$spacing1/2
+                margin-right: -$spacing1/2
                 text-decoration: none
                 &:hover
                     text-decoration: underline
diff --git a/assets/sass/_theme/design-system/typography.sass b/assets/sass/_theme/design-system/typography.sass
index a49713026c76da0a14f8b43c3793d263abad57aa..9191969c0768eb7dd83f0bfa0c4f1eb637f74720 100644
--- a/assets/sass/_theme/design-system/typography.sass
+++ b/assets/sass/_theme/design-system/typography.sass
@@ -5,26 +5,32 @@
 h1, .h1
     @extend %heading
     font-size: $h1-size
+    font-weight: $h1-weight
 
-h2, .h2
+h2, .h2, .lead
     @extend %heading
     font-size: $h2-size
+    font-weight: $h2-weight
 
 h3, .h3
     @extend %heading
     font-size: $h3-size
+    font-weight: $h3-weight
 
 h4, .h4
     @extend %heading
     font-size: $h4-size
+    font-weight: $h4-weight
 
 h5, .h5
     @extend %heading
     font-size: $h5-size
+    font-weight: $h5-weight
 
 h6, .h6
     @extend %heading
     font-size: $h6-size
+    font-weight: $h6-weight
 
 h1, .h1,
 h2, .h2
@@ -42,6 +48,7 @@ body
     line-height: $line-height-base
 
 p, .p
+    margin-top: 0
     font-size: $body-font-size
 
 small, .small
diff --git a/assets/sass/_theme/hugo-osuny.sass b/assets/sass/_theme/hugo-osuny.sass
index 5be6b9c7f4ce5fe92f715e975d2dbc9e3183ca43..530513908b8e118a342457102b43b8b57350a4d2 100644
--- a/assets/sass/_theme/hugo-osuny.sass
+++ b/assets/sass/_theme/hugo-osuny.sass
@@ -27,7 +27,6 @@
 
 // Blocks
 @import "blocks/datatable"
-@import "blocks/blocks"
 @import "blocks/call_to_action"
 @import "blocks/chapter"
 @import "blocks/contact"
diff --git a/assets/sass/_theme/sections/persons.sass b/assets/sass/_theme/sections/persons.sass
index 733408654366b79087b789d6936fc8e79591eda6..fc633106292be6f96aab90960c1c7e17b40d95cf 100644
--- a/assets/sass/_theme/sections/persons.sass
+++ b/assets/sass/_theme/sections/persons.sass
@@ -1,58 +1,64 @@
+/* TODO refacto widget */
 .person
     position: relative
     display: flex
     flex-direction: column
-    & > a
-        display: flex
-        flex-direction: column
-
-    &,
-    & > a
-        @include media-breakpoint-down(md)
-            display: block
-        > div:first-of-type
-            // @extend .card-body
-            padding-left: 0
-            padding-right: 0
-            @include media-breakpoint-down(md)
-                float: left
-                max-width: calc(100% - 6rem)
-                padding-bottom: 0
-                padding-top: 0
 
     p
         margin-bottom: 0
+        margin-top: 0
 
     .avatar
+        margin-bottom: $spacing1
         order: -1
         width: px2rem(76)
-        @include media-breakpoint-down(md)
-            float: right
 
     .name
-        // @extend .card-title
-        margin-bottom: 0
-        @include media-breakpoint-down(md)
-            font-size: px2rem(22)
         a
             @include stretched-link
-            @include link
+            // @include link
+
+    .name ~ p
+        @extend .small
 
-    .name + p
-        font-size: px2rem(16)
+    @include media-breakpoint-down(md)
+        display: block
+        &::after
+            content: ''
+            clear: both
+            display: table
+        > div:first-of-type
+            float: left
+            max-width: calc(100% - 6rem)
+        .avatar
+            float: right
+            margin-bottom: 0
 
-    .name ~ .contact
-        // @extend .small
 
 .persons
+    @include grid(1)
     @include grid(2, md)
     @include grid(3, lg)
 
+
 .avatar
-    background-color: #f8f9fa
+    @include aspect-ratio(50, 50, 'img')
+    background-color: $persons-avatar-background-color
     border-radius: 50%
     overflow: hidden
-    img
-        object-fit: cover
+    position: relative
+    width: 100%
+    &::before
+        content: ""
         display: block
+        padding-top: 100%
 
+    picture,
+    img
+        @include inset(0)
+        height: 100%
+        width: 100%
+        position: absolute
+
+    img
+        object-fit: cover
diff --git a/assets/sass/_theme/sections/programs.sass b/assets/sass/_theme/sections/programs.sass
index eebfc3fc9db6cd296915b3d4d6b8bf701a5cf795..d05453f79aad5c1c8d9455cff33411f141c6b68d 100644
--- a/assets/sass/_theme/sections/programs.sass
+++ b/assets/sass/_theme/sections/programs.sass
@@ -47,18 +47,21 @@
 //             @include grid(2, lg)
 
 .programs__section
+    .lead
+        padding-top: $spacing4
     aside
         @include container
         @include sticky($header-height)
         overflow: auto
         background: darken($main-background-color, 3)
-        z-index: 50
+        z-index: $program-zindex-toc
     .toc
         max-width: 100%
         ol
             display: flex
             flex-direction: row
             flex-wrap: nowrap
+            justify-content: space-between
             white-space: nowrap
             margin: 0 #{-$spacing1}
             li
@@ -67,17 +70,18 @@
     .blocks
         .block-content
             padding-left: col(5)
-    [itemprop="articleBody"]
-        section
-            padding-top: $spacing1
-            padding-bottom: $spacing4
-            border-top: 1px solid $main-color
-            @include grid(12, md)
-            @include media-breakpoint-up(md)
+
+    @include media-breakpoint-up(md)
+        article
+            .content
+                @include grid(12, md)
+                padding-top: $spacing1
+                padding-bottom: $spacing4
+                border-top: 1px solid $main-color
                 position: relative
                 > *
                     grid-column: 6/13
-                h2
+                > h2
                     $sticky-top-offset: 90px
                     @include sticky(#{$header-height + $sticky-top-offset})
                     top: $sticky-top-offset
diff --git a/layouts/diplomas/term.html b/layouts/diplomas/term.html
index dba9e93505179ead9d42a480c26dac4524a815b2..46ca90d8007d6365b6759a2c5b06c3b1d43dab4f 100644
--- a/layouts/diplomas/term.html
+++ b/layouts/diplomas/term.html
@@ -1,6 +1,7 @@
 {{ define "main" }}
   {{ partial "diplomas/hero-single.html" . }}
 
+  {{ partial "blocks/list.html" .Params.blocks }}
   <div class="container">
     {{ partial "programs/programs.html" .Pages }}
   </div>
diff --git a/layouts/pages/list.html b/layouts/pages/list.html
index 9d4dbb6c8b332fc1bdde0caff24c68b25148c521..f9824ccb0beb1382a1d3087d8b2609c7fcbf0f28 100644
--- a/layouts/pages/list.html
+++ b/layouts/pages/list.html
@@ -11,14 +11,12 @@
     {{ end }}
 
     <div class="content-blocks">
-      {{- if $need_aside }}
       {{ partial "pages/aside.html"
           (dict
               "category" $category
               "context" .
           )
       }}
-      {{ end -}}
       {{ partial "blocks/list.html" .Params.blocks }}
     </div>
   {{ else }}
diff --git a/layouts/partials/GetPageByUrl b/layouts/partials/GetPageByUrl
index ca73cb2c02a0ae85a484ae144da33fbe4c163216..713323133c251c82c59e5fc6c9deb1c56ba49ff4 100644
--- a/layouts/partials/GetPageByUrl
+++ b/layouts/partials/GetPageByUrl
@@ -1,9 +1,5 @@
-{{ $target := . }}
 {{ $page := "" }}
-{{ range site.Pages }}
-  {{ $pageTarget := .RelPermalink }}
-  {{ if eq $pageTarget $target }}
-    {{ $page = . }}
-  {{ end }}
+{{ range (where site.Pages "RelPermalink" "eq" .) }}
+  {{  $page = . }}
 {{ end }}
-{{ return $page }}
+{{ return $page }}
\ No newline at end of file
diff --git a/layouts/partials/head/css.html b/layouts/partials/head/css.html
index c91107532b9e6580d190dcde06b3dd883e9fd0a1..bd676627af5733460e0012d4c38cf87616f2eae5 100644
--- a/layouts/partials/head/css.html
+++ b/layouts/partials/head/css.html
@@ -1,10 +1,12 @@
 <!-- CSS -->
 {{- $cssOpts := (dict
-      "targetPath" "assets/css/main.css"
-      "enableSourceMap" (not hugo.IsProduction)
-      "includePaths" (slice "node_modules")
-    ) -}}
+  "targetPath" "assets/css/main.css"
+  "enableSourceMap" true
+  "includePaths" (slice "node_modules")
+) -}}
 
-{{- $styles := resources.Get "sass/main.sass" | toCSS $cssOpts  -}}
-
-<link rel="stylesheet" href="{{ $styles.Permalink }}" media="screen">
+{{- $styles := resources.Get "sass/main.sass" | toCSS $cssOpts -}}
+{{ if hugo.IsProduction }}
+  {{- $styles = resources.Get "sass/main.sass" | toCSS $cssOpts | postCSS | minify | fingerprint -}}
+{{ end }}
+<link rel="stylesheet" href="{{ $styles.Permalink }}" integrity="{{ $styles.Data.Integrity }}" media="screen">
\ No newline at end of file
diff --git a/layouts/partials/header/breadcrumbs.html b/layouts/partials/header/breadcrumbs.html
index 3cb3e3f2adf78c4415437815717a227a49825fe6..f9c7b19445705b08dbbd8297c2216d479342e89b 100644
--- a/layouts/partials/header/breadcrumbs.html
+++ b/layouts/partials/header/breadcrumbs.html
@@ -1,25 +1,64 @@
 <nav aria-label="{{ i18n "commons.breadcrumb" }}">
-  <ol class="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">
-    {{ template "breadcrumbnav" (dict "p1" . "p2" .) }}
+  {{- $path := strings.TrimSuffix "/" .RelPermalink -}}
+  {{- $length := len (split $path "/") }}
+  <ol itemscope itemtype="https://schema.org/BreadcrumbList" class="breadcrumb">
+    {{- template "breadcrumbOptimized"
+                (dict 
+                  "p1" . 
+                  "p2" . 
+                  "path" $path 
+                  "position" $length
+                ) }}
   </ol>
 </nav>
-{{ define "breadcrumbnav" }}
+
+{{- define "breadcrumbOptimized" -}}
+  {{- $positionNext := sub .position 1 -}}
   {{- if .p1.Parent -}}
-    {{- template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 )  -}}
-  {{- else if not .p1.IsHome }}
-    {{- template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 )  -}}
+    {{- $path := strings.TrimSuffix "/" .path -}}
+    {{- $split := path.Split $path -}}
+    {{/*
+      {{ .p1.Parent.RelPermalink }} <br> {{ $split.Dir }} <br>
+    */}}
+    {{- if eq .p1.Parent.RelPermalink $split.Dir -}}
+      {{/* Normal case, parent matches permalink<br><br> */}}
+      {{- template "breadcrumbOptimized" (dict "p1" .p1.Parent "p2" .p2 "path" $split.Dir "position" $positionNext) -}}
+    {{- else -}}
+      {{/* Dissonant case, the supposed parent does not have the correct path, so we do an expensive search<br><br> */}}
+      {{- $page := partial "GetPageByUrl" $split.Dir -}}
+      {{- if $page -}}
+        {{- template "breadcrumbOptimized" (dict "p1" $page "p2" .p2 "path" $split.Dir "position" $positionNext) -}}
+      {{- else -}}
+        {{- template "breadcrumbOptimized" (dict "p1" .p1.Parent "p2" .p2 "path" $split.Dir "position" $positionNext) -}}
+      {{- end -}}
+    {{- end -}}
+  {{- else if not .p1.IsNode -}}
+    {{- template "breadcrumbLink" (dict "page" .p1.Site.Home "position" .position)  -}}
   {{- end -}}
-  {{- if not (eq .p1.RelPermalink "/pages/") -}}
-    {{- $title := .p1.Params.breadcrumb_title -}}
-    {{- if not $title -}}{{- $title = .p1.Title -}}{{- end }}
-    {{ if eq .p1 .p2 -}}
-      <li class="breadcrumb-item active" aria-current="page" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
-        {{- $title -}}
-      </li>
-    {{ else -}}
-      <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
-        <a href="{{ .p1.Permalink }}">{{ $title }}</a>
-      </li>
-    {{ end -}}
+  {{- template "breadcrumbLink" (dict "page" .p1 "active" (eq .p1 .p2) "position" .position) -}}
+{{- end -}}
+
+{{ define "breadcrumbLink" -}}
+  {{/* The pages root is not supposed to show, it's confusing with the home */}}
+  {{- if not (eq .page.RelPermalink "/pages/") -}}
+    {{- $title := .page.Params.breadcrumb_title -}}
+    {{- if not $title -}}
+      {{- $title = .page.Title -}}
+    {{- end -}}
+    {{- $title = chomp $title }}
+    <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="breadcrumb-item{{- if .active }} active{{ end }}"{{- if .active }} aria-current="page"{{ end }}>
+      {{ if .active -}}
+        <span itemprop="item">
+      {{- else -}}
+        <a itemprop="item" href="{{ .page.Permalink }}">
+      {{- end }}
+        <span itemprop="name">{{- $title -}}</span>
+        <meta itemprop="position" content="{{- .position -}}">
+      {{ if .active -}}
+        </span>
+      {{- else -}}
+      </a>
+      {{- end }}
+    </li>
   {{- end -}}
 {{- end -}}
\ No newline at end of file
diff --git a/layouts/partials/pages/aside.html b/layouts/partials/pages/aside.html
index 7febe025c56c4568fb7c926db033bc8e96d2315a..3edb9e456c8a41376737c8c63b5f6ca9cd7d2313 100644
--- a/layouts/partials/pages/aside.html
+++ b/layouts/partials/pages/aside.html
@@ -1,4 +1,4 @@
-<aside data-current="Test">
+<aside>
   <div>
     {{- partial "pages/toc.html" . -}}
   </div>
diff --git a/layouts/partials/persons/person.html b/layouts/partials/persons/person.html
index 484fba4bc12502c489578f2bece7931b01a06e68..15135d58c0c4598f6655d9e5e1a1242ae0dac811 100644
--- a/layouts/partials/persons/person.html
+++ b/layouts/partials/persons/person.html
@@ -2,8 +2,8 @@
   <div>
     {{- $title := partial "PrepareHTML" .Title }}
     <p class="name"><a href="{{ .Permalink }}">{{- $title -}}</a></p>
-    {{- if .Params.description_short }}
-      <p>{{- chomp (safeHTML (plainify .Params.description_short)) -}}</p>
+    {{- if partial "GetTextFromHTML" .Params.description_short }}
+      <p>{{- partial "PrepareHTML" .Params.description_short -}}</p>
     {{ else if (partial "GetTextFromHTML" .Content) }}
       <p>{{- partial "GetTruncateContent"  .Content -}}</p>
     {{ end -}}
diff --git a/layouts/partials/programs/admission.html b/layouts/partials/programs/admission.html
index 838b7e0111d49ab964b5a5bc01f1ca9e0512240e..82da9a38743f18f8ea4625d9abb5b22f2bcf9544 100644
--- a/layouts/partials/programs/admission.html
+++ b/layouts/partials/programs/admission.html
@@ -1,9 +1,8 @@
+{{- if or (partial "GetTextFromHTML" .Params.prerequisites) (partial "GetTextFromHTML" .Params.pricing) (partial "GetTextFromHTML" .Params.registration) (partial "GetTextFromHTML" .Params.accessibility) (partial "GetTextFromHTML" .Params.other) -}}
 <section id="admission">
   <div class="container">
     <div class="content">
-      <div>
-        <h2>{{ i18n "programs.toc.admission" }}</h2>
-      </div>
+      <h2>{{ i18n "programs.toc.admission" }}</h2>
       <div>
         {{- if partial "GetTextFromHTML" .Params.prerequisites -}}
           <div class="subpart">
@@ -19,17 +18,20 @@
           </div>
         {{- end -}}
 
-        {{- if partial "GetTextFromHTML" .Params.accessibility -}}
+        {{- if partial "GetTextFromHTML" .Params.registration -}}
           <div class="subpart">
-            <h3>{{ i18n "programs._accessibility" }}</h3>
-            {{- partial "PrepareHTML" .Params.accessibility -}}
+            <h3>{{ i18n "programs._registration" }}</h3>
+            {{- partial "PrepareHTML" .Params.registration -}}
+            {{- if partial "GetTextFromHTML" .Params.registration_url -}}
+              <p><a href="{{- partial "PrepareHTML" .Params.registration_url -}}" class="registration">{{ i18n "programs.apply" }}</a></p>
+            {{- end -}}
           </div>
         {{- end -}}
 
-        {{- if partial "GetTextFromHTML" .Params.registration -}}
+        {{- if partial "GetTextFromHTML" .Params.accessibility -}}
           <div class="subpart">
-            <h3>{{ i18n "programs._registration" }}</h3>
-            {{- partial "PrepareHTML" .Params.registration -}}
+            <h3>{{ i18n "programs._accessibility" }}</h3>
+            {{- partial "PrepareHTML" .Params.accessibility -}}
           </div>
         {{- end -}}
 
@@ -40,13 +42,48 @@
           </div>
         {{- end -}}
 
-        {{- if partial "GetTextFromHTML" .Params.contacts -}}
+        {{- if .Params.roles -}}
+          <div class="subpart">
+            <h3>{{ i18n "programs._roles" }}</h3>
+            {{- with .Params.roles -}}
+              {{- range . }}
+                {{ $title := .title }}
+                {{- range .persons -}}
+                  {{ $slug := . }}
+                  {{ with site.GetPage "persons" }}
+                    {{ with .GetPage $slug }}
+                      <p>
+                        <b>{{ $title }}</b>
+                        <br>
+                        <a href="{{ .Permalink }}">{{ partial "PrepareHTML" .Title }}</a>
+                        {{ if .Params.phone }}
+                          <br>
+                          {{ safeHTML .Params.phone }}
+                        {{ end }}
+                        {{ if .Params.email }}
+                          <br>
+                          <a href="mailto:{{ .Params.email }}" rel="noreferrer" target="_blank">{{ .Params.email }}</a>
+                        {{ end }}
+                      </p>
+                    {{ end }}
+                  {{ end }}
+                {{ end }}
+              {{ end -}}
+            {{- end -}}
+          </div>
+        {{- end -}}
+
+        {{- if  partial "GetTextFromHTML" .Params.contacts -}}
           <div class="subpart">
             <h3>{{ i18n "programs._contacts" }}</h3>
-            {{- partial "PrepareHTML" .Params.contacts -}}
+            {{- if or (partial "GetTextFromHTML" .Params.contacts) -}}
+              {{- partial "PrepareHTML" .Params.contacts -}}
+            {{- end -}}
           </div>
         {{- end -}}
+
       </div>
     </div>
   </div>
 </section>
+{{- end -}}
diff --git a/layouts/partials/programs/aside.html b/layouts/partials/programs/aside.html
index 105f9c0a2e4d9ba7973edada9037509f434bb01e..6efd5c6d9d8ff89d9c7ce7955e2477a74c86b783 100644
--- a/layouts/partials/programs/aside.html
+++ b/layouts/partials/programs/aside.html
@@ -1,8 +1,3 @@
 <aside>
-  <div>
-    {{- partial "programs/toc.html" . -}}
-    {{ if .context.Params.main_information }}
-      {{- partial "PrepareHTML" .context.Params.main_information -}}
-    {{ end }}
-  </div>
+  {{- partial "programs/toc.html" . -}}
 </aside>
diff --git a/layouts/partials/programs/essential.html b/layouts/partials/programs/essential.html
new file mode 100644
index 0000000000000000000000000000000000000000..bc5730ecf4c104fa7e239272a49519bf7eee7e05
--- /dev/null
+++ b/layouts/partials/programs/essential.html
@@ -0,0 +1,22 @@
+{{ $parent := .Params.parent }}
+{{- with .Params.diplomas -}}
+  {{- $diploma := site.GetPage (printf "/diplomas/%s" .) -}}
+  {{- with $diploma -}}
+    <dl class="essential">
+      <dt>{{ i18n "programs.diploma" }}</dt>
+      <dd><a href="{{ .Permalink }}">{{ partial "PrepareHTML" .Title }}</a></dd>
+      {{- if .Params.level -}}
+        <dt>{{ i18n "programs.level" }}</dt>
+        <dd>{{ partial "PrepareHTML" .Params.level }}</dd>
+      {{- end -}}
+      {{- with $parent -}}
+        <dt>{{ i18n "programs.mention" }}</dt>
+        <dd><a href="{{ .url }}">{{ partial "PrepareHTML" .title }}</a></dd>
+      {{- end -}}
+      {{- if .Params.duration -}}
+        <dt>{{ i18n "programs.duration" }}</dt>
+        <dd>{{ partial "PrepareHTML" .Params.duration }}</dd>
+      {{- end -}}
+    </dl>
+  {{- end -}}
+{{- end -}}
diff --git a/layouts/partials/programs/hero-single.html b/layouts/partials/programs/hero-single.html
new file mode 100644
index 0000000000000000000000000000000000000000..b90ce242825be347aaaa4fdf977d12eb487bc65a
--- /dev/null
+++ b/layouts/partials/programs/hero-single.html
@@ -0,0 +1,26 @@
+{{- $title := or .Params.header_text .Title -}}
+<header class="hero">
+  <div class="container">
+    {{- if .Params.breadcrumb | default true -}}
+      {{ partial "header/breadcrumbs.html" . }}
+    {{- end -}}
+    <div>
+      <h1>{{ partial "PrepareHTML" $title }}</h1>
+    </div>
+  </div>
+  <div id="essential">
+    <div class="container">
+      {{- with .Params.diplomas -}}
+        {{- $diploma := site.GetPage (printf "/diplomas/%s" .) -}}
+        {{- partial "diplomas/essential" $diploma -}}
+      {{- end -}}
+      <div class="dropdown-share dropup">
+        <button type="button" id="shareProgram" data-bs-toggle="dropdown" aria-expanded="false">{{ i18n "commons.share" }}</button>
+        <div class="dropdown-menu">
+          {{ partial "commons/share.html" . }}
+        </div>
+      </div>
+    </div>
+  </div>
+</header>
+{{ partial "programs/aside.html" . }}
diff --git a/layouts/partials/programs/pedagogy.html b/layouts/partials/programs/pedagogy.html
index 190ab305cb062dea2f55c12f77bdbcaf146b961d..e2368494d7d37323a05007625f1d781b0b480c94 100644
--- a/layouts/partials/programs/pedagogy.html
+++ b/layouts/partials/programs/pedagogy.html
@@ -1,13 +1,15 @@
+{{- if or (partial "GetTextFromHTML" .Params.content) (partial "GetTextFromHTML" .Params.pedagogy) (partial "GetTextFromHTML" .Params.evaluation) (.Params.teachers) -}}
 <section id="pedagogy">
   <div class="container">
     <div class="content">
+      <h2>{{ i18n "programs.toc.pedagogy" }}</h2>
       <div>
-        <h2>{{ i18n "programs.toc.pedagogy" }}</h2>
-      </div>
-      <div>
-        <div class="subpart">
-          {{- partial "PrepareHTML" .Params.content -}}
-        </div>
+        {{- if partial "GetTextFromHTML" .Params.content -}}
+          <div class="subpart">
+            <h3>{{ i18n "programs._content" }}</h3>
+            {{- partial "PrepareHTML" .Params.content -}}
+          </div>
+        {{- end -}}
 
         {{- if partial "GetTextFromHTML" .Params.pedagogy -}}
           <div class="subpart">
@@ -39,3 +41,4 @@
     </div>
   </div>
 </section>
+{{- end -}}
diff --git a/layouts/partials/programs/presentation.html b/layouts/partials/programs/presentation.html
index b292a7fb81241275236916fe95684ef5c965579a..84ef52900007d2d27b1ab06b0659108914ac6efc 100644
--- a/layouts/partials/programs/presentation.html
+++ b/layouts/partials/programs/presentation.html
@@ -1,15 +1,50 @@
 <section id="presentation">
-  {{ if .Params.objectives }}
     <div class="container">
       <div class="content">
-        <div>
-          <h2>{{ i18n "programs.toc.presentation" }}</h2>
-        </div>
+        <h2>{{ i18n "programs.toc.presentation" }}</h2>
+
         <div>
           {{- partial "programs/image.html" .Params.image -}}
-          {{- partial "PrepareHTML" .Params.objectives -}}
+          {{- if partial "GetTextFromHTML" .Params.objectives -}}
+            {{- partial "PrepareHTML" .Params.objectives -}}
+          {{- end -}}
+
+          <div class="subpart">
+            <h3>{{ i18n "programs._administrative_information" }}</h3>
+            <table class="table table-infos">
+              <caption>{{ i18n "programs._administrative_information" }}</caption>
+              <tbody>
+                {{- with .Params.diplomas -}}
+                  {{- $diploma := site.GetPage (printf "/diplomas/%s" .) -}}
+                  {{- with $diploma.Params.ects -}}
+                    <tr>
+                      <th>{{ i18n "programs.ects_credits" }}</th>
+                      <td>{{ partial "PrepareHTML" . }}</td>
+                    </tr>
+                  {{- end -}}
+                {{- end -}}
+                <tr>
+                  <th>{{ i18n "programs.type.initial" }}</th>
+                  <td>{{ if .Params.initial }}{{ i18n "commons.true" }}{{ else }}{{ i18n "commons.false" }}{{ end }}</td>
+                </tr>
+                <tr>
+                  <th>{{ i18n "programs.type.continuing" }}</th>
+                  <td>{{ if .Params.continuing }}{{ i18n "commons.true" }}{{ else }}{{ i18n "commons.false" }}{{ end }}</td>
+                </tr>
+                <tr>
+                  <th>{{ i18n "programs.type.apprenticeship" }}</th>
+                  <td>{{ if .Params.apprenticeship }}{{ i18n "commons.true" }}{{ else }}{{ i18n "commons.false" }}{{ end }}</td>
+                </tr>
+                {{- if partial "GetTextFromHTML" .Params.capacity -}}
+                <tr>
+                  <th>{{ i18n "programs.capacity" }}</th>
+                  <td>{{ partial "PrepareHTML" .Params.capacity }}</td>
+                </tr>
+                {{- end -}}
+              </tbody>
+            </table>
+          </div>
         </div>
       </div>
     </div>
-  {{ end }}
 </section>
diff --git a/layouts/partials/programs/results.html b/layouts/partials/programs/results.html
index c289bfd77c8d59ac65520b6ad05e84bae71c17d2..bee436f96d11e1b4bfaf22e4d27da0b4dd15d299 100644
--- a/layouts/partials/programs/results.html
+++ b/layouts/partials/programs/results.html
@@ -1,9 +1,8 @@
+{{- if or (partial "GetTextFromHTML" .Params.opportunities) (partial "GetTextFromHTML" .Params.results) -}}
 <section id="results">
   <div class="container">
     <div class="content">
-      <div>
-        <h2>{{ i18n "programs.toc.results" }}</h2>
-      </div>
+      <h2>{{ i18n "programs.toc.results" }}</h2>
       <div>
         {{- if partial "GetTextFromHTML" .Params.opportunities -}}
           <div class="subpart">
@@ -22,3 +21,4 @@
     </div>
   </div>
 </section>
+{{- end -}}
diff --git a/layouts/partials/programs/show.html b/layouts/partials/programs/show.html
index 80778d7217847f7928dadddc1cbf625ba7b049e8..915457e8302b3dd4cc086b85230f6af279403fa5 100644
--- a/layouts/partials/programs/show.html
+++ b/layouts/partials/programs/show.html
@@ -1,48 +1,27 @@
-{{- $category := site.GetPage (printf "/categories%s" .Params.category) -}}
-{{- $chapters := slice
-                "objectives"
-                "opportunities"
-                "results"
-                "informations"
-                "accessibility"
-                "duration"
-                "pricing"
-                "content"
-                "pedagogy"
-                "evaluation"
-                "prerequisites"
-                "registration"
-                "other"
-                "contacts"
-                "teachers"
-                -}}
 <article itemscope itemtype="https://schema.org/EducationalOccupationalCredential">
   <meta itemprop="name" content="{{ partial "PrepareHTML" .Title }}">
   <meta itemprop="url" content="{{ .Permalink }}">
-
-  {{- partial "programs/aside.html"
-    (dict
-        "category" $category
-        "chapters" $chapters
-        "context" .
-    )
-  -}}
-
-  {{- partial "blocks/list.html" .Params.blocks -}}
-
-  <div>
-    <div class="container">
-      {{- partial "programs/image.html" .Params.image -}}
-      {{- partial "programs/abstract.html" .Params.presentation -}}
-      {{- partial "programs/programs.html" .Pages -}}
-      {{- partial "programs/chapters.html"
-        (dict
-          "chapters" $chapters
-          "params" .Params
-        )
-      -}}
-      {{- partial "posts/related.html" $category -}}
-    </div>
+  {{- if .Params.image -}}
+    {{- $id := .Params.image -}}
+    {{- if isset .Params.image "id" -}}
+      {{- $id = .Params.image.id -}}
+    {{- end -}}
+    {{- $image := partial "GetMedia" $id -}}
+    {{- if $image -}}
+      {{- $url := $image.url -}}
+      {{- if site.Params.keycdn -}}
+        {{- $url = $image.direct_url -}}
+      {{- end -}}
+      <meta itemprop="image" content="{{ $url }}">
+    {{- end -}}
+  {{- end -}}
+  <div class="container">
+    {{- partial "programs/abstract.html" .Params.presentation -}}
   </div>
-
+  {{- partial "programs/children.html" .Pages -}}
+  {{- partial "programs/presentation.html" . -}}
+  {{- partial "blocks/list.html" .Params.blocks -}}
+  {{- partial "programs/pedagogy.html" . -}}
+  {{- partial "programs/results.html" . -}}
+  {{- partial "programs/admission.html" . -}}
 </article>
diff --git a/layouts/partials/programs/toc.html b/layouts/partials/programs/toc.html
index a34f5c829aaa2df637af5a0aad2a9f42aa896978..73bf0556dac180693c4701144746ef898833660c 100644
--- a/layouts/partials/programs/toc.html
+++ b/layouts/partials/programs/toc.html
@@ -1,28 +1,20 @@
-{{- $params := .context.Params -}}
-{{- $contactsExist := or $params.contacts $params.roles -}}
 {{/* nav-link required for toggle active class */}}
 <nav class="toc" id="nav-toc" aria-label="{{ i18n "commons.toc" }}">
   <ol>
-    {{- range .chapters -}}
-      {{- $content := index $params . -}}
-      {{- $chapterExists := $content -}}
-      {{ if eq "contacts" . }}
-        {{- $chapterExists = $contactsExist -}}
-      {{ end }}
-      {{- if $chapterExists }}
-      <li>
-        <a class="nav-link" href="#page-{{ . }}">
-          {{- i18n (printf "programs._%s" .) -}}
-        </a>
-      </li>
-      {{- end -}}
-    {{- end -}}
-    {{- if .category.Pages }}
-      <li>
-        <a class="nav-link" href="#page-posts">
-          {{- i18n "programs.posts" -}}
-        </a>
-      </li>
-    {{ end -}}
+    <li>
+      <a class="nav-link" href="#essential">{{ i18n "programs.toc.essential" }}</a>
+    </li>
+    <li>
+      <a class="nav-link" href="#presentation">{{ i18n "programs.toc.presentation" }}</a>
+    </li>
+    <li>
+      <a class="nav-link" href="#pedagogy">{{ i18n "programs.toc.pedagogy" }}</a>
+    </li>
+    <li>
+      <a class="nav-link" href="#results">{{ i18n "programs.toc.results" }}</a>
+    </li>
+    <li>
+      <a class="nav-link" href="#admission">{{ i18n "programs.toc.admission" }}</a>
+    </li>
   </ol>
 </nav>
diff --git a/layouts/persons/single.html b/layouts/persons/single.html
index 7f0d9e3a7cd6606efdbbed4c8eb81feb1301895e..9dd53f146efae42458da855fc91eb515eb867c3e 100644
--- a/layouts/persons/single.html
+++ b/layouts/persons/single.html
@@ -29,8 +29,13 @@
 
       <div class="content">
         <div>
-          {{ if (partial "GetTextFromHTML" .Content) }}
+          {{ if (partial "GetTextFromHTML" .Params.description_short) }}
             <div class="lead" itemprop="description">
+              {{ partial "PrepareHTML" .Params.description_short }}
+            </div>
+          {{ end }}
+          {{ if (partial "GetTextFromHTML" .Content) }}
+            <div>
               {{ partial "PrepareHTML" .Content }}
             </div>
           {{ end }}
diff --git a/layouts/programs/list.html b/layouts/programs/list.html
index e48acceac567a1e3d14e76c6367ff690bad5ea98..56cde96600c2f803ab36ecbcd4bbfb55f3455f44 100644
--- a/layouts/programs/list.html
+++ b/layouts/programs/list.html
@@ -1,9 +1,9 @@
 {{ define "main" }}
-  {{ partial "programs/hero.html" . }}
-
-  {{ if or (eq .Params.diplomas "") (.Params.diplomas) }}
+  {{ if .Params.diplomas }}
+    {{ partial "programs/hero-single.html" . }}
     {{ partial "programs/show.html" . }}
   {{ else }}
+    {{ partial "programs/hero.html" . }}
     {{ partial "programs/index.html" . }}
   {{ end }}
 {{ end }}