diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/descriptive.handler.ts b/api/src/engine/connectors/exareme/handlers/algorithms/descriptive.handler.ts
index 4e51ff16e39f652caa51c743ba08cfddd46c5ce3..ef37259742829ef420120b706a85d71c94e2e99d 100644
--- a/api/src/engine/connectors/exareme/handlers/algorithms/descriptive.handler.ts
+++ b/api/src/engine/connectors/exareme/handlers/algorithms/descriptive.handler.ts
@@ -1,4 +1,5 @@
 import * as jsonata from 'jsonata'; // old import style needed due to 'export = jsonata'
+import { TableResult } from 'src/engine/models/result/table-result.model';
 import { Domain } from '../../../../models/domain.model';
 import { Experiment } from '../../../../models/experiment/experiment.model';
 import {
@@ -90,7 +91,7 @@ $fn := function($o, $prefix) {
 )
 `);
 
-  descriptiveDataToTableResult(data: ResultExperiment): GroupsResult {
+  descriptiveDataToTableResult1(data: ResultExperiment): GroupsResult {
     const result = new GroupsResult();
 
     result.groups = [
@@ -113,6 +114,66 @@ $fn := function($o, $prefix) {
     return result;
   }
 
+  static readonly descriptiveToTable = (stats: any[]): TableResult[] => {
+    const datasets: string[] = Array.from(new Set(stats.map(d => d.dataset)))
+    const variables: string[] = Array.from(new Set(stats.map(d => d.variable)))
+
+    const columns = (variable) => {
+      const stat = stats.filter((s) => s.variable === variable)
+      const data = key => stat.map(d => d.data[key] || '')
+      const modalities = Array.from(new Set(data('counts').flatMap(c => Object.keys(c))))
+
+      return ([
+        [variable, ...data('num_total')],
+        ['Datapoints', ...data('num_dtps')],
+        ['NA', ...data('num_na')],
+        ...(modalities.length > 0 ?
+          modalities.map(m => [m, ...stat.map(d => d.data.counts[m] || '')]) :
+          [['SE', ...data('std')],
+          ['mean', ...data('mean')],
+          ['min', ...data('num_dtps')],
+          ['Q1', ...data('q1')],
+          ['Q2', ...data('q2')],
+          ['Q3', ...data('q3')],
+          ['max', ...data('max')]]
+        )
+      ])
+    }
+
+    return variables.map(variable => ({
+      headers: [
+        { name: "", type: "string" },
+        ...datasets.map(d => ({ name: d, type: 'string ' }))
+      ],
+      data: columns(variable),
+      name: '',
+      tableStyle: 1
+    }))
+  }
+
+  descriptiveDataToTableResult2(data: ResultExperiment): GroupsResult {
+    const result = new GroupsResult()
+
+    result.groups = [
+      new GroupResult({
+        name: 'Variables',
+        description: 'Descriptive statistics for the variables of interest.',
+        results: DescriptiveHandler.descriptiveToTable(data['variable_based']),
+      }),
+    ]
+
+    result.groups.push(
+      new GroupResult({
+        name: 'Model',
+        description:
+          'Intersection table for the variables of interest as it appears in the experiment.',
+        results: DescriptiveHandler.descriptiveToTable(data['model_based']),
+      }),
+    )
+
+    return result
+  }
+
   handle(exp: Experiment, data: unknown, domain?: Domain): void {
     if (exp.algorithm.name.toLowerCase() !== 'descriptive_stats')
       return super.handle(exp, data, domain);
@@ -120,10 +181,15 @@ $fn := function($o, $prefix) {
     const inputs = data as ResultExperiment[];
 
     if (inputs && Array.isArray(inputs)) {
-      inputs
+      const exareme1 = inputs
         .filter((input) => input.type === 'application/json')
-        .map((input) => this.descriptiveDataToTableResult(input))
-        .forEach((input) => exp.results.push(input));
+
+      if (exareme1.length > 0)
+        exareme1.map((input) => this.descriptiveDataToTableResult1(input))
+          .forEach((input) => exp.results.push(input));
+      else
+        inputs.map((input) => this.descriptiveDataToTableResult2(input))
+          .forEach((input) => exp.results.push(input));
     }
   }
 }