diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/index.ts b/client/src/app/admin/instance/dataset/components/attribute/detail/index.ts
index 4db9273e1ec22368184b553c46b2f8f4a5433a02..d1581ea5b138546e26d7eba21a7cd6d624ce1612 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/index.ts
+++ b/client/src/app/admin/instance/dataset/components/attribute/detail/index.ts
@@ -9,10 +9,8 @@
 
 import { TableDetailComponent } from './table-detail.component';
 import { TrDetailComponent } from './tr-detail.component';
-import { detailRenderers } from './renderers';
 
 export const detailComponents = [
     TableDetailComponent,
-    TrDetailComponent,
-    detailRenderers
+    TrDetailComponent
 ];
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/index.ts b/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/index.ts
deleted file mode 100644
index 5d88e779669df93b295514cb7302eede2baab9ad..0000000000000000000000000000000000000000
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/index.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { SpectraGraphRendererComponent } from './spectra-graph-renderer.component';
-
-export const detailRenderers = [
-    SpectraGraphRendererComponent
-];
-
-export * from './renderer-detail-form-factory';
-
-export const rendererDetailList = [
-    { label: 'Image', value: 'img', display: 10 },
-    { label: 'Spectra graph', value: 'spectra_graph', display: 20 }
-];
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/renderer-detail-form-factory.ts b/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/renderer-detail-form-factory.ts
deleted file mode 100644
index 5108b97da5409e606ea69db631ba93ad80f32454..0000000000000000000000000000000000000000
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/renderer-detail-form-factory.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { FormControl } from "@angular/forms";
-
-export abstract class RendererDetailFormFactory {
-    static create(renderer: string) {
-        switch (renderer) {
-            case 'spectra_graph':
-                return {
-                    z: new FormControl(null)
-                };
-            default:
-                return {};
-        }
-    }
-}
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.html b/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.html
deleted file mode 100644
index 0769a05e96659585e1c99f879f98f9e7256c51c8..0000000000000000000000000000000000000000
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<ng-container [formGroup]="form">
-    <div class="form-group row align-items-center">
-        <label for="{{id}}_z" class="col-md-5 col-sm-12 col-form-label">Attribute z:</label>
-        <div class="col-md-7 col-sm-12">
-            <select class="form-control" name="{{id}}_z" formControlName="z">
-                <option *ngFor="let attribute of attributeList" [ngValue]="attribute.id">{{ attribute.form_label }}</option>
-            </select>
-        </div>
-    </div>
-</ng-container>
\ No newline at end of file
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.ts b/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.ts
deleted file mode 100644
index fa350b065baa875530522459154044c58e830c58..0000000000000000000000000000000000000000
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/renderers/spectra-graph-renderer.component.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * This file is part of Anis Client.
- *
- * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
-import { FormGroup } from '@angular/forms';
-
-import { Attribute } from 'src/app/metamodel/models';
-
-@Component({
-    selector: 'app-spectra-graph-renderer',
-    templateUrl: 'spectra-graph-renderer.component.html',
-    changeDetection: ChangeDetectionStrategy.OnPush
-})
-export class SpectraGraphRendererComponent {
-    @Input() id: number;
-    @Input() form: FormGroup;
-    @Input() attributeList: Attribute[];
-}
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/table-detail.component.html b/client/src/app/admin/instance/dataset/components/attribute/detail/table-detail.component.html
index 6a1a4834269ca803d35809a4be79f00d58d4b752..ae53a43249c09f7380c6d5f6537b6ea13dbaf4bf 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/table-detail.component.html
+++ b/client/src/app/admin/instance/dataset/components/attribute/detail/table-detail.component.html
@@ -3,8 +3,8 @@
         <thead>
             <tr>
                 <th scope="col" style="min-width:150px">Name</th>
-                <th scope="col" style="width:50px">Visible</th>
-                <th scope="col" style="min-width:140px;width:140px;">Display detail</th>
+                <th scope="col" style="min-width:150px">Output category</th>
+                <th scope="col" style="min-width:100px;width:100px;">Display</th>
                 <th scope="col" style="width:50px">Save</th>
             </tr>
         </thead>
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.html b/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.html
index 1699cd9ce954c947b21965848991582e885b9a3e..ecb4ec71877ba64a3137d3bd0bcdc813d8c680b0 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.html
+++ b/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.html
@@ -3,10 +3,13 @@
         <input type="text" class="form-control" name="name" formControlName="name">
     </td>
     <td>
-        <input type="checkbox" class="form-control" name="detail" formControlName="detail">
+        <select class="form-control" name="id_detail_output_category" (change)="detailOutputCategoryOnChange()" formControlName="id_detail_output_category">
+            <option value=""></option>
+            <option *ngFor="let category of outputCategoryList" [ngValue]="category.id">{{category.label}}</option>
+        </select>
     </td>
     <td>
-        <input *ngIf="form.controls.detail.value" type="number" class="form-control" name="display_detail" formControlName="display_detail">
+        <input *ngIf="form.controls.id_detail_output_category.value" type="number" class="form-control" name="detail_display" formControlName="detail_display">
     </td>
     <td class="text-center align-middle">
         <button (click)="submit()" [disabled]="form.invalid || form.pristine" class="btn btn-outline-primary">
diff --git a/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.ts b/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.ts
index c54af8154d9be4dd65631ac9702d30ead8bc6eda..d8e82e1779660878b2abbcb775a4e36924daa10d 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.ts
+++ b/client/src/app/admin/instance/dataset/components/attribute/detail/tr-detail.component.ts
@@ -10,8 +10,7 @@
 import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, OnInit } from '@angular/core';
 import { FormControl, FormGroup } from '@angular/forms';
 
-import { Attribute } from 'src/app/metamodel/models';
-import { RendererDetailFormFactory, rendererDetailList } from './renderers';
+import { Attribute, OutputCategory } from 'src/app/metamodel/models';
 
 @Component({
     selector: '[detail]',
@@ -21,14 +20,13 @@ import { RendererDetailFormFactory, rendererDetailList } from './renderers';
 })
 export class TrDetailComponent implements OnInit {
     @Input() attribute: Attribute
-    @Input() attributeList: Attribute[];
+    @Input() outputCategoryList: OutputCategory[];
     @Output() save: EventEmitter<Attribute> = new EventEmitter();
 
-    rendererDetailList = rendererDetailList;
-
     public form = new FormGroup({
         name: new FormControl({ value: '', disabled: true }),
-        detail: new FormControl()
+        id_detail_output_category: new FormControl(),
+        detail_display: new FormControl()
     });
 
     ngOnInit() {
@@ -37,6 +35,12 @@ export class TrDetailComponent implements OnInit {
         }
     }
 
+    detailOutputCategoryOnChange(): void {
+        if (this.form.controls.id.value === '') {
+            this.form.controls.id_detail_output_category.setValue(null);
+        }
+    }
+
     submit(): void {
         this.save.emit({
             ...this.attribute,
diff --git a/client/src/app/admin/instance/dataset/components/attribute/general/add-attribute.component.ts b/client/src/app/admin/instance/dataset/components/attribute/general/add-attribute.component.ts
index 32625a6e57f5aabdac3317ff36d1fe6101c0ddd2..c1f4241c0dd4a8f7130aa5dd27166ab2fa35a3a2 100644
--- a/client/src/app/admin/instance/dataset/components/attribute/general/add-attribute.component.ts
+++ b/client/src/app/admin/instance/dataset/components/attribute/general/add-attribute.component.ts
@@ -69,8 +69,7 @@ export class AddAttributeComponent {
             renderer_config: null,
             order_by: true,
             archive: false,
-            detail: true,
-            display_detail: id * 10,
+            detail_display: id * 10,
             options: null,
             vo_utype: null,
             vo_ucd: null,
@@ -79,7 +78,8 @@ export class AddAttributeComponent {
             vo_datatype: null,
             vo_size: null,
             id_criteria_family: null,
-            id_output_category: null
+            id_output_category: null,
+            id_detail_output_category: null
         })
     }
 }
diff --git a/client/src/app/admin/instance/dataset/components/detail-page/detail-config-form.component.ts b/client/src/app/admin/instance/dataset/components/detail-page/detail-config-form.component.ts
index 71a3b134c9361ff5c4e5fd1295183b3468a977f0..a0b257653e8489688f7067296111dfb82fd2702d 100644
--- a/client/src/app/admin/instance/dataset/components/detail-page/detail-config-form.component.ts
+++ b/client/src/app/admin/instance/dataset/components/detail-page/detail-config-form.component.ts
@@ -19,7 +19,6 @@ import { Attribute, DetailConfig } from 'src/app/metamodel/models';
 })
 export class DetailConfigFormComponent implements OnInit {
     @Input() detailConfig: DetailConfig;
-    @Input() attributeList: Attribute[];
     @Output() onSubmit: EventEmitter<DetailConfig> = new EventEmitter();
 
     public form = new FormGroup({
diff --git a/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.html b/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.html
index 4b54881f89b58df7b90bf6685af60c349aaf8807..57ad9f57db4d0128c7b7f6469cbcdd33610eeb6c 100644
--- a/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.html
+++ b/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.html
@@ -1,6 +1,5 @@
 <app-detail-config-form
     [detailConfig]="detailConfig"
-    [attributeList]="attributeList"
     (onSubmit)="save($event)"
     #formDetailConfig>
     <button [disabled]="!formDetailConfig.form.valid || formDetailConfig.form.pristine" type="submit" class="btn btn-primary">
diff --git a/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.ts b/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.ts
index 88a8574fa4a386317b5a6a32b8714d7050cfbf5a..0d46c4f1a7f131e8442b18454475b3e1daed43eb 100644
--- a/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.ts
+++ b/client/src/app/admin/instance/dataset/components/detail-page/detail-config.component.ts
@@ -9,7 +9,7 @@
 
 import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
 
-import { Attribute, DetailConfig, Dataset } from 'src/app/metamodel/models';
+import { DetailConfig } from 'src/app/metamodel/models';
 
 @Component({
     selector: 'app-detail-config',
@@ -17,9 +17,7 @@ import { Attribute, DetailConfig, Dataset } from 'src/app/metamodel/models';
     changeDetection: ChangeDetectionStrategy.OnPush
 })
 export class DetailConfigComponent {
-    @Input() dataset: Dataset;
     @Input() detailConfig: DetailConfig;
-    @Input() attributeList: Attribute[];
     @Output() addDetailConfig: EventEmitter<DetailConfig> = new EventEmitter();
     @Output() editDetailConfig: EventEmitter<DetailConfig> = new EventEmitter();
 
diff --git a/client/src/app/admin/instance/dataset/containers/configure-dataset.component.html b/client/src/app/admin/instance/dataset/containers/configure-dataset.component.html
index d07e62ae143269b8379ad4ec1d754a4321bed0ce..bc48f6ba520392a1e1e886e0125b305e847d8eb8 100644
--- a/client/src/app/admin/instance/dataset/containers/configure-dataset.component.html
+++ b/client/src/app/admin/instance/dataset/containers/configure-dataset.component.html
@@ -4,6 +4,7 @@
     || (outputFamilyListIsLoading | async)
     || (outputCategoryListIsLoading | async)
     || (imageListIsLoading | async)
+    || (detailConfigIsLoading | async)
     || (coneSearchConfigIsLoading | async)">
 </app-spinner>
 
@@ -13,6 +14,7 @@
     && (outputFamilyListIsLoaded | async)
     && (outputCategoryListIsLoaded | async)
     && (imageListIsLoaded | async)
+    && (detailConfigIsLoaded | async)
     && (coneSearchConfigIsLoaded | async)" class="container-fluid">
     <nav aria-label="breadcrumb">
         <ol class="breadcrumb">
@@ -127,7 +129,7 @@
                         <tr *ngFor="let attribute of (attributeList | async)"
                             detail
                             [attribute]="attribute"
-                            [attributeList]="attributeList | async"
+                            [outputCategoryList]="outputCategoryList | async"
                             (save)="editAttribute($event)">
                         </tr>
                     </app-table-detail>
@@ -200,9 +202,7 @@
                     </app-cone-search-config>
                     <app-detail-config
                         *ngSwitchCase="'detail-page'"
-                        [dataset]="dataset | async"
                         [detailConfig]="detailConfig | async"
-                        [attributeList]="attributeList | async"
                         (addDetailConfig)="addDetailConfig($event)"
                         (editDetailConfig)="editDetailConfig($event)">
                     </app-detail-config>
diff --git a/client/src/app/instance/search/components/detail/object-data.component.html b/client/src/app/instance/search/components/detail/object-data.component.html
index e2f47787b81757cc0b1d7effa1fb3ca4b3aabfcb..e9411be0d29bfa4d8e4d63c8f8deae62fa374213 100644
--- a/client/src/app/instance/search/components/detail/object-data.component.html
+++ b/client/src/app/instance/search/components/detail/object-data.component.html
@@ -23,11 +23,11 @@
                 {{ family.label }}
                 &nbsp;
                 <span *ngIf="ag.isOpen">
-                            <span class="fas fa-chevron-up"></span>
-                        </span>
+                    <span class="fas fa-chevron-up"></span>
+                </span>
                 <span *ngIf="!ag.isOpen">
-                            <span class="fas fa-chevron-down"></span>
-                        </span>
+                    <span class="fas fa-chevron-down"></span>
+                </span>
             </span>
         </button>
 
diff --git a/client/src/app/instance/search/components/detail/object-data.component.ts b/client/src/app/instance/search/components/detail/object-data.component.ts
index a35db493695fd77ce979caf4a44e24cfe2f9310c..34068a6fed49ff8445dbbdee0cd78fae57ed0ed5 100644
--- a/client/src/app/instance/search/components/detail/object-data.component.ts
+++ b/client/src/app/instance/search/components/detail/object-data.component.ts
@@ -52,7 +52,7 @@ export class ObjectDataComponent {
      */
     getAttributesVisibleByCategory(idCategory: number): Attribute[] {
         return this.attributeList
-            .filter(a => a.detail)
+            .filter(a => a.id_detail_output_category)
             .filter(a => a.id_output_category === idCategory);
     }
 
@@ -62,7 +62,7 @@ export class ObjectDataComponent {
      * @return Attribute[]
      */
     getAttributesVisible(): Attribute[] {
-        return this.attributeList.filter(a => a.detail);
+        return this.attributeList.filter(a => a.id_detail_output_category);
     }
 
     /**
diff --git a/client/src/app/instance/search/containers/detail.component.html b/client/src/app/instance/search/containers/detail.component.html
deleted file mode 100644
index 3ceca60ed2a736979571553b040484ca49c9861d..0000000000000000000000000000000000000000
--- a/client/src/app/instance/search/containers/detail.component.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<div class="container-fluid">
-    <div *ngIf="!(pristine | async)" class="row mt-2 mb-2 justify-content-between">
-        <div class="col">
-            <button (click)="goBackToResult()" class="btn btn-outline-secondary">
-                <span class="fa fa-backward"></span> Back to search results
-            </button>
-        </div>
-    </div>
-    <app-spinner *ngIf="(attributeListIsLoading | async)
-        || (outputFamilyListIsLoading | async)
-        || (outputCategoryListIsLoading | async)
-        || (objectIsLoading | async)">
-    </app-spinner>
-    <ng-container *ngIf="(attributeListIsLoaded | async) 
-        && (outputFamilyListIsLoaded | async) 
-        && (outputCategoryListIsLoaded | async) 
-        && (objectIsLoaded | async)" [ngSwitch]="getDetailComponent(attributeList | async)">
-        <app-spectra-object *ngSwitchCase="'spectra'"
-            [datasetSelected]="datasetSelected | async"
-            [outputFamilyList]="outputFamilyList | async"
-            [outputCategoryList]="outputCategoryList | async"
-            [attributeList]="attributeList | async | sortByDetailDisplay"
-            [object]="object | async"
-            [spectraCSV]="spectraCSV | async"
-            [spectraIsLoading]="spectraIsLoading | async"
-            [spectraIsLoaded]="spectraIsLoaded | async"
-            (getSpectraCSV)="getSpectraCSV($event)">
-        </app-spectra-object>
-        <app-default-object *ngSwitchCase="'default'"
-            [datasetSelected]="datasetSelected | async"
-            [outputFamilyList]="outputFamilyList | async"
-            [outputCategoryList]="outputCategoryList | async"
-            [attributeList]="attributeList | async | sortByDetailDisplay"
-            [object]="object | async">
-        </app-default-object>
-        <div *ngSwitchDefault>
-            Detail component <span class="font-weight-bold">{{ getDetailComponent(attributeList | async) }}</span> not supported !
-        </div>
-    </ng-container>
-</div>
diff --git a/client/src/app/instance/search/detail/components/detail-content.component.html b/client/src/app/instance/search/detail/components/detail-content.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..daab406d8b2701a0898d8a6be4ed2e712f7af25e
--- /dev/null
+++ b/client/src/app/instance/search/detail/components/detail-content.component.html
@@ -0,0 +1 @@
+<ngx-dynamic-hooks [content]="detailConfig.content" [context]="getContext()"></ngx-dynamic-hooks>
\ No newline at end of file
diff --git a/client/src/app/instance/search/detail/components/detail-content.component.ts b/client/src/app/instance/search/detail/components/detail-content.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4e1adf8332d5244eb2fc820c3e0be0d31375c744
--- /dev/null
+++ b/client/src/app/instance/search/detail/components/detail-content.component.ts
@@ -0,0 +1,37 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { Component, Input } from '@angular/core';
+
+import { DetailConfig, Attribute, OutputFamily, OutputCategory} from 'src/app/metamodel/models';
+
+/**
+ * @class
+ * @classdesc Detail content component.
+ */
+@Component({
+    selector: 'app-detail-content',
+    templateUrl: 'detail-content.component.html'
+})
+export class DetailContentComponent {
+    @Input() detailConfig: DetailConfig;
+    @Input() object: any;
+    @Input() attributeList: Attribute[];
+    @Input() outputFamilyList: OutputFamily[];
+    @Input() outputCategoryList: OutputCategory[];
+
+    getContext() {
+        return {
+            object: this.object,
+            attributeList: this.attributeList,
+            outputFamilyList: this.outputFamilyList,
+            outputCategoryList: this.outputCategoryList
+        };
+    }
+}
diff --git a/client/src/app/instance/search/detail/components/index.ts b/client/src/app/instance/search/detail/components/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0dcbf58e5e5f4fdf19dfc73aac0bc8039807a695
--- /dev/null
+++ b/client/src/app/instance/search/detail/components/index.ts
@@ -0,0 +1,14 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { DetailContentComponent } from './detail-content.component';
+
+export const dummiesComponents = [
+    DetailContentComponent
+];
diff --git a/client/src/app/instance/search/detail/containers/detail.component.html b/client/src/app/instance/search/detail/containers/detail.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9fc60ad458ae38a7d942436ea49e260cb235ec21
--- /dev/null
+++ b/client/src/app/instance/search/detail/containers/detail.component.html
@@ -0,0 +1,28 @@
+<div class="container-fluid">
+    <div *ngIf="!(pristine | async)" class="row mt-2 mb-2 justify-content-between">
+        <div class="col">
+            <button (click)="goBackToResult()" class="btn btn-outline-secondary">
+                <span class="fa fa-backward"></span> Back to search results
+            </button>
+        </div>
+    </div>
+    <app-spinner *ngIf="(detailConfigIsLoading | async)
+        || (attributeListIsLoading | async)
+        || (outputFamilyListIsLoading | async)
+        || (outputCategoryListIsLoading | async)
+        || (objectIsLoading | async)">
+    </app-spinner>
+    <ng-container *ngIf="(detailConfigIsLoaded | async)
+        && (attributeListIsLoaded | async) 
+        && (outputFamilyListIsLoaded | async) 
+        && (outputCategoryListIsLoaded | async) 
+        && (objectIsLoaded | async)">
+        <app-detail-content 
+            [detailConfig]="detailConfig | async"
+            [object]="object | async"
+            [attributeList]="attributeList | async"
+            [outputFamilyList]="outputFamilyList | async"
+            [outputCategoryList]="outputCategoryList | async">
+        </app-detail-content>
+    </ng-container>
+</div>
diff --git a/client/src/app/instance/search/containers/detail.component.spec.ts b/client/src/app/instance/search/detail/containers/detail.component.spec.ts
similarity index 100%
rename from client/src/app/instance/search/containers/detail.component.spec.ts
rename to client/src/app/instance/search/detail/containers/detail.component.spec.ts
diff --git a/client/src/app/instance/search/containers/detail.component.ts b/client/src/app/instance/search/detail/containers/detail.component.ts
similarity index 87%
rename from client/src/app/instance/search/containers/detail.component.ts
rename to client/src/app/instance/search/detail/containers/detail.component.ts
index 78d4b5f69732f88b4fa2cff913292cf63a78dc27..e314fe0fb911448897f565494f78ae6a34b5597e 100644
--- a/client/src/app/instance/search/containers/detail.component.ts
+++ b/client/src/app/instance/search/detail/containers/detail.component.ts
@@ -13,7 +13,7 @@ import { Location } from '@angular/common';
 import { Store } from '@ngrx/store';
 import { Observable, Subscription } from 'rxjs';
 
-import { Attribute, OutputCategory, OutputFamily, DetailLinkRendererConfig } from 'src/app/metamodel/models';
+import { Attribute, OutputCategory, OutputFamily, DetailLinkRendererConfig, DetailConfig } from 'src/app/metamodel/models';
 import * as detailActions from 'src/app/instance/store/actions/detail.actions';
 import * as detailSelector from 'src/app/instance/store/selectors/detail.selector';
 import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector';
@@ -22,6 +22,8 @@ import * as outputFamilySelector from 'src/app/metamodel/selectors/output-family
 import * as outputCategorySelector from 'src/app/metamodel/selectors/output-category.selector';
 import * as attributeSelector from 'src/app/metamodel/selectors/attribute.selector';
 import * as searchActions from 'src/app/instance/store/actions/search.actions';
+import * as detailConfigActions from 'src/app/metamodel/actions/detail-config.actions';
+import * as detailConfigSelector from 'src/app/metamodel/selectors/detail-config.selector';
 
 /**
  * @class
@@ -37,6 +39,9 @@ import * as searchActions from 'src/app/instance/store/actions/search.actions';
 export class DetailComponent implements OnInit, OnDestroy {
     public datasetSelected: Observable<string>;
     public pristine: Observable<boolean>;
+    public detailConfig: Observable<DetailConfig>;
+    public detailConfigIsLoading: Observable<boolean>;
+    public detailConfigIsLoaded: Observable<boolean>;
     public attributeList: Observable<Attribute[]>;
     public attributeListIsLoading: Observable<boolean>;
     public attributeListIsLoaded: Observable<boolean>;
@@ -58,6 +63,9 @@ export class DetailComponent implements OnInit, OnDestroy {
     constructor(private location: Location, private store: Store<{ }>) {
         this.datasetSelected = store.select(datasetSelector.selectDatasetNameByRoute);
         this.pristine = store.select(searchSelector.selectPristine);
+        this.detailConfig = store.select(detailConfigSelector.selectDetailConfig);
+        this.detailConfigIsLoading = store.select(detailConfigSelector.selectDetailConfigIsLoading);
+        this.detailConfigIsLoaded = store.select(detailConfigSelector.selectDetailConfigIsLoaded);
         this.attributeList = store.select(attributeSelector.selectAllAttributes);
         this.attributeListIsLoading = store.select(attributeSelector.selectAttributeListIsLoading);
         this.attributeListIsLoaded = store.select(attributeSelector.selectAttributeListIsLoaded);
@@ -85,6 +93,7 @@ export class DetailComponent implements OnInit, OnDestroy {
                 Promise.resolve(null).then(() => this.store.dispatch(detailActions.retrieveObject()));
             }
         });
+        Promise.resolve(null).then(() => this.store.dispatch(detailConfigActions.loadDetailConfig()));
     }
 
     /**
diff --git a/client/src/app/instance/search/detail/detail-routing.module.ts b/client/src/app/instance/search/detail/detail-routing.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0b32f4090e5baf2dfedf5abf50f6e8a391be6add
--- /dev/null
+++ b/client/src/app/instance/search/detail/detail-routing.module.ts
@@ -0,0 +1,32 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { DetailComponent } from './containers/detail.component';
+
+const routes: Routes = [
+    { path: '', redirectTo: ':dname/:id', pathMatch: 'full' },
+    { path: ':dname/:id', component: DetailComponent }
+];
+
+/**
+ * @class
+ * @classdesc Search routing module.
+ */
+ @NgModule({
+    imports: [RouterModule.forChild(routes)],
+    exports: [RouterModule]
+})
+export class DetailRoutingModule { }
+
+export const routedComponents = [
+    DetailComponent
+];
diff --git a/client/src/app/instance/search/detail/detail.module.ts b/client/src/app/instance/search/detail/detail.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a23e0508d92267a54b2693335b43f0715e8c0e49
--- /dev/null
+++ b/client/src/app/instance/search/detail/detail.module.ts
@@ -0,0 +1,32 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { NgModule } from '@angular/core';
+
+import { SharedModule } from 'src/app/shared/shared.module';
+import { DynamicContentModule } from './dynamic-content/dynamic-content.module';
+import { DetailRoutingModule, routedComponents } from './detail-routing.module';
+import { dummiesComponents } from './components';
+
+/**
+ * @class
+ * @classdesc Search module.
+ */
+@NgModule({
+    imports: [
+        SharedModule,
+        DynamicContentModule,
+        DetailRoutingModule
+    ],
+    declarations: [
+        routedComponents,
+        dummiesComponents
+    ]
+})
+export class DetailModule { }
diff --git a/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.html b/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..5c1adc90c23c6bec1e06f2c4e4499b6319cea7e0
--- /dev/null
+++ b/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.html
@@ -0,0 +1,41 @@
+<!-- Accordion families -->
+<accordion [isAnimated]="true">
+    <accordion-group *ngFor="let family of outputFamilyList" #ag [isOpen]="true" class="pl-2">
+        <button class="btn btn-link btn-block clearfix pb-2" accordion-heading>
+            <span class="pull-left float-left text-primary">
+                {{ family.label }}
+                &nbsp;
+                <span *ngIf="ag.isOpen">
+                    <span class="fas fa-chevron-up"></span>
+                </span>
+                <span *ngIf="!ag.isOpen">
+                    <span class="fas fa-chevron-down"></span>
+                </span>
+            </span>
+        </button>
+
+        <!-- Accordion categories -->
+        <accordion [isAnimated]="true">
+            <accordion-group *ngFor="let category of getOutputCategoryListByFamily(family.id)" #ag [isOpen]="true" class="pl-4">
+                <button class="btn btn-link btn-block clearfix pb-2" accordion-heading>
+                    <span class="pull-left float-left text-primary">
+                        {{ category.label }}
+                        &nbsp;
+                        <span *ngIf="ag.isOpen">
+                            <span class="fas fa-chevron-up"></span>
+                        </span>
+                        <span *ngIf="!ag.isOpen">
+                            <span class="fas fa-chevron-down"></span>
+                        </span>
+                    </span>
+                </button>
+
+                <!-- Output list -->
+                <div *ngFor="let attribute of getAttributeListByOutputCategory(category.id)" class="row pb-2">
+                    <div class="col-5 font-weight-bold">{{ attribute.form_label }}</div>
+                    <div class="col">{{ object[attribute.label] }}</div>
+                </div>
+            </accordion-group>
+        </accordion>
+    </accordion-group>
+</accordion>
\ No newline at end of file
diff --git a/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.ts b/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c290ab7ef375b140139d684585bc2ef5d30368ad
--- /dev/null
+++ b/client/src/app/instance/search/detail/dynamic-content/components/display-object.component.ts
@@ -0,0 +1,35 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { Component, Input } from '@angular/core';
+
+import { Attribute, OutputCategory, OutputFamily } from 'src/app/metamodel/models';
+
+/**
+ * @class
+ * @classdesc Display object component.
+ */
+@Component({
+    selector: 'app-display-object',
+    templateUrl: 'display-object.component.html'
+})
+export class DisplayObjectComponent {
+    @Input() object: any;
+    @Input() attributeList: Attribute[];
+    @Input() outputFamilyList: OutputFamily[];
+    @Input() outputCategoryList: OutputCategory[];
+
+    getOutputCategoryListByFamily(idOutputFamily: number): OutputCategory[] {
+        return this.outputCategoryList.filter(outputCategory => outputCategory.id_output_family === idOutputFamily);
+    }
+
+    getAttributeListByOutputCategory(idOutputCategory: number): Attribute[] {
+        return this.attributeList.filter(attribute => attribute.id_detail_output_category === idOutputCategory);
+    }
+}
diff --git a/client/src/app/instance/search/detail/dynamic-content/components/index.ts b/client/src/app/instance/search/detail/dynamic-content/components/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ff4f0ea4d36285884f51a39661ccca14da7c36f0
--- /dev/null
+++ b/client/src/app/instance/search/detail/dynamic-content/components/index.ts
@@ -0,0 +1,14 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { DisplayObjectComponent } from './display-object.component';
+
+export const dummiesComponents = [
+    DisplayObjectComponent
+];
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.html b/client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.html
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.html
rename to client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.html
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.scss b/client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.scss
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.scss
rename to client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.scss
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.ts b/client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/dynamic-router-link.component.ts
rename to client/src/app/instance/search/detail/dynamic-content/dynamic-components/dynamic-router-link.component.ts
diff --git a/client/src/app/instance/search/detail/dynamic-content/dynamic-components/index.ts b/client/src/app/instance/search/detail/dynamic-content/dynamic-components/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0a6b8f24206481483991135d430f1cd8d23a639b
--- /dev/null
+++ b/client/src/app/instance/search/detail/dynamic-content/dynamic-components/index.ts
@@ -0,0 +1,5 @@
+import { DynamicRouterLinkComponent } from './dynamic-router-link.component';
+
+export const DynamicComponents = [
+    DynamicRouterLinkComponent
+];
diff --git a/client/src/app/instance/dynamic-content/dynamic-content.module.ts b/client/src/app/instance/search/detail/dynamic-content/dynamic-content.module.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-content.module.ts
rename to client/src/app/instance/search/detail/dynamic-content/dynamic-content.module.ts
diff --git a/client/src/app/instance/dynamic-content/parsers/dynamic-router-link-parser.ts b/client/src/app/instance/search/detail/dynamic-content/parsers/dynamic-router-link-parser.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/parsers/dynamic-router-link-parser.ts
rename to client/src/app/instance/search/detail/dynamic-content/parsers/dynamic-router-link-parser.ts
diff --git a/client/src/app/instance/dynamic-content/parsers/index.ts b/client/src/app/instance/search/detail/dynamic-content/parsers/index.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/parsers/index.ts
rename to client/src/app/instance/search/detail/dynamic-content/parsers/index.ts
diff --git a/client/src/app/instance/search/pipes/sort-by-detail-display.ts b/client/src/app/instance/search/pipes/sort-by-detail-display.ts
index dd17a7ca46d072c91e36aa534811d4ae89a2ada4..2887500ac544ce036e7f9513a23b2ad085b7489c 100644
--- a/client/src/app/instance/search/pipes/sort-by-detail-display.ts
+++ b/client/src/app/instance/search/pipes/sort-by-detail-display.ts
@@ -14,6 +14,6 @@ import { Attribute } from 'src/app/metamodel/models';
 @Pipe({name: 'sortByDetailDisplay'})
 export class SortByDetailDisplay implements PipeTransform {
     transform(attributeList: Attribute[]): Attribute[] {
-        return [...attributeList].sort((a: Attribute, b: Attribute) => a.display_detail - b.display_detail);
+        return [...attributeList].sort((a: Attribute, b: Attribute) => a.detail_display - b.detail_display);
     }
 }
diff --git a/client/src/app/instance/search/search-routing.module.ts b/client/src/app/instance/search/search-routing.module.ts
index ffc569397e828e64c8c3374a733e02e11f1d0f5e..cec8354915ef48ce8d73543afcf52a9c0326c2b0 100644
--- a/client/src/app/instance/search/search-routing.module.ts
+++ b/client/src/app/instance/search/search-routing.module.ts
@@ -15,11 +15,9 @@ import { DatasetComponent } from './containers/dataset.component';
 import { CriteriaComponent } from './containers/criteria.component';
 import { OutputComponent } from './containers/output.component';
 import { ResultComponent } from './containers/result.component';
-import { DetailComponent } from './containers/detail.component';
 import { SearchAuthGuard } from './search-auth.guard';
 
 const routes: Routes = [
-    { path: 'detail/:dname/:id', component: DetailComponent },
     {
         path: '', component: SearchComponent, children: [
             { path: '', redirectTo: 'dataset', pathMatch: 'full' },
@@ -29,7 +27,8 @@ const routes: Routes = [
             { path: 'output/:dname', canActivate: [SearchAuthGuard], component: OutputComponent },
             { path: 'result/:dname', canActivate: [SearchAuthGuard], component: ResultComponent }
         ]
-    }
+    },
+    { path: 'detail', loadChildren: () => import('./detail/detail.module').then(m => m.DetailModule) }
 ];
 
 /**
@@ -47,6 +46,5 @@ export const routedComponents = [
     DatasetComponent,
     CriteriaComponent,
     OutputComponent,
-    ResultComponent,
-    DetailComponent
+    ResultComponent
 ];
diff --git a/client/src/app/instance/search/search.module.ts b/client/src/app/instance/search/search.module.ts
index 2109154c13b7a32d7d1d041d86b59d1e95da69f4..e633fbb3bce0cf46b60004ea2d201630bda58b36 100644
--- a/client/src/app/instance/search/search.module.ts
+++ b/client/src/app/instance/search/search.module.ts
@@ -10,6 +10,7 @@
 import { NgModule } from '@angular/core';
 
 import { SharedModule } from 'src/app/shared/shared.module';
+// import { DynamicContentModule } from '../dynamic-content/dynamic-content.module';
 import { ConeSearchModule } from '../cone-search/cone-search.module';
 import { SearchRoutingModule, routedComponents } from './search-routing.module';
 import { dummiesComponents } from './components';
@@ -22,6 +23,7 @@ import { searchPipes } from './pipes';
 @NgModule({
     imports: [
         SharedModule,
+        //DynamicContentModule,
         ConeSearchModule,
         SearchRoutingModule
     ],
diff --git a/client/src/app/instance/store/effects/detail.effects.ts b/client/src/app/instance/store/effects/detail.effects.ts
index b1f2aa5f2bfec3d2c09c3aa7055ee309655cafff..ce166cfa21a9a9d2caeaa9e5234e3a97678cfd29 100644
--- a/client/src/app/instance/store/effects/detail.effects.ts
+++ b/client/src/app/instance/store/effects/detail.effects.ts
@@ -43,7 +43,7 @@ export class DetailEffects {
                 datasetName,
                 attributeList.find(attribute => attribute.order_by).id,
                 id,
-                attributeList.filter(attribute => attribute.detail).map(attribute => attribute.id)
+                attributeList.filter(attribute => attribute.id_detail_output_category).map(attribute => attribute.id)
             ).pipe(
                 map(object => detailActions.retrieveObjectSuccess({ object: object[0] })),
                 catchError(() => of(detailActions.retrieveObjectFail()))
diff --git a/client/src/app/instance/dynamic-content/components/datatable.component.html b/client/src/app/instance/webpage/dynamic-content/components/datatable.component.html
similarity index 100%
rename from client/src/app/instance/dynamic-content/components/datatable.component.html
rename to client/src/app/instance/webpage/dynamic-content/components/datatable.component.html
diff --git a/client/src/app/instance/dynamic-content/components/datatable.component.ts b/client/src/app/instance/webpage/dynamic-content/components/datatable.component.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/components/datatable.component.ts
rename to client/src/app/instance/webpage/dynamic-content/components/datatable.component.ts
diff --git a/client/src/app/instance/dynamic-content/components/index.ts b/client/src/app/instance/webpage/dynamic-content/components/index.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/components/index.ts
rename to client/src/app/instance/webpage/dynamic-content/components/index.ts
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/dataset-sample.component.html b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dataset-sample.component.html
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/dataset-sample.component.html
rename to client/src/app/instance/webpage/dynamic-content/dynamic-components/dataset-sample.component.html
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/dataset-sample.component.ts b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dataset-sample.component.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/dataset-sample.component.ts
rename to client/src/app/instance/webpage/dynamic-content/dynamic-components/dataset-sample.component.ts
diff --git a/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.html b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..2f43ac7ec15f1e5f671dbca64512d719766158a9
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.html
@@ -0,0 +1,18 @@
+<a *ngIf="isExternalLink()"
+    [href]="link"
+    [ngClass]="css"
+    [target]="target ? target : '_self'"
+>
+    <ng-container *ngTemplateOutlet="contentTpl"></ng-container>
+</a>
+
+<a *ngIf="!isExternalLink()" 
+    [routerLink]="link"
+    [queryParams]="queryParams ? queryParams : {}" 
+    [fragment]="anchorFragment ? anchorFragment : null"
+    [ngClass]="css"
+>
+    <ng-container *ngTemplateOutlet="contentTpl"></ng-container>
+</a>
+
+<ng-template #contentTpl><ng-content></ng-content></ng-template>
diff --git a/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.scss b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1f0440ee0e66b2f7ee73998e14e352af81a61627
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.scss
@@ -0,0 +1,3 @@
+:host {
+    display: inline;
+}
\ No newline at end of file
diff --git a/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.ts b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d0e20e09d5bd91c394084aba899ed450e398f04f
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/dynamic-components/dynamic-router-link.component.ts
@@ -0,0 +1,18 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+    selector: 'app-dynamic-router-link',
+    templateUrl: 'dynamic-router-link.component.html',
+    styleUrls: [ 'dynamic-router-link.component.scss' ]
+})
+export class DynamicRouterLinkComponent {
+    @Input() link: string;
+    @Input() queryParams: {[key: string]: any};
+    @Input() anchorFragment: string;
+    @Input() css: string;
+    @Input() target: string;
+
+    isExternalLink() {
+        return this.link.startsWith('http');
+    }
+}
diff --git a/client/src/app/instance/dynamic-content/dynamic-components/index.ts b/client/src/app/instance/webpage/dynamic-content/dynamic-components/index.ts
similarity index 100%
rename from client/src/app/instance/dynamic-content/dynamic-components/index.ts
rename to client/src/app/instance/webpage/dynamic-content/dynamic-components/index.ts
diff --git a/client/src/app/instance/webpage/dynamic-content/dynamic-content.module.ts b/client/src/app/instance/webpage/dynamic-content/dynamic-content.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f4f27818c3c0ea4ef559d24a8a79de8f825e191
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/dynamic-content.module.ts
@@ -0,0 +1,53 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { DynamicHooksModule, HookParserEntry } from 'ngx-dynamic-hooks';
+
+import { SharedModule } from 'src/app/shared/shared.module';
+import { hookParsers } from './parsers';
+import { DynamicComponents } from './dynamic-components';
+import { dummiesComponents } from './components';
+
+export const componentParsers: Array<HookParserEntry> = [
+    ...hookParsers,
+    ...DynamicComponents.map(component => {
+        return { component };
+    })
+];
+
+/**
+ * @class
+ * @classdesc Dynamic content module.
+ */
+@NgModule({
+    imports: [
+        SharedModule,
+        RouterModule,
+        DynamicHooksModule.forRoot({
+            globalParsers: componentParsers
+        }),
+    ],
+    exports: [
+        DynamicHooksModule
+    ],
+    providers: [
+        hookParsers
+    ],
+    declarations: [
+        DynamicComponents,
+        dummiesComponents
+    ],
+    entryComponents: [
+        DynamicComponents
+    ]
+})
+export class DynamicContentModule { }
diff --git a/client/src/app/instance/webpage/dynamic-content/parsers/dynamic-router-link-parser.ts b/client/src/app/instance/webpage/dynamic-content/parsers/dynamic-router-link-parser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb543c79b8a96b1d49c935f44f88045eef4ee3d9
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/parsers/dynamic-router-link-parser.ts
@@ -0,0 +1,96 @@
+import { Injectable } from '@angular/core';
+import { HookParser, HookPosition, HookValue, HookComponentData, HookBindings, HookFinder } from 'ngx-dynamic-hooks';
+
+import { DynamicRouterLinkComponent } from '../dynamic-components/dynamic-router-link.component';
+
+@Injectable()
+export class DynamicRouterLinkParser implements HookParser {
+    linkOpeningTagRegex: RegExp;
+    linkClosingTagRegex: RegExp;
+    hrefAttrRegex: RegExp;
+    classAttrRegex: RegExp;
+    targetAttrRegex: RegExp;
+
+    constructor(private hookFinder: HookFinder) {
+        const hrefAttr = '\\s+href\=\\"([^\\"]*?)\\"';
+        const anyOtherAttr = '\\s+[a-zA-Z]+\\=\\"[^\\"]*?\\"';
+        const linkOpeningTag = '\\<a(?:' + anyOtherAttr + ')*?' + hrefAttr + '(?:' + anyOtherAttr + ')*?\\>';
+
+        // Transform into proper regex objects and save for later
+        this.linkOpeningTagRegex = new RegExp(linkOpeningTag, 'gim');
+        this.linkClosingTagRegex = new RegExp('<\\/a>',  'gim');
+        this.hrefAttrRegex = new RegExp(hrefAttr, 'im');
+        this.classAttrRegex = new RegExp('\\s+class\=\\"([^\\"]*?)\\"', 'im');
+        this.targetAttrRegex = new RegExp('\\s+target\=\\"([^\\"]*?)\\"', 'im')
+    }
+
+    public findHooks(content: string, context: any): Array<HookPosition> {
+        // With the regexes we prepared, we can simply use findEnclosingHooks() to retrieve
+        // the HookPositions of all internal <a>-elements from the content string
+        return this.hookFinder.findEnclosingHooks(content, this.linkOpeningTagRegex, this.linkClosingTagRegex);
+    }
+
+    public loadComponent(hookId: number, hookValue: HookValue, context: any, childNodes: Array<Element>): HookComponentData {
+        // Simply return the component class here
+        return {
+            component: DynamicRouterLinkComponent
+        };
+    }
+
+    public getBindings(hookId: number, hookValue: HookValue, context: any): HookBindings {
+        // We can reuse the hrefAttrRegex here as its first capture group is the relative part of the url, 
+        // e.g. '/jedi/windu' from 'https://www.mysite.com/jedi/windu', which is what we need
+        const hrefAttrMatch = hookValue.openingTag.match(this.hrefAttrRegex);
+        let link = hrefAttrMatch[1];
+
+        // The relative part of the link may still contain the query string and the 
+        // anchor fragment, so we need to split it up accordingly
+        const anchorFragmentSplit = link.split('#');
+        link = anchorFragmentSplit[0];
+        const anchorFragment = anchorFragmentSplit.length > 1 ? anchorFragmentSplit[1] : null;
+
+        const queryParamsSplit = link.split('?');
+        link = queryParamsSplit[0];
+        const queryParams = queryParamsSplit.length > 1 ? this.parseQueryString(queryParamsSplit[1]) : {};
+
+        // Select css part
+        let css = null;
+        const classAttrMatch = hookValue.openingTag.match(this.classAttrRegex);
+        if (classAttrMatch) {
+            css = classAttrMatch[1];
+        }
+
+        // Select target part
+        let target = null;
+        const targetAttrMatch = hookValue.openingTag.match(this.targetAttrRegex);
+        if (targetAttrMatch) {
+            target = targetAttrMatch[1];
+        }
+
+        // Give all of these to our DynamicRouterLinkComponent as inputs and we're done!
+        return {
+            inputs: {
+                link,
+                queryParams: queryParams,
+                anchorFragment: anchorFragment,
+                css,
+                target
+            }
+        };
+    }
+
+    /**
+     * A helper function that transforms a query string into a QueryParams object
+     * Approach by Wolfgang Kuehn @ https://stackoverflow.com/a/8649003/3099523
+     *
+     * @param queryParamString - The queryString to parse
+     */
+    private parseQueryString(queryParamString: string): {[key: string]: any} {
+        return JSON.parse('{"' + 
+            decodeURI(queryParamString)
+            .replace(/"/g, '\\"')
+            .replace(/&/g, '","')
+            .replace(/=/g, '":"') + 
+        '"}');
+    }
+}
diff --git a/client/src/app/instance/webpage/dynamic-content/parsers/index.ts b/client/src/app/instance/webpage/dynamic-content/parsers/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bac0c8f9072e6c66cbda86f139d047018dcba1ba
--- /dev/null
+++ b/client/src/app/instance/webpage/dynamic-content/parsers/index.ts
@@ -0,0 +1,5 @@
+import { DynamicRouterLinkParser } from './dynamic-router-link-parser';
+
+export const hookParsers = [
+    DynamicRouterLinkParser
+];
diff --git a/client/src/app/instance/webpage/webpage.module.ts b/client/src/app/instance/webpage/webpage.module.ts
index 5bec1e05d2e46632e45e0dc24d0b376d975504ee..e88ace7bcff38b64d22ddfa53cb089147f545aba 100644
--- a/client/src/app/instance/webpage/webpage.module.ts
+++ b/client/src/app/instance/webpage/webpage.module.ts
@@ -10,7 +10,7 @@
 import { NgModule } from '@angular/core';
 
 import { SharedModule } from 'src/app/shared/shared.module';
-import { DynamicContentModule } from '../dynamic-content/dynamic-content.module';
+import { DynamicContentModule } from './dynamic-content/dynamic-content.module';
 import { WebpageRoutingModule, routedComponents } from './webpage-routing.module';
 import { dummiesComponents } from './components';
 
diff --git a/client/src/app/metamodel/models/attribute.model.ts b/client/src/app/metamodel/models/attribute.model.ts
index 003b971b9cb999a5c62dc5386a771537c58d0347..ab96827eca36153c04b2b853ea1f47c5b6ccd7e5 100644
--- a/client/src/app/metamodel/models/attribute.model.ts
+++ b/client/src/app/metamodel/models/attribute.model.ts
@@ -37,8 +37,7 @@ export interface Attribute {
     renderer_config: RendererConfig;
     order_by: boolean;
     archive: boolean;
-    detail: boolean;
-    display_detail: number;
+    detail_display: number;
     options: Option[];
     vo_utype: string;
     vo_ucd: string;
@@ -48,4 +47,5 @@ export interface Attribute {
     vo_size: number;
     id_criteria_family: number;
     id_output_category: number;
+    id_detail_output_category: number;
 }
diff --git a/conf-dev/create-db.sh b/conf-dev/create-db.sh
index c01a91350a88f10d985e68c2cc4810377d533e15..5118a6a2a21f233478ca4db8dc10bdee0c23860e 100644
--- a/conf-dev/create-db.sh
+++ b/conf-dev/create-db.sh
@@ -27,36 +27,36 @@ curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type:
 curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/output-family
 curl -d '{"label":"Default","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/1/output-category
 
-curl -d '{"id":1,"name":"num","label":"num","form_label":"num","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"field","type":"decimal","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"detail-link","renderer_config":{"display":"text","blank":true},"display_detail":10,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":2,"name":"alpha","label":"alpha","form_label":"alpha","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":20,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":3,"name":"delta","label":"delta","form_label":"delta","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":30,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":4,"name":"selmag","label":"selmag","form_label":"selmag","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":40,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":5,"name":"errselmag","label":"errselmag","form_label":"errselmag","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":50,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":6,"name":"pointing","label":"pointing","form_label":"pointing","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":60,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":7,"name":"quadrant","label":"quadrant","form_label":"quadrant","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":70,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":8,"name":"zspec","label":"zspec","form_label":"zspec","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":80,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":9,"name":"zflg","label":"zflg","form_label":"zflg","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":"datalist","type":"decimal","operator":"in","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":90,"selected":true,"order_by":true,"archive":false,"detail":true,"options":[{"label":"1,2,3,4,9","value":"1,2,3,4,9","display":10},{"label":"2,3,4,9","value":"2,3,4,9","display":20},{"label":"3,4","value":"3,4","display":30},{"label":"1,2,3,4,9,21,22,23,24,29","value":"1,2,3,4,9,21,22,23,24,29","display":40},{"label":"2,3,4,9,22,23,24,29","value":"2,3,4,9,22,23,24,29","display":50}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":10,"name":"norm","label":"norm","form_label":"norm","description":null,"primary_key":false,"output_display":100,"criteria_display":100,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":100,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":11,"name":"epoch","label":"epoch","form_label":"epoch","description":null,"primary_key":false,"output_display":110,"criteria_display":110,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":110,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":12,"name":"photomask","label":"photomask","form_label":"photomask","description":null,"primary_key":false,"output_display":120,"criteria_display":120,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":120,"selected":true,"order_by":true,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":56,"name":"spec1d","label":"spec1d","form_label":"spec1d","description":null,"primary_key":false,"output_display":560,"criteria_display":560,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"display_detail":560,"selected":true,"order_by":false,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":57,"name":"spec1dnoise","label":"spec1dnoise","form_label":"spec1dnoise","description":null,"primary_key":false,"output_display":570,"criteria_display":570,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"display_detail":570,"selected":true,"order_by":false,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
-curl -d '{"id":58,"name":"spec1dsky","label":"spec1dsky","form_label":"spec1dsky","description":null,"primary_key":false,"output_display":580,"criteria_display":580,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"display_detail":580,"selected":true,"order_by":false,"archive":false,"detail":true,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":1,"name":"num","label":"num","form_label":"num","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"field","type":"decimal","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"detail-link","renderer_config":{"display":"text","blank":true},"detail_display":10,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":2,"name":"alpha","label":"alpha","form_label":"alpha","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":20,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":3,"name":"delta","label":"delta","form_label":"delta","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":30,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":4,"name":"selmag","label":"selmag","form_label":"selmag","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":40,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":5,"name":"errselmag","label":"errselmag","form_label":"errselmag","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":50,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":6,"name":"pointing","label":"pointing","form_label":"pointing","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":60,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":7,"name":"quadrant","label":"quadrant","form_label":"quadrant","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":70,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":8,"name":"zspec","label":"zspec","form_label":"zspec","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":80,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":9,"name":"zflg","label":"zflg","form_label":"zflg","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":"datalist","type":"decimal","operator":"in","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":90,"selected":true,"order_by":true,"archive":false,"options":[{"label":"1,2,3,4,9","value":"1,2,3,4,9","display":10},{"label":"2,3,4,9","value":"2,3,4,9","display":20},{"label":"3,4","value":"3,4","display":30},{"label":"1,2,3,4,9,21,22,23,24,29","value":"1,2,3,4,9,21,22,23,24,29","display":40},{"label":"2,3,4,9,22,23,24,29","value":"2,3,4,9,22,23,24,29","display":50}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":10,"name":"norm","label":"norm","form_label":"norm","description":null,"primary_key":false,"output_display":100,"criteria_display":100,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":100,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":11,"name":"epoch","label":"epoch","form_label":"epoch","description":null,"primary_key":false,"output_display":110,"criteria_display":110,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":110,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":12,"name":"photomask","label":"photomask","form_label":"photomask","description":null,"primary_key":false,"output_display":120,"criteria_display":120,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":120,"selected":true,"order_by":true,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":56,"name":"spec1d","label":"spec1d","form_label":"spec1d","description":null,"primary_key":false,"output_display":560,"criteria_display":560,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"detail_display":560,"selected":true,"order_by":false,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":57,"name":"spec1dnoise","label":"spec1dnoise","form_label":"spec1dnoise","description":null,"primary_key":false,"output_display":570,"criteria_display":570,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"detail_display":570,"selected":true,"order_by":false,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
+curl -d '{"id":58,"name":"spec1dsky","label":"spec1dsky","form_label":"spec1dsky","description":null,"primary_key":false,"output_display":580,"criteria_display":580,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"detail_display":580,"selected":true,"order_by":false,"archive":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":1,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vipers_dr2_w1/attribute
 
 # Add sp_cards attributes
 curl -d '{"label":"Card","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/criteria-family
 curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/output-family
 curl -d '{"label":"Default","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/2/output-category
 
-curl -d '{"id":1,"name":"acronym","label":"acronym","form_label":"Product Acronym","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":[],"display_detail":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"LAMTEST","value":"LAMTEST","display":10},{"label":"LAMTEST_DC1","value":"LAMTEST_DC1","display":20},{"label":"MXT-EVT-CAL","value":"MXT-EVT-CAL","display":30},{"label":"OBLC_ECL","value":"OBLC_ECL","display":40}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":2,"name":"sp_id","label":"sp_id","form_label":"SP IAP ID","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":3,"name":"version","label":"version","form_label":"Version","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":4,"name":"program","label":"program","form_label":"Program","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"CP","value":"CP","display":10},{"label":"GP","value":"GP","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":5,"name":"instrument","label":"instrument","form_label":"Instrument","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"ALL","value":"ALL","display":10},{"label":"MXT","value":"MXT","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":6,"name":"type","label":"type","form_label":"Type","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":7,"name":"json_schema","label":"json_schema","form_label":"JSON Schema (original)","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"display_detail":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":8,"name":"search_kw","label":"search_kw","form_label":"KWs searchable","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"display_detail":80,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
-curl -d '{"id":9,"name":"json_schema_uploaded","label":"json_schema_uploaded","form_label":"json_schema_uploaded","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":90,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":1,"name":"acronym","label":"acronym","form_label":"Product Acronym","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":[],"detail_display":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"LAMTEST","value":"LAMTEST","display":10},{"label":"LAMTEST_DC1","value":"LAMTEST_DC1","display":20},{"label":"MXT-EVT-CAL","value":"MXT-EVT-CAL","display":30},{"label":"OBLC_ECL","value":"OBLC_ECL","display":40}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":2,"name":"sp_id","label":"sp_id","form_label":"SP IAP ID","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":3,"name":"version","label":"version","form_label":"Version","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":4,"name":"program","label":"program","form_label":"Program","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"CP","value":"CP","display":10},{"label":"GP","value":"GP","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":5,"name":"instrument","label":"instrument","form_label":"Instrument","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"ALL","value":"ALL","display":10},{"label":"MXT","value":"MXT","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":2,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":6,"name":"type","label":"type","form_label":"Type","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":7,"name":"json_schema","label":"json_schema","form_label":"JSON Schema (original)","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"detail_display":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":8,"name":"search_kw","label":"search_kw","form_label":"KWs searchable","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"detail_display":80,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":2,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
+curl -d '{"id":9,"name":"json_schema_uploaded","label":"json_schema_uploaded","form_label":"json_schema_uploaded","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":null,"type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":90,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":null,"id_detail_output_category":null,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/sp_cards/attribute
 
 # Add observations attributes
 curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/criteria-family
@@ -64,28 +64,28 @@ curl -d '{"label":"Default parameters","display":10,"opened":true}' --header 'Co
 curl -d '{"label":"Astrometry","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/3/output-category
 curl -d '{"label":"Observation","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/3/output-category
 
-curl -d '{"id":1,"name":"id","label":"id","form_label":"id","description":"Observation Ident","primary_key":true,"output_display":10,"criteria_display":10,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":2,"name":"ra","label":"ra","form_label":"Alpha J2000","description":"Alpha J2000","primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":3,"name":"dec","label":"dec","form_label":"Delta J2000","description":"Delta J2000","primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":4,"name":"date_time","label":"date_time","form_label":"Date Time","description":"Date Time","primary_key":false,"output_display":40,"criteria_display":40,"search_type":"between-date","type":"datetime","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":5,"name":"exposure_time","label":"exposure_time","form_label":"Exposure Time","description":"Exposure Time","primary_key":false,"output_display":50,"criteria_display":50,"search_type":"between","type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":6,"name":"filter","label":"filter","form_label":"Filter","description":"Filter","primary_key":false,"output_display":60,"criteria_display":60,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"Halpha","value":"Halpha","display":10},{"label":"SDSS g","value":"SDSS g","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":7,"name":"object_name","label":"object_name","form_label":"Object name","description":"Object name","primary_key":false,"output_display":70,"criteria_display":70,"search_type":"field","type":"string","operator":"lk","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"link","renderer_config":{"href":"http:\/\/cdsportal.u-strasbg.fr\/?target=$value","display":"text","text":"$value","icon":"fas fa-link","blank":true},"display_detail":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":8,"name":"fits_file","label":"fits_file","form_label":"fits_file","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"display_detail":80,"selected":true,"order_by":false,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
-curl -d '{"id":9,"name":"fits_png","label":"fits_png","form_label":"fits_png","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"image","renderer_config":{"type":"fits","display":"modal","width":"50","height":"50"},"display_detail":90,"selected":true,"order_by":false,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":4}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":1,"name":"id","label":"id","form_label":"id","description":"Observation Ident","primary_key":true,"output_display":10,"criteria_display":10,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":2,"name":"ra","label":"ra","form_label":"Alpha J2000","description":"Alpha J2000","primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":3,"name":"dec","label":"dec","form_label":"Delta J2000","description":"Delta J2000","primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":3,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":4,"name":"date_time","label":"date_time","form_label":"Date Time","description":"Date Time","primary_key":false,"output_display":40,"criteria_display":40,"search_type":"between-date","type":"datetime","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":5,"name":"exposure_time","label":"exposure_time","form_label":"Exposure Time","description":"Exposure Time","primary_key":false,"output_display":50,"criteria_display":50,"search_type":"between","type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":6,"name":"filter","label":"filter","form_label":"Filter","description":"Filter","primary_key":false,"output_display":60,"criteria_display":60,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":[{"label":"Halpha","value":"Halpha","display":10},{"label":"SDSS g","value":"SDSS g","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":7,"name":"object_name","label":"object_name","form_label":"Object name","description":"Object name","primary_key":false,"output_display":70,"criteria_display":70,"search_type":"field","type":"string","operator":"lk","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"link","renderer_config":{"href":"http:\/\/cdsportal.u-strasbg.fr\/?target=$value","display":"text","text":"$value","icon":"fas fa-link","blank":true},"detail_display":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":1,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":8,"name":"fits_file","label":"fits_file","form_label":"fits_file","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"download","renderer_config":{"display":"icon-button","text":"DOWNLOAD","icon":"fas fa-download"},"detail_display":80,"selected":true,"order_by":false,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
+curl -d '{"id":9,"name":"fits_png","label":"fits_png","form_label":"fits_png","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"image","renderer_config":{"type":"fits","display":"modal","width":"50","height":"50"},"detail_display":90,"selected":true,"order_by":false,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":4,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/observations/attribute
 
 # Add vvds_f02_udeep attributes
 curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/criteria-family
 curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/output-family
 curl -d '{"label":"Default","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/4/output-category
 
-curl -d '{"id":1,"name":"vvds_ident","label":"vvds_ident","form_label":"vvds_ident","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":2,"name":"id_iau","label":"id_iau","form_label":"id_iau","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":3,"name":"alpha","label":"alpha","form_label":"alpha","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":4,"name":"delta","label":"delta","form_label":"delta","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":5,"name":"z_spec","label":"z_spec","form_label":"z_spec","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":4,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":6,"name":"zflag","label":"zflag","form_label":"zflag","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
-curl -d '{"id":7,"name":"sel_mag","label":"sel_mag","form_label":"sel_mag","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"display_detail":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":4,"id_output_category":5}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":1,"name":"vvds_ident","label":"vvds_ident","form_label":"vvds_ident","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":10,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":2,"name":"id_iau","label":"id_iau","form_label":"id_iau","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":20,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":3,"name":"alpha","label":"alpha","form_label":"alpha","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":30,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":4,"name":"delta","label":"delta","form_label":"delta","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":40,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":5,"name":"z_spec","label":"z_spec","form_label":"z_spec","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":50,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":4,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":6,"name":"zflag","label":"zflag","form_label":"zflag","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":null,"type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":60,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
+curl -d '{"id":7,"name":"sel_mag","label":"sel_mag","form_label":"sel_mag","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":4,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
 
 # Add products attributes
 curl -d '{"label":"Obs","display":10,"opened":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/criteria-family
@@ -94,21 +94,21 @@ curl -d '{"label":"Default","display":10,"opened":true}' --header 'Content-Type:
 curl -d '{"label":"Default","display":10}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/5/output-category
 curl -d '{"label":"Additionnal","display":20}' --header 'Content-Type: application/json' -X POST http://localhost/output-family/5/output-category
 
-curl -d '{"id":1,"name":"product_id","label":"product_id","form_label":"Product ID","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"field","type":"integer","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":[],"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":10,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":2,"name":"obs_id","label":"obs_id","form_label":"Observation ID","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":"field","type":"bigint","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":20,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":3,"name":"acronym","label":"acronym","form_label":"Product Acronym","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":30,"options":[{"label":"ECL-DET-UBC","value":"ECL-DET-UBC","display":10},{"label":"OBLC_ECL","value":"OBLC_ECL","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":4,"name":"url","label":"url","form_label":"Product URL","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"link","renderer_config":{"href":"$value","display":"text","text":"$value","icon":"fas fa-link","blank":true},"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":40,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":5,"name":"criteria","label":"criteria","form_label":"Product criteria (based on KWs searchables)","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"svom_json_kw","type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":50,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":6,"name":"added_at","label":"added_at","form_label":"Added at","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":"between-date","type":"datetime","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":60,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":7,"name":"product_version","label":"product_version","form_label":"Version","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":70,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":8,"name":"program","label":"program","form_label":"Program","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":80,"options":[{"label":"CoreProgram","value":"CoreProgram","display":10},{"label":"GeneralProgram","value":"GeneralProgram","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":9,"name":"instrument","label":"instrument","form_label":"Instrument","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":90,"options":[{"label":"ECL","value":"ECL","display":10}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":10,"name":"type","label":"type","form_label":"Type","description":null,"primary_key":false,"output_display":100,"criteria_display":100,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":100,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":11,"name":"upload_filename","label":"upload_filename","form_label":"Filename","description":null,"primary_key":false,"output_display":110,"criteria_display":110,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":110,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":12,"name":"burst_id","label":"burst_id","form_label":"Burst ID","description":null,"primary_key":false,"output_display":120,"criteria_display":120,"search_type":"field","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"display_detail":120,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":13,"name":"pipeline_version","label":"pipeline_version","form_label":"Pipeline version","description":null,"primary_key":false,"output_display":130,"criteria_display":130,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":130,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":14,"name":"schema_version","label":"schema_version","form_label":"Schema version","description":null,"primary_key":false,"output_display":140,"criteria_display":140,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":140,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
-curl -d '{"id":15,"name":"src_id","label":"src_id","form_label":"SRC ID","description":null,"primary_key":false,"output_display":150,"criteria_display":150,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"display_detail":150,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":1,"name":"product_id","label":"product_id","form_label":"Product ID","description":null,"primary_key":true,"output_display":10,"criteria_display":10,"search_type":"field","type":"integer","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":[],"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":10,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":2,"name":"obs_id","label":"obs_id","form_label":"Observation ID","description":null,"primary_key":false,"output_display":20,"criteria_display":20,"search_type":"field","type":"bigint","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":20,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":3,"name":"acronym","label":"acronym","form_label":"Product Acronym","description":null,"primary_key":false,"output_display":30,"criteria_display":30,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":30,"options":[{"label":"ECL-DET-UBC","value":"ECL-DET-UBC","display":10},{"label":"OBLC_ECL","value":"OBLC_ECL","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":4,"name":"url","label":"url","form_label":"Product URL","description":null,"primary_key":false,"output_display":40,"criteria_display":40,"search_type":null,"type":"text","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"link","renderer_config":{"href":"$value","display":"text","text":"$value","icon":"fas fa-link","blank":true},"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":40,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":5,"name":"criteria","label":"criteria","form_label":"Product criteria (based on KWs searchables)","description":null,"primary_key":false,"output_display":50,"criteria_display":50,"search_type":"svom_json_kw","type":"json","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":"json","renderer_config":[],"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":50,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":6,"name":"added_at","label":"added_at","form_label":"Added at","description":null,"primary_key":false,"output_display":60,"criteria_display":60,"search_type":"between-date","type":"datetime","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":60,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":7,"name":"product_version","label":"product_version","form_label":"Version","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":70,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":8,"name":"program","label":"program","form_label":"Program","description":null,"primary_key":false,"output_display":80,"criteria_display":80,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":80,"options":[{"label":"CoreProgram","value":"CoreProgram","display":10},{"label":"GeneralProgram","value":"GeneralProgram","display":20}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":9,"name":"instrument","label":"instrument","form_label":"Instrument","description":null,"primary_key":false,"output_display":90,"criteria_display":90,"search_type":"select","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":90,"options":[{"label":"ECL","value":"ECL","display":10}],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":6,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":10,"name":"type","label":"type","form_label":"Type","description":null,"primary_key":false,"output_display":100,"criteria_display":100,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":100,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":11,"name":"upload_filename","label":"upload_filename","form_label":"Filename","description":null,"primary_key":false,"output_display":110,"criteria_display":110,"search_type":null,"type":"string","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":110,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":12,"name":"burst_id","label":"burst_id","form_label":"Burst ID","description":null,"primary_key":false,"output_display":120,"criteria_display":120,"search_type":"field","type":"string","operator":"eq","dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":true,"order_by":true,"archive":false,"detail":false,"detail_display":120,"options":[],"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":5,"id_output_category":6,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":13,"name":"pipeline_version","label":"pipeline_version","form_label":"Pipeline version","description":null,"primary_key":false,"output_display":130,"criteria_display":130,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":130,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":14,"name":"schema_version","label":"schema_version","form_label":"Schema version","description":null,"primary_key":false,"output_display":140,"criteria_display":140,"search_type":null,"type":"float","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":140,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
+curl -d '{"id":15,"name":"src_id","label":"src_id","form_label":"SRC ID","description":null,"primary_key":false,"output_display":150,"criteria_display":150,"search_type":null,"type":"integer","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"selected":false,"order_by":true,"archive":false,"detail":false,"detail_display":150,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":null,"id_output_category":7,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/products/attribute
 
 # Add webpages
 curl -d '{"label":"Default","icon":null,"display":10}' --header 'Content-Type: application/json' -X POST http://localhost/instance/default/webpage-family
diff --git a/server/doctrine-proxy/__CG__AppEntityAttribute.php b/server/doctrine-proxy/__CG__AppEntityAttribute.php
index 0d1ec8c3f3191d037c0be588092fcc82d35c7c35..e9734fb01579e1ab7e3a2421e77fc5e46fd5ea72 100644
--- a/server/doctrine-proxy/__CG__AppEntityAttribute.php
+++ b/server/doctrine-proxy/__CG__AppEntityAttribute.php
@@ -67,10 +67,10 @@ class Attribute extends \App\Entity\Attribute implements \Doctrine\ORM\Proxy\Pro
     public function __sleep()
     {
         if ($this->__isInitialized__) {
-            return ['__isInitialized__', 'id', 'dataset', 'name', 'label', 'formLabel', 'description', 'primaryKey', 'type', 'searchType', 'operator', 'dynamicOperator', 'min', 'max', 'options', 'placeholderMin', 'placeholderMax', 'criteriaDisplay', 'outputDisplay', 'selected', 'renderer', 'rendererConfig', 'orderBy', 'archive', 'detail', 'displayDetail', 'rendererDetail', 'rendererDetailConfig', 'voUtype', 'voUcd', 'voUnit', 'voDescription', 'voDatatype', 'voSize', 'criteriaFamily', 'outputCategory'];
+            return ['__isInitialized__', 'id', 'dataset', 'name', 'label', 'formLabel', 'description', 'primaryKey', 'type', 'searchType', 'operator', 'dynamicOperator', 'min', 'max', 'options', 'placeholderMin', 'placeholderMax', 'criteriaDisplay', 'outputDisplay', 'selected', 'renderer', 'rendererConfig', 'orderBy', 'archive', 'detailDisplay', 'voUtype', 'voUcd', 'voUnit', 'voDescription', 'voDatatype', 'voSize', 'criteriaFamily', 'outputCategory', 'detailOutputCategory'];
         }
 
-        return ['__isInitialized__', 'id', 'dataset', 'name', 'label', 'formLabel', 'description', 'primaryKey', 'type', 'searchType', 'operator', 'dynamicOperator', 'min', 'max', 'options', 'placeholderMin', 'placeholderMax', 'criteriaDisplay', 'outputDisplay', 'selected', 'renderer', 'rendererConfig', 'orderBy', 'archive', 'detail', 'displayDetail', 'rendererDetail', 'rendererDetailConfig', 'voUtype', 'voUcd', 'voUnit', 'voDescription', 'voDatatype', 'voSize', 'criteriaFamily', 'outputCategory'];
+        return ['__isInitialized__', 'id', 'dataset', 'name', 'label', 'formLabel', 'description', 'primaryKey', 'type', 'searchType', 'operator', 'dynamicOperator', 'min', 'max', 'options', 'placeholderMin', 'placeholderMax', 'criteriaDisplay', 'outputDisplay', 'selected', 'renderer', 'rendererConfig', 'orderBy', 'archive', 'detailDisplay', 'voUtype', 'voUcd', 'voUnit', 'voDescription', 'voDatatype', 'voSize', 'criteriaFamily', 'outputCategory', 'detailOutputCategory'];
     }
 
     /**
@@ -679,23 +679,23 @@ class Attribute extends \App\Entity\Attribute implements \Doctrine\ORM\Proxy\Pro
     /**
      * {@inheritDoc}
      */
-    public function getDisplayDetail()
+    public function getDetailDisplay()
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDisplayDetail', []);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDetailDisplay', []);
 
-        return parent::getDisplayDetail();
+        return parent::getDetailDisplay();
     }
 
     /**
      * {@inheritDoc}
      */
-    public function setDisplayDetail($displayDetail)
+    public function setDetailDisplay($detailDisplay)
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDisplayDetail', [$displayDetail]);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDetailDisplay', [$detailDisplay]);
 
-        return parent::setDisplayDetail($displayDetail);
+        return parent::setDetailDisplay($detailDisplay);
     }
 
     /**
@@ -833,111 +833,67 @@ class Attribute extends \App\Entity\Attribute implements \Doctrine\ORM\Proxy\Pro
     /**
      * {@inheritDoc}
      */
-    public function getDetail()
-    {
-
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDetail', []);
-
-        return parent::getDetail();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function setDetail($detail)
-    {
-
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDetail', [$detail]);
-
-        return parent::setDetail($detail);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function getRendererDetail()
-    {
-
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getRendererDetail', []);
-
-        return parent::getRendererDetail();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function setRendererDetail($rendererDetail)
-    {
-
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setRendererDetail', [$rendererDetail]);
-
-        return parent::setRendererDetail($rendererDetail);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function getRendererDetailConfig()
+    public function getCriteriaFamily()
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getRendererDetailConfig', []);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getCriteriaFamily', []);
 
-        return parent::getRendererDetailConfig();
+        return parent::getCriteriaFamily();
     }
 
     /**
      * {@inheritDoc}
      */
-    public function setRendererDetailConfig($rendererDetailConfig)
+    public function setCriteriaFamily($criteriaFamily)
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setRendererDetailConfig', [$rendererDetailConfig]);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setCriteriaFamily', [$criteriaFamily]);
 
-        return parent::setRendererDetailConfig($rendererDetailConfig);
+        return parent::setCriteriaFamily($criteriaFamily);
     }
 
     /**
      * {@inheritDoc}
      */
-    public function getCriteriaFamily()
+    public function getOutputCategory()
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getCriteriaFamily', []);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getOutputCategory', []);
 
-        return parent::getCriteriaFamily();
+        return parent::getOutputCategory();
     }
 
     /**
      * {@inheritDoc}
      */
-    public function setCriteriaFamily($criteriaFamily)
+    public function setOutputCategory($outputCategory)
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setCriteriaFamily', [$criteriaFamily]);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setOutputCategory', [$outputCategory]);
 
-        return parent::setCriteriaFamily($criteriaFamily);
+        return parent::setOutputCategory($outputCategory);
     }
 
     /**
      * {@inheritDoc}
      */
-    public function getOutputCategory()
+    public function getDetailOutputCategory()
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getOutputCategory', []);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDetailOutputCategory', []);
 
-        return parent::getOutputCategory();
+        return parent::getDetailOutputCategory();
     }
 
     /**
      * {@inheritDoc}
      */
-    public function setOutputCategory($outputCategory)
+    public function setDetailOutputCategory($detailOutputCategory)
     {
 
-        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setOutputCategory', [$outputCategory]);
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDetailOutputCategory', [$detailOutputCategory]);
 
-        return parent::setOutputCategory($outputCategory);
+        return parent::setDetailOutputCategory($detailOutputCategory);
     }
 
     /**
diff --git a/server/doctrine-proxy/__CG__AppEntityDataset.php b/server/doctrine-proxy/__CG__AppEntityDataset.php
index 2d0da202673c348e3d21db33c676cf70dcea3e08..cd70caa3d43ccacd978ec065e1107a21206eddf1 100644
--- a/server/doctrine-proxy/__CG__AppEntityDataset.php
+++ b/server/doctrine-proxy/__CG__AppEntityDataset.php
@@ -67,10 +67,10 @@ class Dataset extends \App\Entity\Dataset implements \Doctrine\ORM\Proxy\Proxy
     public function __sleep()
     {
         if ($this->__isInitialized__) {
-            return ['__isInitialized__', 'name', 'tableRef', 'label', 'description', 'display', 'dataPath', 'public', 'downloadJson', 'downloadCsv', 'downloadAscii', 'downloadVo', 'serverLinkEnabled', 'datatableEnabled', 'datatableSelectableRows', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'coneSearchConfig', 'database', 'datasetFamily', 'attributes'];
+            return ['__isInitialized__', 'name', 'tableRef', 'label', 'description', 'display', 'dataPath', 'public', 'downloadJson', 'downloadCsv', 'downloadAscii', 'downloadVo', 'serverLinkEnabled', 'datatableEnabled', 'datatableSelectableRows', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'coneSearchConfig', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'detailConfig', 'database', 'datasetFamily', 'attributes'];
         }
 
-        return ['__isInitialized__', 'name', 'tableRef', 'label', 'description', 'display', 'dataPath', 'public', 'downloadJson', 'downloadCsv', 'downloadAscii', 'downloadVo', 'serverLinkEnabled', 'datatableEnabled', 'datatableSelectableRows', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'coneSearchConfig', 'database', 'datasetFamily', 'attributes'];
+        return ['__isInitialized__', 'name', 'tableRef', 'label', 'description', 'display', 'dataPath', 'public', 'downloadJson', 'downloadCsv', 'downloadAscii', 'downloadVo', 'serverLinkEnabled', 'datatableEnabled', 'datatableSelectableRows', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'coneSearchConfig', '' . "\0" . 'App\\Entity\\Dataset' . "\0" . 'detailConfig', 'database', 'datasetFamily', 'attributes'];
     }
 
     /**
@@ -500,6 +500,28 @@ class Dataset extends \App\Entity\Dataset implements \Doctrine\ORM\Proxy\Proxy
         return parent::setConeSearchConfig($coneSearchConfig);
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function getDetailConfig()
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDetailConfig', []);
+
+        return parent::getDetailConfig();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setDetailConfig($detailConfig)
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDetailConfig', [$detailConfig]);
+
+        return parent::setDetailConfig($detailConfig);
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/server/doctrine-proxy/__CG__AppEntityDetailConfig.php b/server/doctrine-proxy/__CG__AppEntityDetailConfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..45fb9beb72f23dc4407d16a627f62218b360833b
--- /dev/null
+++ b/server/doctrine-proxy/__CG__AppEntityDetailConfig.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace DoctrineProxies\__CG__\App\Entity;
+
+
+/**
+ * DO NOT EDIT THIS FILE - IT WAS CREATED BY DOCTRINE'S PROXY GENERATOR
+ */
+class DetailConfig extends \App\Entity\DetailConfig implements \Doctrine\ORM\Proxy\Proxy
+{
+    /**
+     * @var \Closure the callback responsible for loading properties in the proxy object. This callback is called with
+     *      three parameters, being respectively the proxy object to be initialized, the method that triggered the
+     *      initialization process and an array of ordered parameters that were passed to that method.
+     *
+     * @see \Doctrine\Common\Proxy\Proxy::__setInitializer
+     */
+    public $__initializer__;
+
+    /**
+     * @var \Closure the callback responsible of loading properties that need to be copied in the cloned object
+     *
+     * @see \Doctrine\Common\Proxy\Proxy::__setCloner
+     */
+    public $__cloner__;
+
+    /**
+     * @var boolean flag indicating if this object was already initialized
+     *
+     * @see \Doctrine\Persistence\Proxy::__isInitialized
+     */
+    public $__isInitialized__ = false;
+
+    /**
+     * @var array<string, null> properties to be lazy loaded, indexed by property name
+     */
+    public static $lazyPropertiesNames = array (
+);
+
+    /**
+     * @var array<string, mixed> default values of properties to be lazy loaded, with keys being the property names
+     *
+     * @see \Doctrine\Common\Proxy\Proxy::__getLazyProperties
+     */
+    public static $lazyPropertiesDefaults = array (
+);
+
+
+
+    public function __construct(?\Closure $initializer = null, ?\Closure $cloner = null)
+    {
+
+        $this->__initializer__ = $initializer;
+        $this->__cloner__      = $cloner;
+    }
+
+
+
+
+
+
+
+    /**
+     * 
+     * @return array
+     */
+    public function __sleep()
+    {
+        if ($this->__isInitialized__) {
+            return ['__isInitialized__', 'id', 'enabled', 'content'];
+        }
+
+        return ['__isInitialized__', 'id', 'enabled', 'content'];
+    }
+
+    /**
+     * 
+     */
+    public function __wakeup()
+    {
+        if ( ! $this->__isInitialized__) {
+            $this->__initializer__ = function (DetailConfig $proxy) {
+                $proxy->__setInitializer(null);
+                $proxy->__setCloner(null);
+
+                $existingProperties = get_object_vars($proxy);
+
+                foreach ($proxy::$lazyPropertiesDefaults as $property => $defaultValue) {
+                    if ( ! array_key_exists($property, $existingProperties)) {
+                        $proxy->$property = $defaultValue;
+                    }
+                }
+            };
+
+        }
+    }
+
+    /**
+     * 
+     */
+    public function __clone()
+    {
+        $this->__cloner__ && $this->__cloner__->__invoke($this, '__clone', []);
+    }
+
+    /**
+     * Forces initialization of the proxy
+     */
+    public function __load()
+    {
+        $this->__initializer__ && $this->__initializer__->__invoke($this, '__load', []);
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     */
+    public function __isInitialized()
+    {
+        return $this->__isInitialized__;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     */
+    public function __setInitialized($initialized)
+    {
+        $this->__isInitialized__ = $initialized;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     */
+    public function __setInitializer(\Closure $initializer = null)
+    {
+        $this->__initializer__ = $initializer;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     */
+    public function __getInitializer()
+    {
+        return $this->__initializer__;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     */
+    public function __setCloner(\Closure $cloner = null)
+    {
+        $this->__cloner__ = $cloner;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific cloning logic
+     */
+    public function __getCloner()
+    {
+        return $this->__cloner__;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @internal generated method: use only when explicitly handling proxy specific loading logic
+     * @deprecated no longer in use - generated code now relies on internal components rather than generated public API
+     * @static
+     */
+    public function __getLazyProperties()
+    {
+        return self::$lazyPropertiesDefaults;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public function getId()
+    {
+        if ($this->__isInitialized__ === false) {
+            return (int)  parent::getId();
+        }
+
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getId', []);
+
+        return parent::getId();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getEnabled()
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getEnabled', []);
+
+        return parent::getEnabled();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setEnabled($enabled)
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setEnabled', [$enabled]);
+
+        return parent::setEnabled($enabled);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getContent()
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getContent', []);
+
+        return parent::getContent();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setContent($content)
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setContent', [$content]);
+
+        return parent::setContent($content);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function jsonSerialize(): array
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'jsonSerialize', []);
+
+        return parent::jsonSerialize();
+    }
+
+}
diff --git a/server/src/Action/AttributeAction.php b/server/src/Action/AttributeAction.php
index 44eba539366173c669d871bd3050724f037dd908..4ceb4096c1a7eaf5ba2c3f9d653a3805b0ae9e9e 100644
--- a/server/src/Action/AttributeAction.php
+++ b/server/src/Action/AttributeAction.php
@@ -85,8 +85,7 @@ final class AttributeAction extends AbstractAction
                 'renderer_config',
                 'order_by',
                 'archive',
-                'detail',
-                'display_detail',
+                'detail_display',
                 'vo_utype',
                 'vo_ucd',
                 'vo_unit',
@@ -94,7 +93,8 @@ final class AttributeAction extends AbstractAction
                 'vo_datatype',
                 'vo_size',
                 'id_criteria_family',
-                'id_output_category'
+                'id_output_category',
+                'id_detail_output_category'
             );
             foreach ($fields as $a) {
                 if (!array_key_exists($a, $parsedBody)) {
@@ -150,8 +150,7 @@ final class AttributeAction extends AbstractAction
         $attribute->setRendererConfig($parsedBody['renderer_config']);
         $attribute->setOrderBy($parsedBody['order_by']);
         $attribute->setArchive($parsedBody['archive']);
-        $attribute->setDetail($parsedBody['detail']);
-        $attribute->setDisplayDetail($parsedBody['display_detail']);
+        $attribute->setDetailDisplay($parsedBody['detail_display']);
         $attribute->setVoUtype($parsedBody['vo_utype']);
         $attribute->setVoUcd($parsedBody['vo_ucd']);
         $attribute->setVoUnit($parsedBody['vo_unit']);
@@ -176,6 +175,15 @@ final class AttributeAction extends AbstractAction
             );
         }
         $attribute->setOutputCategory($outputCategory);
+        if (is_null($parsedBody['id_detail_output_category'])) {
+            $detailOutputCategory = null;
+        } else {
+            $detailOutputCategory = $this->em->find(
+                'App\Entity\OutputCategory',
+                $parsedBody['id_detail_output_category']
+            );
+        }
+        $attribute->setDetailOutputCategory($detailOutputCategory);
         $this->em->flush();
     }
 }
diff --git a/server/src/Action/AttributeListAction.php b/server/src/Action/AttributeListAction.php
index 07f18ab47b232d1d4944e98dd449573e3e3d3431..e1496b10d00f994be42136fd2cdaaa719a39c80a 100644
--- a/server/src/Action/AttributeListAction.php
+++ b/server/src/Action/AttributeListAction.php
@@ -87,8 +87,7 @@ final class AttributeListAction extends AbstractAction
                 'renderer_config',
                 'order_by',
                 'archive',
-                'detail',
-                'display_detail',
+                'detail_display',
                 'vo_utype',
                 'vo_ucd',
                 'vo_unit',
@@ -96,7 +95,8 @@ final class AttributeListAction extends AbstractAction
                 'vo_datatype',
                 'vo_size',
                 'id_criteria_family',
-                'id_output_category'
+                'id_output_category',
+                'id_detail_output_category'
             );
             foreach ($fields as $a) {
                 if (!array_key_exists($a, $parsedBody)) {
@@ -148,8 +148,7 @@ final class AttributeListAction extends AbstractAction
         $attribute->setRendererConfig($parsedBody['renderer_config']);
         $attribute->setOrderBy($parsedBody['order_by']);
         $attribute->setArchive($parsedBody['archive']);
-        $attribute->setDetail($parsedBody['detail']);
-        $attribute->setDisplayDetail($parsedBody['display_detail']);
+        $attribute->setDetailDisplay($parsedBody['detail_display']);
         $attribute->setVoUtype($parsedBody['vo_utype']);
         $attribute->setVoUcd($parsedBody['vo_ucd']);
         $attribute->setVoUnit($parsedBody['vo_unit']);
@@ -174,6 +173,15 @@ final class AttributeListAction extends AbstractAction
             );
         }
         $attribute->setOutputCategory($outputCategory);
+        if (is_null($parsedBody['id_detail_output_category'])) {
+            $detailOutputCategory = null;
+        } else {
+            $detailOutputCategory = $this->em->find(
+                'App\Entity\OutputCategory',
+                $parsedBody['id_detail_output_category']
+            );
+        }
+        $attribute->setDetailOutputCategory($detailOutputCategory);
 
         $this->em->persist($attribute);
         $this->em->flush();
diff --git a/server/src/Entity/Attribute.php b/server/src/Entity/Attribute.php
index fcbdf69df8ce0f233f882affb6d1becc7ae41b22..82f8aeb5d389af1631b9c39ae6d0b92cd429e087 100644
--- a/server/src/Entity/Attribute.php
+++ b/server/src/Entity/Attribute.php
@@ -185,19 +185,12 @@ class Attribute implements \JsonSerializable
      */
     protected $archive;
 
-    /**
-     * @var bool
-     *
-     * @Column(type="boolean", name="detail", nullable=false, options={"default":false})
-     */
-    protected $detail;
-
     /**
      * @var int
      *
-     * @Column(type="integer", name="display_detail", nullable=true)
+     * @Column(type="integer", name="detail_display", nullable=true)
      */
-    protected $displayDetail;
+    protected $detailDisplay;
 
     /**
      * @var string
@@ -257,6 +250,14 @@ class Attribute implements \JsonSerializable
      */
     protected $outputCategory;
 
+    /**
+     * @var OutputCategory
+     *
+     * @ManyToOne(targetEntity="OutputCategory")
+     * @JoinColumn(name="detail_output_category", referencedColumnName="id", nullable=true, onDelete="SET NULL")
+     */
+    protected $detailOutputCategory;
+
     public function __construct(int $id, Dataset $dataset)
     {
         $this->id = $id;
@@ -488,14 +489,14 @@ class Attribute implements \JsonSerializable
         $this->archive = $archive;
     }
 
-    public function getDisplayDetail()
+    public function getDetailDisplay()
     {
-        return $this->displayDetail;
+        return $this->detailDisplay;
     }
 
-    public function setDisplayDetail($displayDetail)
+    public function setDetailDisplay($detailDisplay)
     {
-        $this->displayDetail = $displayDetail;
+        $this->detailDisplay = $detailDisplay;
     }
 
     public function getVoUtype()
@@ -558,16 +559,6 @@ class Attribute implements \JsonSerializable
         $this->voSize = $voSize;
     }
 
-    public function getDetail()
-    {
-        return $this->detail;
-    }
-
-    public function setDetail($detail)
-    {
-        $this->detail = $detail;
-    }
-
     public function getCriteriaFamily()
     {
         return $this->criteriaFamily;
@@ -588,6 +579,16 @@ class Attribute implements \JsonSerializable
         $this->outputCategory = $outputCategory;
     }
 
+    public function getDetailOutputCategory()
+    {
+        return $this->detailOutputCategory;
+    }
+
+    public function setDetailOutputCategory($detailOutputCategory)
+    {
+        $this->detailOutputCategory = $detailOutputCategory;
+    }
+
     public function jsonSerialize(): array
     {
         return [
@@ -613,8 +614,7 @@ class Attribute implements \JsonSerializable
             'renderer_config' => $this->getRendererConfig(),
             'order_by' => $this->getOrderBy(),
             'archive' => $this->getArchive(),
-            'detail' => $this->getDetail(),
-            'display_detail' => $this->getDisplayDetail(),
+            'detail_display' => $this->getDetailDisplay(),
             'vo_utype' => $this->getVoUtype(),
             'vo_ucd' => $this->getVoUcd(),
             'vo_unit' => $this->getVoUnit(),
@@ -622,7 +622,8 @@ class Attribute implements \JsonSerializable
             'vo_datatype' => $this->getVoDatatype(),
             'vo_size' => $this->getVoSize(),
             'id_criteria_family' => is_null($this->getCriteriaFamily()) ? null : $this->getCriteriaFamily()->getId(),
-            'id_output_category' => is_null($this->getOutputCategory()) ? null : $this->getOutputCategory()->getId()
+            'id_output_category' => is_null($this->getOutputCategory()) ? null : $this->getOutputCategory()->getId(),
+            'id_detail_output_category' => is_null($this->getDetailOutputCategory()) ? null : $this->getDetailOutputCategory()->getId()
         ];
     }
 }