diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
index ac4df82..7dc98a6 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
@@ -13,10 +13,7 @@
  *******************************************************************************/
 package org.eclipse.swt.dnd;
 
-import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.cairo.*;
-import org.eclipse.swt.internal.gtk.*;
 import org.eclipse.swt.widgets.*;
 
 /**
@@ -83,71 +80,7 @@
 
 	Image getDragSourceImage(DragSourceEvent event) {
 		if (dragSourceImage != null) dragSourceImage.dispose();
-		dragSourceImage = null;
-
-		Table table = (Table) control;
-
-		/*
-		* Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
-		* in versions smaller than 2.2.4 if the model is NULL.  The fix is
-		* to give a valid pointer instead.
-		*/
-		long handle = table.handle;
-		long selection = GTK.gtk_tree_view_get_selection (handle);
-		long [] model = null;
-		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
-		if (list == 0) return null;
-		int count = Math.min(10, OS.g_list_length (list));
-		long originalList = list;
-
-		Display display = table.getDisplay();
-		if (count == 1) {
-			long path = OS.g_list_nth_data (list, 0);
-			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
-			GTK.gtk_tree_path_free (path);
-		} else {
-			int width = 0, height = 0;
-			int[] w = new int[1], h = new int[1];
-			int[] yy = new int[count], hh = new int[count];
-			long [] icons = new long [count];
-			GdkRectangle rect = new GdkRectangle ();
-			for (int i=0; i<count; i++) {
-				long path = OS.g_list_data (list);
-				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
-				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
-				switch (Cairo.cairo_surface_get_type(icons[i])) {
-				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
-					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
-					break;
-				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
-					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
-					break;
-				}
-				width = Math.max(width, w[0]);
-				height = rect.y + h[0] - yy[0];
-				yy[i] = rect.y;
-				hh[i] = h[0];
-				list = OS.g_list_next (list);
-				GTK.gtk_tree_path_free (path);
-			}
-			long surface  = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
-			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			long cairo = Cairo.cairo_create(surface);
-			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
-			for (int i=0; i<count; i++) {
-				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
-				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
-				Cairo.cairo_fill(cairo);
-				Cairo.cairo_surface_destroy(icons[i]);
-			}
-			Cairo.cairo_destroy(cairo);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, surface, 0);
-		}
-		OS.g_list_free (originalList);
+		dragSourceImage = TreeTableCommon.getDragSourceImage(control);
 		return dragSourceImage;
 	}
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
index 9163528..f6eb761 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
@@ -13,10 +13,7 @@
  *******************************************************************************/
 package org.eclipse.swt.dnd;
 
-import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.cairo.*;
-import org.eclipse.swt.internal.gtk.*;
 import org.eclipse.swt.widgets.*;
 
 /**
@@ -82,71 +79,7 @@
 
 	Image getDragSourceImage(DragSourceEvent event) {
 		if (dragSourceImage != null) dragSourceImage.dispose();
-		dragSourceImage = null;
-
-		Tree tree = (Tree) control;
-
-		/*
-		 * Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
-		 * in versions smaller than 2.2.4 if the model is NULL.  The fix is
-		 * to give a valid pointer instead.
-		 */
-		long handle = tree.handle;
-		long selection = GTK.gtk_tree_view_get_selection (handle);
-		long [] model =  null;
-		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
-		if (list == 0) return null;
-		int count = Math.min(10, OS.g_list_length (list));
-		long originalList = list;
-
-		Display display = tree.getDisplay();
-		if (count == 1) {
-			long path = OS.g_list_nth_data (list, 0);
-			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
-			GTK.gtk_tree_path_free (path);
-		} else {
-			int width = 0, height = 0;
-			int[] w = new int[1], h = new int[1];
-			int[] yy = new int[count], hh = new int[count];
-			long [] icons = new long [count];
-			GdkRectangle rect = new GdkRectangle ();
-			for (int i=0; i<count; i++) {
-				long path = OS.g_list_data (list);
-				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
-				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
-				switch (Cairo.cairo_surface_get_type(icons[i])) {
-				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
-					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
-					break;
-				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
-					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
-					break;
-				}
-				width = Math.max(width, w[0]);
-				height = rect.y + h[0] - yy[0];
-				yy[i] = rect.y;
-				hh[i] = h[0];
-				list = OS.g_list_next (list);
-				GTK.gtk_tree_path_free (path);
-			}
-			long surface = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
-			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			long cairo = Cairo.cairo_create(surface);
-			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
-			for (int i=0; i<count; i++) {
-				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
-				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
-				Cairo.cairo_fill(cairo);
-				Cairo.cairo_surface_destroy(icons[i]);
-			}
-			Cairo.cairo_destroy(cairo);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, surface, 0);
-		}
-		OS.g_list_free (originalList);
+		dragSourceImage = TreeTableCommon.getDragSourceImage(control);
 		return dragSourceImage;
 	}
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java
new file mode 100644
index 0000000..2456016
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2022 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.dnd;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.cairo.*;
+import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.widgets.*;
+
+class TreeTableCommon {
+	static Image getDragSourceImage(Control control) {
+		Image dragSourceImage;
+
+		/*
+		 * Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
+		 * in versions smaller than 2.2.4 if the model is NULL.  The fix is
+		 * to give a valid pointer instead.
+		 */
+		long handle = control.handle;
+		long selection = GTK.gtk_tree_view_get_selection (handle);
+		long [] model =  null;
+		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
+		if (list == 0) return null;
+		int count = Math.min(10, OS.g_list_length (list));
+		long originalList = list;
+
+		Display display = control.getDisplay();
+		if (count == 1) {
+			long path = OS.g_list_nth_data (list, 0);
+			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
+			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
+			GTK.gtk_tree_path_free (path);
+		} else {
+			int width = 0, height = 0;
+			int[] w = new int[1], h = new int[1];
+			int[] yy = new int[count], hh = new int[count];
+			long [] icons = new long [count];
+			GdkRectangle rect = new GdkRectangle ();
+			for (int i=0; i<count; i++) {
+				long path = OS.g_list_data (list);
+				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
+				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
+				switch (Cairo.cairo_surface_get_type(icons[i])) {
+				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
+					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
+					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
+					break;
+				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
+					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
+					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
+					break;
+				}
+				width = Math.max(width, w[0]);
+				height = rect.y + h[0] - yy[0];
+				yy[i] = rect.y;
+				hh[i] = h[0];
+				list = OS.g_list_next (list);
+				GTK.gtk_tree_path_free (path);
+			}
+			long surface = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
+			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+			long cairo = Cairo.cairo_create(surface);
+			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
+			for (int i=0; i<count; i++) {
+				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
+				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
+				Cairo.cairo_fill(cairo);
+				Cairo.cairo_surface_destroy(icons[i]);
+			}
+			Cairo.cairo_destroy(cairo);
+			dragSourceImage = Image.gtk_new (display, SWT.ICON, surface, 0);
+		}
+		OS.g_list_free (originalList);
+		return dragSourceImage;
+	}
+}
