diff --git a/ivette/src/dome/renderer/table/views.tsx b/ivette/src/dome/renderer/table/views.tsx
index d2e29169c2af9106dc3c346ef7d70827dce311e7..3e40f7a12e1c0ff658050d2a82d8aa175f194d22 100644
--- a/ivette/src/dome/renderer/table/views.tsx
+++ b/ivette/src/dome/renderer/table/views.tsx
@@ -181,6 +181,8 @@ export interface TableProps<Key, Row> {
   selection?: Key;
   /** Selection callback. */
   onSelection?: (row: Row, key: Key, index: number) => void;
+  /** Double click callback. */
+  onDoubleClick?: (row: Row, index: number) => void;
   /** Context menu callback. */
   onContextMenu?: (row: Row, index: number) => void;
   /** Fallback for rendering an empty table. */
@@ -337,6 +339,8 @@ class TableState<Key, Row> {
   selectedIndex?: number; // Current selected index
   sortBy?: string; // last sorting dataKey
   sortDirection?: SortDirectionType; // last sorting direction
+  onSelection?: (data: Row, key: Key, index: number) => void; // main callback
+  onDoubleClick?: (row: Row, index: number) => void; // double click callback
   onContextMenu?: (row: Row, index: number) => void; // context menu callback
   range?: IndexRange;
   rowCount = 0;
@@ -350,6 +354,7 @@ class TableState<Key, Row> {
     this.rowClassName = this.rowClassName.bind(this);
     this.onHeaderMenu = this.onHeaderMenu.bind(this);
     this.onRowClick = this.onRowClick.bind(this);
+    this.onRowDoubleClick = this.onRowDoubleClick.bind(this);
     this.onRowRightClick = this.onRowRightClick.bind(this);
     this.onKeyDown = this.onKeyDown.bind(this);
     this.onSorting = this.onSorting.bind(this);
@@ -363,6 +368,7 @@ class TableState<Key, Row> {
     this.signal = undefined;
     this.onSelection = undefined;
     this.onContextMenu = undefined;
+    this.onDoubleClick = undefined;
   }
 
   forceUpdate(): void {
@@ -509,8 +515,6 @@ class TableState<Key, Row> {
 
   // ---- Selection Management
 
-  onSelection?: (data: Row, key: Key, index: number) => void;
-
   onRowClick(info: RowMouseEventHandlerParams): void {
     const { index } = info;
     const data = info.rowData as (Row | undefined);
@@ -529,7 +533,8 @@ class TableState<Key, Row> {
 
   rowClassName({ index }: Index): string {
     if (this.selectedIndex === index) return 'dome-xTable-selected';
-    return (index & 1 ? 'dome-xTable-even' : 'dome-xTable-odd'); // eslint-disable-line no-bitwise
+    // eslint-disable-next-line no-bitwise
+    return (index & 1 ? 'dome-xTable-even' : 'dome-xTable-odd');
   }
 
   keyStepper(index: number): void {
@@ -563,7 +568,17 @@ class TableState<Key, Row> {
 
   // ---- Row Events
 
-  onRowRightClick({ event, rowData, index }: RowMouseEventHandlerParams): void {
+  onRowDoubleClick({ event, rowData, index }: RowMouseEventHandlerParams): void
+  {
+    const callback = this.onDoubleClick;
+    if (callback) {
+      event.stopPropagation();
+      callback(rowData, index);
+    }
+  }
+
+  onRowRightClick({ event, rowData, index }: RowMouseEventHandlerParams): void
+  {
     const callback = this.onContextMenu;
     if (callback) {
       event.stopPropagation();
@@ -1092,6 +1107,7 @@ function makeTable<Key, Row>(
         headerRowRenderer={headerRowRenderer}
         onRowsRendered={state.onRowsRendered}
         onRowClick={state.onRowClick}
+        onRowDoubleClick={state.onRowDoubleClick}
         onRowRightClick={state.onRowRightClick}
         sortBy={state.sortBy}
         sortDirection={state.sortDirection}
@@ -1152,6 +1168,7 @@ export function Table<Key, Row>(props: TableProps<Key, Row>): JSX.Element {
     state.setSorting(props.sorting);
     state.setRendering(props.rendering);
     state.onSelection = props.onSelection;
+    state.onDoubleClick = props.onDoubleClick;
     state.onContextMenu = props.onContextMenu;
     return state.unwind;
   });