You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2022/04/06 13:23:40 UTC

[hop] branch master updated: HOP-3405 TableCompare: Unable to set connection name by using a variable HOP-3892 TableCompare: dialog UI improvements HOP-3893 TableCompare: align documentation to new transform UI

This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/master by this push:
     new 12b5ff0823 HOP-3405 TableCompare: Unable to set connection name by using a variable HOP-3892 TableCompare: dialog UI improvements HOP-3893 TableCompare: align documentation to new transform UI
     new aff637ce54 Merge pull request #1444 from sramazzina/HOP-3405
12b5ff0823 is described below

commit 12b5ff082318c38aa673747bab2d983e550bf420
Author: Sergio Ramazzina <se...@serasoft.it>
AuthorDate: Tue Apr 5 00:14:23 2022 +0200

    HOP-3405 TableCompare: Unable to set connection name by using a variable
    HOP-3892 TableCompare: dialog UI improvements
    HOP-3893 TableCompare: align documentation to new transform UI
---
 .../pages/pipeline/transforms/tablecompare.adoc    |  15 +-
 .../pipeline/transforms/tablecompare/Kjube.java    | 123 -------
 .../transforms/tablecompare/TableCompare.java      |  52 ++-
 .../tablecompare/TableCompareDialog.java           | 377 +++++++++++++++------
 .../transforms/tablecompare/TableCompareMeta.java  | 319 +++++++++--------
 .../messages/messages_en_US.properties             |  36 +-
 .../messages/messages_fr_FR.properties             |   2 -
 .../messages/messages_it_IT.properties             | 120 ++++---
 .../messages/messages_ja_JP.properties             |   2 -
 .../messages/messages_zh_CN.properties             |   2 -
 .../hop/ui/core/widget/MetaSelectionLine.java      |   2 +-
 .../ui/pipeline/transform/BaseTransformDialog.java |  39 ++-
 12 files changed, 646 insertions(+), 443 deletions(-)

diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
index f6a4c8f56e..93314603b7 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/tablecompare.adoc
@@ -25,19 +25,30 @@ under the License.
 The Table Compare transform compares the data from two tables (provided they have the same lay-out), finds differences between the data in the two tables and logs it.
 
 == Options
-
+=== Reference/Comparison data tab
 [width="90%",options="header"]
 |===
 |Option|Description
-|Transform name|Name of the transform; This name has to be unique in a single pipeline
 |Reference connection / Compare connection|Database connections from which the reference/compare table data will come.
 |Reference schema field / Compare schema field|contain the schema names for the reference/compare table.
 |Reference table field / Compare table field|contain the actual table names.
 This means that you could compare two tables with a different name, as long as they have the same column names.
+|===
+
+=== Other fields tab
+[width="90%",options="header"]
+|===
+|Option|Description
 |Key fields field|should contain a comma separated list of they fields that make up the 'primary' key of the table(s) you are comparing.
 The primary key is needed because without this information the two tables cannot be correctly joined.
 |Exclude fields field|contains a comma separated list of columns that you want to exclude from the comparison.
 E.g. because they exist in the first table, but not in the second.
+|===
+
+=== Additional fields tab
+[width="90%",options="header"]
+|===
+|Option|Description
 |Number of errors field|allows you to specify the name of the output column that will contain the total number of errors found for the comparison of your tables.
 |Number of reference/compare table records field|allows you to specify the name of the field that will contain the actual number of records found in each table.
 |Number of left/inner/right join errors field|allows you to specify the name of the field(s) that will contain the number of errors found for each join type.
diff --git a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/Kjube.java b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/Kjube.java
deleted file mode 100644
index cf8cbbc980..0000000000
--- a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/Kjube.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hop.pipeline.transforms.tablecompare;
-
-public class Kjube {
-
-  public static final String DEFAULT_CUSTOMER_PARAMETER = "KJUBE_CUSTOMER";
-  public static final String DEFAULT_APPLICATION_PARAMETER = "KJUBE_APPLICATION";
-  public static final String DEFAULT_LIFECYCLE_PARAMETER = "KJUBE_LIFECYCLE";
-
-  public static final String DEFAULT_CONFIG_FILE_PATH =
-      "/kjube/projects/${KJUBE_CUSTOMER}/${KJUBE_APPLICATION}/config/configuration_${KJUBE_LIFECYCLE}.properties";
-
-  public static final String DEFAULT_BATCH_ID_CONNECTION = "${KJUBE_BATCH_ID_CONNECTION}";
-  public static final String DEFAULT_BATCH_ID_SCHEMA = "${KJUBE_BATCH_ID_SCHEMA}";
-  public static final String DEFAULT_BATCH_ID_TABLE = "${KJUBE_BATCH_ID_TABLE}";
-
-  public static final String DEFAULT_BATCH_LOGGING_CONNECTION = "${KJUBE_BATCH_LOGGING_CONNECTION}";
-  public static final String DEFAULT_BATCH_LOGGING_SCHEMA = "${KJUBE_BATCH_LOGGING_SCHEMA}";
-  public static final String DEFAULT_BATCH_LOGGING_TABLE = "${KJUBE_BATCH_LOGGING_TABLE}";
-
-  public static final String DEFAULT_REJECTS_SCHEMA = "${KJUBE_REJECTS_SCHEMA}";
-  public static final String DEFAULT_REJECTS_TABLE = "${KJUBE_REJECTS_TABLE}";
-
-  public static final String DEFAULT_BATCH_ID_VARIABLE_NAME = "${KJUBE_BATCH_ID}";
-
-  public static final String DEFAULT_ERROR_COUNT_VARIABLE_NAME = "${KJUBE_ERROR_COUNT_FIELD}";
-  public static final String DEFAULT_ERROR_DESCRIPTIONS_VARIABLE_NAME =
-      "${KJUBE_ERROR_DESCRIPTIONS_FIELD}";
-  public static final String DEFAULT_ERROR_FIELDS_VARIABLE_NAME = "${KJUBE_ERROR_FIELDS_FIELD}";
-  public static final String DEFAULT_ERROR_CODES_VARIABLE_NAME = "${KJUBE_ERROR_CODES_FIELD}";
-
-  /**
-   * Determines whether or not a character is considered a variables. A character is considered a
-   * variables in Hop if it is a variables, a tab, a newline or a cariage return.
-   *
-   * @param c The character to verify if it is a variables.
-   * @return true if the character is a variables. false otherwise.
-   */
-  public static final boolean isSpace(char c) {
-    return c == ' ' || c == '\t' || c == '\r' || c == '\n' || Character.isWhitespace(c);
-  }
-
-  /**
-   * Left trim: remove spaces to the left of a String.
-   *
-   * @param str The String to left trim
-   * @return The left trimmed String
-   */
-  public static String ltrim(String source) {
-    if (source == null) {
-      return null;
-    }
-    int from = 0;
-    while (from < source.length() && isSpace(source.charAt(from))) {
-      from++;
-    }
-
-    return source.substring(from);
-  }
-
-  /**
-   * Right trim: remove spaces to the right of a string
-   *
-   * @param str The string to right trim
-   * @return The trimmed string.
-   */
-  public static String rtrim(String source) {
-    if (source == null) {
-      return null;
-    }
-
-    int max = source.length();
-    while (max > 0 && isSpace(source.charAt(max - 1))) {
-      max--;
-    }
-
-    return source.substring(0, max);
-  }
-
-  /**
-   * Trims a string: removes the leading and trailing spaces of a String.
-   *
-   * @param str The string to trim
-   * @return The trimmed string.
-   */
-  public static final String trim(String str) {
-    if (str == null) {
-      return null;
-    }
-
-    int max = str.length() - 1;
-    int min = 0;
-
-    while (min <= max && isSpace(str.charAt(min))) {
-      min++;
-    }
-    while (max >= 0 && isSpace(str.charAt(max))) {
-      max--;
-    }
-
-    if (max < min) {
-      return "";
-    }
-
-    return str.substring(min, max + 1);
-  }
-}
diff --git a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
index 941cc31fd7..bfb8fb0fa1 100644
--- a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
+++ b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompare.java
@@ -19,6 +19,7 @@ package org.apache.hop.pipeline.transforms.tablecompare;
 
 import org.apache.hop.core.Const;
 import org.apache.hop.core.database.Database;
+import org.apache.hop.core.database.DatabaseMeta;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.row.IRowMeta;
 import org.apache.hop.core.row.IValueMeta;
@@ -231,6 +232,7 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
 
     Object[] result = new Object[6];
 
+
     if (Utils.isEmpty(referenceTable)) {
       Object[] errorRowData = constructErrorRow(rowMeta, r, null, null, null);
       putError(
@@ -255,12 +257,12 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
       nrErrors++;
     }
 
+    DatabaseMeta refConnectionDatabaseMeta = getPipelineMeta().findDatabase(meta.getReferenceConnection(), variables);
     String refSchemaTable =
-        meta.getReferenceConnection()
-            .getQuotedSchemaTableCombination(this, referenceSchema, referenceTable);
+            refConnectionDatabaseMeta.getQuotedSchemaTableCombination(this, referenceSchema, referenceTable);
+    DatabaseMeta compConnectionDatabaseMeta = getPipelineMeta().findDatabase(meta.getReferenceConnection(), variables);
     String cmpSchemaTable =
-        meta.getCompareConnection()
-            .getQuotedSchemaTableCombination(this, compareSchema, compareTable);
+            compConnectionDatabaseMeta.getQuotedSchemaTableCombination(this, compareSchema, compareTable);
 
     if (Utils.isEmpty(keyFields)) {
       Object[] errorRowData = constructErrorRow(rowMeta, r, null, null, null);
@@ -284,11 +286,11 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
 
     String[] keys = keyFields.split(",");
     for (int i = 0; i < keys.length; i++) {
-      keys[i] = Kjube.trim(keys[i]);
+      keys[i] = keys[i].trim();
     }
     String[] excluded = Utils.isEmpty(excludeFields) ? new String[0] : excludeFields.split(",");
     for (int i = 0; i < excluded.length; i++) {
-      excluded[i] = Kjube.trim(excluded[i]);
+      excluded[i] = excluded[i].trim();
     }
 
     try {
@@ -389,8 +391,8 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
             cmpSql += ", ";
           }
           keyNrs[i] = i;
-          refSql += meta.getReferenceConnection().quoteField(keys[i]);
-          cmpSql += meta.getReferenceConnection().quoteField(keys[i]);
+          refSql += refConnectionDatabaseMeta.quoteField(keys[i]);
+          cmpSql += refConnectionDatabaseMeta.quoteField(keys[i]);
         }
         int[] valueNrs = new int[refFields.size() - keys.length];
         int valueNr = keys.length;
@@ -398,7 +400,7 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
         for (int i = 0; i < refFields.getFieldNames().length; i++) {
           String field = refFields.getFieldNames()[i];
           if (Const.indexOfString(field, keys) < 0) {
-            refSql += ", " + meta.getReferenceConnection().quoteField(field);
+            refSql += ", " + refConnectionDatabaseMeta.quoteField(field);
             valueRowMeta.addValueMeta(refFields.searchValueMeta(field));
             valueNrs[valueIndex++] = valueNr++;
           }
@@ -406,7 +408,7 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
 
         for (String field : cmpFields.getFieldNames()) {
           if (Const.indexOfString(field, keys) < 0) {
-            cmpSql += ", " + meta.getCompareConnection().quoteField(field);
+            cmpSql += ", " + compConnectionDatabaseMeta.quoteField(field);
           }
         }
         refSql += " FROM " + refSchemaTable + " ORDER BY ";
@@ -416,8 +418,8 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
             refSql += ", ";
             cmpSql += ", ";
           }
-          refSql += meta.getReferenceConnection().quoteField(keys[i]);
-          cmpSql += meta.getReferenceConnection().quoteField(keys[i]);
+          refSql += refConnectionDatabaseMeta.quoteField(keys[i]);
+          cmpSql += refConnectionDatabaseMeta.quoteField(keys[i]);
         }
 
         // Now we execute the SQL...
@@ -685,7 +687,16 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
     if (super.init()) {
 
       try {
-        data.referenceDb = new Database(this, this, meta.getReferenceConnection());
+        DatabaseMeta refConnectionDatabaseMeta = getPipelineMeta().findDatabase(meta.getReferenceConnection(), variables);
+        if (refConnectionDatabaseMeta == null) {
+          logError(
+                  BaseMessages.getString(
+                          PKG, "TableCompare.RefConnection.ConnectionMissing", getTransformName()));
+          return false;
+        }
+
+
+        data.referenceDb = new Database(this, this, refConnectionDatabaseMeta);
         data.referenceDb.connect();
 
       } catch (Exception e) {
@@ -693,13 +704,22 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
             BaseMessages.getString(
                 PKG,
                 "TableCompare.Exception.UnexpectedErrorConnectingToReferenceDatabase",
-                meta.getReferenceConnection().getName()),
+                    meta.getReferenceConnection()),
             e);
         return false;
       }
 
       try {
-        data.compareDb = new Database(this, this, meta.getCompareConnection());
+        DatabaseMeta compConnectionDatabaseMeta = getPipelineMeta().findDatabase(meta.getCompareConnection(), variables);
+        if (compConnectionDatabaseMeta == null) {
+          logError(
+                  BaseMessages.getString(
+                          PKG, "TableCompare.CompConnection.ConnectionMissing", getTransformName()));
+          return false;
+        }
+
+
+        data.compareDb = new Database(this, this, compConnectionDatabaseMeta);
         data.compareDb.connect();
 
       } catch (Exception e) {
@@ -707,7 +727,7 @@ public class TableCompare extends BaseTransform<TableCompareMeta, TableCompareDa
             BaseMessages.getString(
                 PKG,
                 "TableCompare.Exception.UnexpectedErrorConnectingToCompareDatabase",
-                meta.getCompareConnection().getName()),
+                    meta.getCompareConnection()),
             e);
         return false;
       }
diff --git a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
index d421dce640..bd5892231c 100644
--- a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
+++ b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareDialog.java
@@ -18,6 +18,7 @@
 package org.apache.hop.pipeline.transforms.tablecompare;
 
 import org.apache.hop.core.Const;
+import org.apache.hop.core.Props;
 import org.apache.hop.core.database.DatabaseMeta;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.row.IRowMeta;
@@ -30,9 +31,16 @@ import org.apache.hop.pipeline.transform.ITransformDialog;
 import org.apache.hop.ui.core.dialog.BaseDialog;
 import org.apache.hop.ui.core.widget.LabelCombo;
 import org.apache.hop.ui.core.widget.LabelText;
+import org.apache.hop.ui.core.widget.MetaSelectionLine;
 import org.apache.hop.ui.pipeline.transform.BaseTransformDialog;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.ScrolledComposite;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
 import org.eclipse.swt.layout.FormLayout;
@@ -48,11 +56,11 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
   /** all fields from the previous transforms */
   private IRowMeta prevFields = null;
 
-  private LabelCombo wReferenceDB;
+  private MetaSelectionLine<DatabaseMeta> wReferenceDB;
   private LabelCombo wReferenceSchema;
   private LabelCombo wReferenceTable;
 
-  private LabelCombo wCompareDB;
+  private MetaSelectionLine<DatabaseMeta> wCompareDB;
   private LabelCombo wCompareSchema;
   private LabelCombo wCompareTable;
 
@@ -85,7 +93,15 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     setShellImage(shell, input);
 
     ModifyListener lsMod = e -> input.setChanged();
+    SelectionAdapter lsSelection =
+        new SelectionAdapter() {
+          @Override
+          public void widgetSelected(SelectionEvent e) {
+            input.setChanged();
+          }
+        };
     changed = input.hasChanged();
+
     FormLayout formLayout = new FormLayout();
     formLayout.marginWidth = Const.FORM_MARGIN;
     formLayout.marginHeight = Const.FORM_MARGIN;
@@ -93,6 +109,18 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     int middle = props.getMiddlePct();
     int margin = props.getMargin();
 
+
+    wOk = new Button(shell, SWT.PUSH);
+    wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
+    wCancel = new Button(shell, SWT.PUSH);
+    wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));
+
+    setButtonPositions(new Button[] {wOk, wCancel}, margin, null);
+
+    // Add listeners
+    wCancel.addListener(SWT.Selection, e -> cancel());
+    wOk.addListener(SWT.Selection, e -> ok());
+
     shell.setLayout(formLayout);
     shell.setText(BaseMessages.getString(PKG, "TableCompareDialog.Shell.Title"));
 
@@ -114,26 +142,46 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     fdTransformName.top = new FormAttachment(0, margin);
     fdTransformName.right = new FormAttachment(100, 0);
     wTransformName.setLayoutData(fdTransformName);
-    Control lastControl = wTransformName;
+
+    ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL);
+    CTabFolder wTabFolder = new CTabFolder(sc, SWT.BORDER);
+    props.setLook(wTabFolder, Props.WIDGET_STYLE_TAB);
+
+    // /////////////////////////////
+    // START OF REFERENCE TAB
+    // /////////////////////////////
+
+    CTabItem wReferenceTab = new CTabItem(wTabFolder, SWT.NONE);
+    wReferenceTab.setText(
+        BaseMessages.getString(PKG, "TableComparisonDialog.ReferenceTab.TabTitle"));
+
+    FormLayout referenceLayout = new FormLayout();
+    referenceLayout.marginWidth = 3;
+    referenceLayout.marginHeight = 3;
+
+    Composite wReferenceComp = new Composite(wTabFolder, SWT.NONE);
+    props.setLook(wReferenceComp);
+    wReferenceComp.setLayout(referenceLayout);
+
 
     // Reference DB + schema + table
-    //
+    DatabaseMeta refDatabaseMeta =
+        pipelineMeta.findDatabase(input.getReferenceConnection(), variables);
     wReferenceDB =
-        new LabelCombo(
-            shell,
+        addConnectionLine(
+            wReferenceComp,
+            null,
+            refDatabaseMeta,
+            lsMod,
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceDB.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceDB.Tooltip"));
-    props.setLook(wReferenceDB);
-    FormData fdReferenceDB = new FormData();
-    fdReferenceDB.left = new FormAttachment(0, 0);
-    fdReferenceDB.top = new FormAttachment(lastControl, margin);
-    fdReferenceDB.right = new FormAttachment(100, 0);
-    wReferenceDB.setLayoutData(fdReferenceDB);
-    lastControl = wReferenceDB;
+    wReferenceDB.addSelectionListener(lsSelection);
+
+    Control lastControl = wReferenceDB;
 
     wReferenceSchema =
         new LabelCombo(
-            shell,
+            wReferenceComp,
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceSchemaField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceSchemaField.Tooltip"));
     props.setLook(wReferenceSchema);
@@ -146,7 +194,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
 
     wReferenceTable =
         new LabelCombo(
-            shell,
+            wReferenceComp,
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceTableField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.ReferenceTableField.Tooltip"));
     props.setLook(wReferenceTable);
@@ -155,26 +203,54 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     fdReferenceTable.top = new FormAttachment(lastControl, margin);
     fdReferenceTable.right = new FormAttachment(100, 0);
     wReferenceTable.setLayoutData(fdReferenceTable);
-    lastControl = wReferenceTable;
 
-    // Reference DB + schema + table
-    //
+    FormData fdReferenceComp = new FormData();
+    fdReferenceComp.left = new FormAttachment(0, 0);
+    fdReferenceComp.top = new FormAttachment(0, 0);
+    fdReferenceComp.right = new FormAttachment(100, 0);
+    fdReferenceComp.bottom = new FormAttachment(100, 0);
+    wReferenceComp.setLayoutData(fdReferenceComp);
+
+    wReferenceComp.layout();
+    wReferenceTab.setControl(wReferenceComp);
+
+    // ///////////////////////////////////////////////////////////
+    // / END OF REFERENCE TAB
+    // ///////////////////////////////////////////////////////////
+
+    // /////////////////////////////
+    // START OF COMPARISON TAB
+    // /////////////////////////////
+
+    CTabItem wComparisonTab = new CTabItem(wTabFolder, SWT.NONE);
+    wComparisonTab.setText(
+        BaseMessages.getString(PKG, "TableComparisonDialog.ComparisonTab.TabTitle"));
+
+    FormLayout comparisonLayout = new FormLayout();
+    comparisonLayout.marginWidth = 3;
+    comparisonLayout.marginHeight = 3;
+
+    Composite wComparisonComp = new Composite(wTabFolder, SWT.NONE);
+    wComparisonComp.setLayout(comparisonLayout);
+    props.setLook(wComparisonComp);
+
+    // Comparison DB + schema + table
+    DatabaseMeta compDatabaseMeta =
+        pipelineMeta.findDatabase(input.getCompareConnection(), variables);
     wCompareDB =
-        new LabelCombo(
-            shell,
+        addConnectionLine(
+            wComparisonComp,
+            null,
+            compDatabaseMeta,
+            lsMod,
             BaseMessages.getString(PKG, "TableCompareDialog.CompareDB.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.CompareDB.Tooltip"));
-    props.setLook(wCompareDB);
-    FormData fdCompareDB = new FormData();
-    fdCompareDB.left = new FormAttachment(0, 0);
-    fdCompareDB.top = new FormAttachment(lastControl, margin);
-    fdCompareDB.right = new FormAttachment(100, 0);
-    wCompareDB.setLayoutData(fdCompareDB);
+    wCompareDB.addSelectionListener(lsSelection);
     lastControl = wCompareDB;
 
     wCompareSchema =
         new LabelCombo(
-            shell,
+            wComparisonComp,
             BaseMessages.getString(PKG, "TableCompareDialog.CompareSchemaField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.CompareSchemaField.Tooltip"));
     props.setLook(wCompareSchema);
@@ -187,7 +263,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
 
     wCompareTable =
         new LabelCombo(
-            shell,
+            wComparisonComp,
             BaseMessages.getString(PKG, "TableCompareDialog.CompareTableField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.CompareTableField.Tooltip"));
     props.setLook(wCompareTable);
@@ -196,24 +272,53 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     fdCompareTable.top = new FormAttachment(lastControl, margin);
     fdCompareTable.right = new FormAttachment(100, 0);
     wCompareTable.setLayoutData(fdCompareTable);
-    lastControl = wCompareTable;
+
+    FormData fdComparisonComp = new FormData();
+    fdComparisonComp.left = new FormAttachment(0, 0);
+    fdComparisonComp.top = new FormAttachment(0, 0);
+    fdComparisonComp.right = new FormAttachment(100, 0);
+    fdComparisonComp.bottom = new FormAttachment(100, 0);
+    wComparisonComp.setLayoutData(fdComparisonComp);
+
+    wComparisonComp.layout();
+    wComparisonTab.setControl(wComparisonComp);
+
+    // ///////////////////////////////////////////////////////////
+    // / END OF COMPARISON TAB
+    // ///////////////////////////////////////////////////////////
+
+    // /////////////////////////////
+    // START OF OTHER FIELDS TAB
+    // /////////////////////////////
+
+    CTabItem wOtherFieldsTab = new CTabItem(wTabFolder, SWT.NONE);
+    wOtherFieldsTab.setText(
+        BaseMessages.getString(PKG, "TableComparisonDialog.OtherFieldsTab.TabTitle"));
+
+    FormLayout otherFieldsLayout = new FormLayout();
+    otherFieldsLayout.marginWidth = 3;
+    otherFieldsLayout.marginHeight = 3;
+
+    Composite wOtherFieldsComp = new Composite(wTabFolder, SWT.NONE);
+    props.setLook(wOtherFieldsComp);
+    wOtherFieldsComp.setLayout(otherFieldsLayout);
 
     wKeyFields =
         new LabelCombo(
-            shell,
+            wOtherFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.KeyFieldsField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.KeyFieldsField.Tooltip"));
     props.setLook(wKeyFields);
     FormData fdKeyFields = new FormData();
     fdKeyFields.left = new FormAttachment(0, 0);
-    fdKeyFields.top = new FormAttachment(lastControl, margin);
+    fdKeyFields.top = new FormAttachment(0, margin);
     fdKeyFields.right = new FormAttachment(100, 0);
     wKeyFields.setLayoutData(fdKeyFields);
     lastControl = wKeyFields;
 
     wExcludeFields =
         new LabelCombo(
-            shell,
+            wOtherFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.ExcludeFieldsField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.ExcludeFieldsField.Tooltip"));
     props.setLook(wExcludeFields);
@@ -224,17 +329,85 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     wExcludeFields.setLayoutData(fdExcludeFields);
     lastControl = wExcludeFields;
 
+    wKeyDesc =
+        new LabelCombo(
+            wOtherFieldsComp,
+            BaseMessages.getString(PKG, "TableCompareDialog.KeyDescField.Label"),
+            BaseMessages.getString(PKG, "TableCompareDialog.KeyDescField.Tooltip"));
+    props.setLook(wKeyDesc);
+    FormData fdKeyDesc = new FormData();
+    fdKeyDesc.left = new FormAttachment(0, 0);
+    fdKeyDesc.top = new FormAttachment(lastControl, margin * 3);
+    fdKeyDesc.right = new FormAttachment(100, 0);
+    wKeyDesc.setLayoutData(fdKeyDesc);
+    lastControl = wKeyDesc;
+
+    wReferenceValue =
+        new LabelCombo(
+            wOtherFieldsComp,
+            BaseMessages.getString(PKG, "TableCompareDialog.ReferenceValueField.Label"),
+            BaseMessages.getString(PKG, "TableCompareDialog.ReferenceValueField.Tooltip"));
+    props.setLook(wReferenceValue);
+    FormData fdReferenceValue = new FormData();
+    fdReferenceValue.left = new FormAttachment(0, 0);
+    fdReferenceValue.top = new FormAttachment(lastControl, margin);
+    fdReferenceValue.right = new FormAttachment(100, 0);
+    wReferenceValue.setLayoutData(fdReferenceValue);
+    lastControl = wReferenceValue;
+
+    wCompareValue =
+        new LabelCombo(
+            wOtherFieldsComp,
+            BaseMessages.getString(PKG, "TableCompareDialog.CompareValueField.Label"),
+            BaseMessages.getString(PKG, "TableCompareDialog.CompareValueField.Tooltip"));
+    props.setLook(wCompareValue);
+    FormData fdCompareValue = new FormData();
+    fdCompareValue.left = new FormAttachment(0, 0);
+    fdCompareValue.top = new FormAttachment(lastControl, margin);
+    fdCompareValue.right = new FormAttachment(100, 0);
+    wCompareValue.setLayoutData(fdCompareValue);
+
+    FormData fdOtherFieldsComp = new FormData();
+    fdOtherFieldsComp.left = new FormAttachment(0, 0);
+    fdOtherFieldsComp.top = new FormAttachment(0, 0);
+    fdOtherFieldsComp.right = new FormAttachment(100, 0);
+    fdOtherFieldsComp.bottom = new FormAttachment(100, 0);
+    wOtherFieldsComp.setLayoutData(fdOtherFieldsComp);
+
+    wOtherFieldsComp.layout();
+    wOtherFieldsTab.setControl(wOtherFieldsComp);
+
+    // ///////////////////////////////////////////////////////////
+    // / END OF OTHER FIELDS TAB
+    // ///////////////////////////////////////////////////////////
+
+    // /////////////////////////////
+    // START OF ADDITIONAL FIELDS TAB
+    // /////////////////////////////
+
+    CTabItem wAdditionalFieldsTab = new CTabItem(wTabFolder, SWT.NONE);
+    wAdditionalFieldsTab.setText(
+        BaseMessages.getString(PKG, "TableComparisonDialog.AdditionalFieldsTab.TabTitle"));
+
+    FormLayout additionalFieldsLayout = new FormLayout();
+    additionalFieldsLayout.marginWidth = 3;
+    additionalFieldsLayout.marginHeight = 3;
+
+    Composite wAdditionalFieldsComp = new Composite(wTabFolder, SWT.NONE);
+    props.setLook(wAdditionalFieldsComp);
+    wAdditionalFieldsComp.setLayout(additionalFieldsLayout);
+
     // The nr of errors field
     //
     wNrErrors =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsField.Tooltip"));
     props.setLook(wNrErrors);
     FormData fdNrErrors = new FormData();
     fdNrErrors.left = new FormAttachment(0, 0);
-    fdNrErrors.top = new FormAttachment(lastControl, margin * 3);
+    fdNrErrors.top = new FormAttachment(0, margin * 3);
     fdNrErrors.right = new FormAttachment(100, 0);
     wNrErrors.setLayoutData(fdNrErrors);
     lastControl = wNrErrors;
@@ -243,7 +416,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     //
     wNrRecordsReference =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrRecordsReferenceField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrRecordsReferenceField.Tooltip"));
     props.setLook(wNrRecordsReference);
@@ -258,7 +431,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     //
     wNrRecordsCompare =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrRecordsCompareField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrRecordsCompareField.Tooltip"));
     props.setLook(wNrRecordsCompare);
@@ -273,7 +446,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     //
     wNrErrorsLeftJoin =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsLeftJoinField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsLeftJoinField.Tooltip"));
     props.setLook(wNrErrorsLeftJoin);
@@ -288,7 +461,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     //
     wNrErrorsInnerJoin =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsInnerJoinField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsInnerJoinField.Tooltip"));
     props.setLook(wNrErrorsInnerJoin);
@@ -303,7 +476,7 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     //
     wNrErrorsRightJoin =
         new LabelText(
-            shell,
+                wAdditionalFieldsComp,
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsRightJoinField.Label"),
             BaseMessages.getString(PKG, "TableCompareDialog.NrErrorsRightJoinField.Tooltip"));
     props.setLook(wNrErrorsRightJoin);
@@ -314,59 +487,48 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     wNrErrorsRightJoin.setLayoutData(fdNrErrorsRightJoin);
     lastControl = wNrErrorsRightJoin;
 
-    wKeyDesc =
-        new LabelCombo(
-            shell,
-            BaseMessages.getString(PKG, "TableCompareDialog.KeyDescField.Label"),
-            BaseMessages.getString(PKG, "TableCompareDialog.KeyDescField.Tooltip"));
-    props.setLook(wKeyDesc);
-    FormData fdKeyDesc = new FormData();
-    fdKeyDesc.left = new FormAttachment(0, 0);
-    fdKeyDesc.top = new FormAttachment(lastControl, margin * 3);
-    fdKeyDesc.right = new FormAttachment(100, 0);
-    wKeyDesc.setLayoutData(fdKeyDesc);
-    lastControl = wKeyDesc;
-
-    wReferenceValue =
-        new LabelCombo(
-            shell,
-            BaseMessages.getString(PKG, "TableCompareDialog.ReferenceValueField.Label"),
-            BaseMessages.getString(PKG, "TableCompareDialog.ReferenceValueField.Tooltip"));
-    props.setLook(wReferenceValue);
-    FormData fdReferenceValue = new FormData();
-    fdReferenceValue.left = new FormAttachment(0, 0);
-    fdReferenceValue.top = new FormAttachment(lastControl, margin);
-    fdReferenceValue.right = new FormAttachment(100, 0);
-    wReferenceValue.setLayoutData(fdReferenceValue);
-    lastControl = wReferenceValue;
-
-    wCompareValue =
-        new LabelCombo(
-            shell,
-            BaseMessages.getString(PKG, "TableCompareDialog.CompareValueField.Label"),
-            BaseMessages.getString(PKG, "TableCompareDialog.CompareValueField.Tooltip"));
-    props.setLook(wCompareValue);
-    FormData fdCompareValue = new FormData();
-    fdCompareValue.left = new FormAttachment(0, 0);
-    fdCompareValue.top = new FormAttachment(lastControl, margin);
-    fdCompareValue.right = new FormAttachment(100, 0);
-    wCompareValue.setLayoutData(fdCompareValue);
-    lastControl = wCompareValue;
-
-    wOk = new Button(shell, SWT.PUSH);
-    wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
-    wCancel = new Button(shell, SWT.PUSH);
-    wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));
-
-    setButtonPositions(new Button[] {wOk, wCancel}, margin, lastControl);
-
-    // Add listeners
-    wCancel.addListener(SWT.Selection, e -> cancel());
-    wOk.addListener(SWT.Selection, e -> ok());
+    FormData fdAdditionalFieldsComp = new FormData();
+    fdAdditionalFieldsComp.left = new FormAttachment(0, 0);
+    fdAdditionalFieldsComp.top = new FormAttachment(0, 0);
+    fdAdditionalFieldsComp.right = new FormAttachment(100, 0);
+    fdAdditionalFieldsComp.bottom = new FormAttachment(100, 0);
+    wAdditionalFieldsComp.setLayoutData(fdAdditionalFieldsComp);
+
+    wAdditionalFieldsComp.layout();
+    wAdditionalFieldsTab.setControl(wAdditionalFieldsComp);
+
+    // ///////////////////////////////////////////////////////////
+    // / END OF ADDITIONAL FIELDS TAB
+    // ///////////////////////////////////////////////////////////
+    FormData fdTabFolder = new FormData();
+    fdTabFolder.left = new FormAttachment(0, 0);
+    fdTabFolder.top = new FormAttachment(0, 0);
+    fdTabFolder.right = new FormAttachment(100, 0);
+    fdTabFolder.bottom = new FormAttachment(100, 0);
+    wTabFolder.setLayoutData(fdTabFolder);
+
+    FormData fdSc = new FormData();
+    fdSc.left = new FormAttachment(0, 0);
+    fdSc.top = new FormAttachment(wTransformName, margin);
+    fdSc.right = new FormAttachment(100, 0);
+    fdSc.bottom = new FormAttachment(wOk, -2 * margin);
+    sc.setLayoutData(fdSc);
+
+    sc.setContent(wTabFolder);
+
+    // ///////////////////////////////////////////////////////////
+    // / END OF CONTENT TAB
+    // ///////////////////////////////////////////////////////////
+
+    wTabFolder.setSelection(0);
 
     getData();
 
     input.setChanged(changed);
+    // determine scrollable area
+    sc.setMinSize(wTabFolder.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+    sc.setExpandHorizontal(true);
+    sc.setExpandVertical(true);
 
     BaseDialog.defaultShellHandling(shell, c -> ok(), c -> cancel());
 
@@ -408,17 +570,12 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
 
   /** Copy information from the meta-data input to the dialog fields. */
   public void getData() {
-    for (DatabaseMeta dbMeta : pipelineMeta.getDatabases()) {
-      wReferenceDB.add(dbMeta.getName());
-      wCompareDB.add(dbMeta.getName());
-    }
 
     wReferenceDB.setText(
-        input.getReferenceConnection() != null ? input.getReferenceConnection().getName() : "");
+        input.getReferenceConnection() != null ? input.getReferenceConnection() : "");
     wReferenceSchema.setText(Const.NVL(input.getReferenceSchemaField(), ""));
     wReferenceTable.setText(Const.NVL(input.getReferenceTableField(), ""));
-    wCompareDB.setText(
-        input.getCompareConnection() != null ? input.getCompareConnection().getName() : "");
+    wCompareDB.setText(input.getCompareConnection() != null ? input.getCompareConnection() : "");
     wCompareSchema.setText(Const.NVL(input.getCompareSchemaField(), ""));
     wCompareTable.setText(Const.NVL(input.getCompareTableField(), ""));
     wKeyFields.setText(Const.NVL(input.getKeyFieldsField(), ""));
@@ -453,10 +610,10 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     }
     transformName = wTransformName.getText(); // return value
 
-    input.setReferenceConnection(pipelineMeta.findDatabase(wReferenceDB.getText()));
+    input.setReferenceConnection(wReferenceDB.getText());
     input.setReferenceSchemaField(wReferenceSchema.getText());
     input.setReferenceTableField(wReferenceTable.getText());
-    input.setCompareConnection(pipelineMeta.findDatabase(wCompareDB.getText()));
+    input.setCompareConnection(wCompareDB.getText());
     input.setCompareSchemaField(wCompareSchema.getText());
     input.setCompareTableField(wCompareTable.getText());
     input.setKeyFieldsField(wKeyFields.getText());
@@ -473,6 +630,32 @@ public class TableCompareDialog extends BaseTransformDialog implements ITransfor
     input.setValueReferenceField(wReferenceValue.getText());
     input.setValueCompareField(wCompareValue.getText());
 
+    DatabaseMeta refDatabaseMeta =
+        pipelineMeta.findDatabase(input.getReferenceConnection(), variables);
+    if (refDatabaseMeta == null) {
+      MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
+      mb.setMessage(
+          BaseMessages.getString(
+              PKG, "TableCompareDialog.InvalidConnection.ReferenceConnection.DialogMessage"));
+      mb.setText(
+          BaseMessages.getString(
+              PKG, "TableCompareDialog.InvalidConnection.ReferenceConnection.DialogTitle"));
+      mb.open();
+    }
+
+    DatabaseMeta compDatabaseMeta =
+        pipelineMeta.findDatabase(input.getCompareConnection(), variables);
+    if (compDatabaseMeta == null) {
+      MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
+      mb.setMessage(
+          BaseMessages.getString(
+              PKG, "TableCompareDialog.InvalidConnection.ComparisonConnection.DialogMessage"));
+      mb.setText(
+          BaseMessages.getString(
+              PKG, "TableCompareDialog.InvalidConnection.ComparisonConnection.DialogTitle"));
+      mb.open();
+    }
+
     dispose();
   }
 }
diff --git a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
index b1e63f0b0a..a8b2f184d6 100644
--- a/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
+++ b/plugins/transforms/tablecompare/src/main/java/org/apache/hop/pipeline/transforms/tablecompare/TableCompareMeta.java
@@ -30,6 +30,7 @@ import org.apache.hop.core.util.Utils;
 import org.apache.hop.core.variables.IVariables;
 import org.apache.hop.core.xml.XmlHandler;
 import org.apache.hop.i18n.BaseMessages;
+import org.apache.hop.metadata.api.HopMetadataProperty;
 import org.apache.hop.metadata.api.IHopMetadataProvider;
 import org.apache.hop.pipeline.PipelineMeta;
 import org.apache.hop.pipeline.transform.BaseTransformMeta;
@@ -48,209 +49,333 @@ import java.util.List;
 public class TableCompareMeta extends BaseTransformMeta<TableCompare, TableCompareData> {
   private static final Class<?> PKG = TableCompare.class; // For Translator
 
-  private DatabaseMeta referenceConnection;
+  @HopMetadataProperty(
+      key = "reference_connection",
+      injectionKeyDescription = "TableCompareMeta.Injection.ReferenceConnection")
+  private String referenceConnection;
+
+  @HopMetadataProperty(
+      key = "reference_schema_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.ReferenceSchemaField")
   private String referenceSchemaField;
+
+  @HopMetadataProperty(
+      key = "reference_table_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.ReferenceTableField")
   private String referenceTableField;
 
-  private DatabaseMeta compareConnection;
+  @HopMetadataProperty(
+      key = "compare_connection",
+      injectionKeyDescription = "TableCompareMeta.Injection.CompareConnection")
+  private String compareConnection;
+
+  @HopMetadataProperty(
+      key = "compare_schema_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.CompareSchemaField")
   private String compareSchemaField;
+
+  @HopMetadataProperty(
+      key = "compare_table_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.CompareTableField")
   private String compareTableField;
 
+  @HopMetadataProperty(
+      key = "key_fields_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.KeyFieldsField")
   private String keyFieldsField;
+
+  @HopMetadataProperty(
+      key = "exclude_fields_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.ExcludeFieldsField")
   private String excludeFieldsField;
 
+  @HopMetadataProperty(
+      key = "nr_errors_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrErrorsField")
   private String nrErrorsField;
+
+  @HopMetadataProperty(
+      key = "nr_records_reference_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrRecordsReferenceField")
   private String nrRecordsReferenceField;
+
+  @HopMetadataProperty(
+      key = "nr_records_compare_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrRecordsCompareField")
   private String nrRecordsCompareField;
+
+  @HopMetadataProperty(
+      key = "nr_errors_left_join_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrErrorsLeftJoinField")
   private String nrErrorsLeftJoinField;
+
+  @HopMetadataProperty(
+      key = "nr_errors_inner_join_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrErrorsInnerJoinField")
   private String nrErrorsInnerJoinField;
+
+  @HopMetadataProperty(
+      key = "nr_errors_right_join_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.NrErrorsRightJoinField")
   private String nrErrorsRightJoinField;
 
+  @HopMetadataProperty(
+      key = "key_description_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.KeyDescriptionField")
   private String keyDescriptionField;
+
+  @HopMetadataProperty(
+      key = "value_reference_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.ValueReferenceField")
   private String valueReferenceField;
+
+  @HopMetadataProperty(
+      key = "value_compare_field",
+      injectionKeyDescription = "TableCompareMeta.Injection.ValueCompareField")
   private String valueCompareField;
-  private IHopMetadataProvider metadataProvider;
 
   public TableCompareMeta() {
     super(); // allocate BaseTransformMeta
   }
 
-  /** @return the referenceSchemaField */
+  /**
+   * @return the referenceSchemaField
+   */
   public String getReferenceSchemaField() {
     return referenceSchemaField;
   }
 
-  /** @param referenceSchemaField the referenceSchemaField to set */
+  /**
+   * @param referenceSchemaField the referenceSchemaField to set
+   */
   public void setReferenceSchemaField(String referenceSchemaField) {
     this.referenceSchemaField = referenceSchemaField;
   }
 
-  /** @return the referenceTableField */
+  /**
+   * @return the referenceTableField
+   */
   public String getReferenceTableField() {
     return referenceTableField;
   }
 
-  /** @param referenceTableField the referenceTableField to set */
+  /**
+   * @param referenceTableField the referenceTableField to set
+   */
   public void setReferenceTableField(String referenceTableField) {
     this.referenceTableField = referenceTableField;
   }
 
-  /** @return the compareSchemaField */
+  /**
+   * @return the compareSchemaField
+   */
   public String getCompareSchemaField() {
     return compareSchemaField;
   }
 
-  /** @param compareSchemaField the compareSchemaField to set */
+  /**
+   * @param compareSchemaField the compareSchemaField to set
+   */
   public void setCompareSchemaField(String compareSchemaField) {
     this.compareSchemaField = compareSchemaField;
   }
 
-  /** @return the compareTableField */
+  /**
+   * @return the compareTableField
+   */
   public String getCompareTableField() {
     return compareTableField;
   }
 
-  /** @param compareTableField the compareTableField to set */
+  /**
+   * @param compareTableField the compareTableField to set
+   */
   public void setCompareTableField(String compareTableField) {
     this.compareTableField = compareTableField;
   }
 
-  /** @return the nrErrorsField */
+  /**
+   * @return the nrErrorsField
+   */
   public String getNrErrorsField() {
     return nrErrorsField;
   }
 
-  /** @param nrErrorsField the nrErrorsField to set */
+  /**
+   * @param nrErrorsField the nrErrorsField to set
+   */
   public void setNrErrorsField(String nrErrorsField) {
     this.nrErrorsField = nrErrorsField;
   }
 
-  /** @return the referenceConnection */
-  public DatabaseMeta getReferenceConnection() {
+  /**
+   * @return the referenceConnection
+   */
+  public String getReferenceConnection() {
     return referenceConnection;
   }
 
-  /** @param referenceConnection the referenceConnection to set */
-  public void setReferenceConnection(DatabaseMeta referenceConnection) {
+  /**
+   * @param referenceConnection the referenceConnection to set
+   */
+  public void setReferenceConnection(String referenceConnection) {
     this.referenceConnection = referenceConnection;
   }
 
-  /** @return the compareConnection */
-  public DatabaseMeta getCompareConnection() {
+  /**
+   * @return the compareConnection
+   */
+  public String getCompareConnection() {
     return compareConnection;
   }
 
-  /** @param compareConnection the compareConnection to set */
-  public void setCompareConnection(DatabaseMeta compareConnection) {
+  /**
+   * @param compareConnection the compareConnection to set
+   */
+  public void setCompareConnection(String compareConnection) {
     this.compareConnection = compareConnection;
   }
 
-  /** @return the keyFieldsField */
+  /**
+   * @return the keyFieldsField
+   */
   public String getKeyFieldsField() {
     return keyFieldsField;
   }
 
-  /** @param keyFieldsField the keyFieldsField to set */
+  /**
+   * @param keyFieldsField the keyFieldsField to set
+   */
   public void setKeyFieldsField(String keyFieldsField) {
     this.keyFieldsField = keyFieldsField;
   }
 
-  /** @return the excludeFieldsField */
+  /**
+   * @return the excludeFieldsField
+   */
   public String getExcludeFieldsField() {
     return excludeFieldsField;
   }
 
-  /** @param excludeFieldsField the excludeFieldsField to set */
+  /**
+   * @param excludeFieldsField the excludeFieldsField to set
+   */
   public void setExcludeFieldsField(String excludeFieldsField) {
     this.excludeFieldsField = excludeFieldsField;
   }
 
-  /** @return the nrRecordsReferenceField */
+  /**
+   * @return the nrRecordsReferenceField
+   */
   public String getNrRecordsReferenceField() {
     return nrRecordsReferenceField;
   }
 
-  /** @param nrRecordsReferenceField the nrRecordsReferenceField to set */
+  /**
+   * @param nrRecordsReferenceField the nrRecordsReferenceField to set
+   */
   public void setNrRecordsReferenceField(String nrRecordsReferenceField) {
     this.nrRecordsReferenceField = nrRecordsReferenceField;
   }
 
-  /** @return the nrRecordsCompareField */
+  /**
+   * @return the nrRecordsCompareField
+   */
   public String getNrRecordsCompareField() {
     return nrRecordsCompareField;
   }
 
-  /** @param nrRecordsCompareField the nrRecordsCompareField to set */
+  /**
+   * @param nrRecordsCompareField the nrRecordsCompareField to set
+   */
   public void setNrRecordsCompareField(String nrRecordsCompareField) {
     this.nrRecordsCompareField = nrRecordsCompareField;
   }
 
-  /** @return the nrErrorsLeftJoinField */
+  /**
+   * @return the nrErrorsLeftJoinField
+   */
   public String getNrErrorsLeftJoinField() {
     return nrErrorsLeftJoinField;
   }
 
-  /** @param nrErrorsLeftJoinField the nrErrorsLeftJoinField to set */
+  /**
+   * @param nrErrorsLeftJoinField the nrErrorsLeftJoinField to set
+   */
   public void setNrErrorsLeftJoinField(String nrErrorsLeftJoinField) {
     this.nrErrorsLeftJoinField = nrErrorsLeftJoinField;
   }
 
-  /** @return the nrErrorsInnerJoinField */
+  /**
+   * @return the nrErrorsInnerJoinField
+   */
   public String getNrErrorsInnerJoinField() {
     return nrErrorsInnerJoinField;
   }
 
-  /** @param nrErrorsInnerJoinField the nrErrorsInnerJoinField to set */
+  /**
+   * @param nrErrorsInnerJoinField the nrErrorsInnerJoinField to set
+   */
   public void setNrErrorsInnerJoinField(String nrErrorsInnerJoinField) {
     this.nrErrorsInnerJoinField = nrErrorsInnerJoinField;
   }
 
-  /** @return the nrErrorsRightJoinField */
+  /**
+   * @return the nrErrorsRightJoinField
+   */
   public String getNrErrorsRightJoinField() {
     return nrErrorsRightJoinField;
   }
 
-  /** @param nrErrorsRightJoinField the nrErrorsRightJoinField to set */
+  /**
+   * @param nrErrorsRightJoinField the nrErrorsRightJoinField to set
+   */
   public void setNrErrorsRightJoinField(String nrErrorsRightJoinField) {
     this.nrErrorsRightJoinField = nrErrorsRightJoinField;
   }
 
-  /** @return the keyDescriptionField */
+  /**
+   * @return the keyDescriptionField
+   */
   public String getKeyDescriptionField() {
     return keyDescriptionField;
   }
 
-  /** @param keyDescriptionField the keyDescriptionField to set */
+  /**
+   * @param keyDescriptionField the keyDescriptionField to set
+   */
   public void setKeyDescriptionField(String keyDescriptionField) {
     this.keyDescriptionField = keyDescriptionField;
   }
 
-  /** @return the valueReferenceField */
+  /**
+   * @return the valueReferenceField
+   */
   public String getValueReferenceField() {
     return valueReferenceField;
   }
 
-  /** @param valueReferenceField the valueReferenceField to set */
+  /**
+   * @param valueReferenceField the valueReferenceField to set
+   */
   public void setValueReferenceField(String valueReferenceField) {
     this.valueReferenceField = valueReferenceField;
   }
 
-  /** @return the valueCompareField */
+  /**
+   * @return the valueCompareField
+   */
   public String getValueCompareField() {
     return valueCompareField;
   }
 
-  /** @param valueCompareField the valueCompareField to set */
+  /**
+   * @param valueCompareField the valueCompareField to set
+   */
   public void setValueCompareField(String valueCompareField) {
     this.valueCompareField = valueCompareField;
   }
 
-  @Override
-  public void loadXml(Node transformNode, IHopMetadataProvider metadataProvider)
-      throws HopXmlException {
-    readData(transformNode, metadataProvider);
-  }
-
   @Override
   public Object clone() {
     TableCompareMeta retval = (TableCompareMeta) super.clone();
@@ -329,106 +454,6 @@ public class TableCompareMeta extends BaseTransformMeta<TableCompare, TableCompa
     inputRowMeta.addValueMeta(nrErrorsRight);
   }
 
-  private void readData(Node transformNode, IHopMetadataProvider metadataProvider)
-      throws HopXmlException {
-    this.metadataProvider = metadataProvider;
-    try {
-      referenceConnection =
-          DatabaseMeta.loadDatabase(
-              metadataProvider, XmlHandler.getTagValue(transformNode, "reference_connection"));
-      referenceSchemaField = XmlHandler.getTagValue(transformNode, "reference_schema_field");
-      referenceTableField = XmlHandler.getTagValue(transformNode, "reference_table_field");
-
-      compareConnection =
-          DatabaseMeta.loadDatabase(
-              metadataProvider, XmlHandler.getTagValue(transformNode, "compare_connection"));
-      compareSchemaField = XmlHandler.getTagValue(transformNode, "compare_schema_field");
-      compareTableField = XmlHandler.getTagValue(transformNode, "compare_table_field");
-
-      keyFieldsField = XmlHandler.getTagValue(transformNode, "key_fields_field");
-      excludeFieldsField = XmlHandler.getTagValue(transformNode, "exclude_fields_field");
-      nrErrorsField = XmlHandler.getTagValue(transformNode, "nr_errors_field");
-
-      nrRecordsReferenceField = XmlHandler.getTagValue(transformNode, "nr_records_reference_field");
-      nrRecordsCompareField = XmlHandler.getTagValue(transformNode, "nr_records_compare_field");
-      nrErrorsLeftJoinField = XmlHandler.getTagValue(transformNode, "nr_errors_left_join_field");
-      nrErrorsInnerJoinField = XmlHandler.getTagValue(transformNode, "nr_errors_inner_join_field");
-      nrErrorsRightJoinField = XmlHandler.getTagValue(transformNode, "nr_errors_right_join_field");
-
-      keyDescriptionField = XmlHandler.getTagValue(transformNode, "key_description_field");
-      valueReferenceField = XmlHandler.getTagValue(transformNode, "value_reference_field");
-      valueCompareField = XmlHandler.getTagValue(transformNode, "value_compare_field");
-
-    } catch (Exception e) {
-      throw new HopXmlException("It was not possibke to load the Trim metadata from XML", e);
-    }
-  }
-
-  @Override
-  public String getXml() {
-    StringBuilder retval = new StringBuilder();
-
-    retval
-        .append("      ")
-        .append(
-            XmlHandler.addTagValue(
-                "reference_connection",
-                referenceConnection == null ? null : referenceConnection.getName()));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("reference_schema_field", referenceSchemaField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("reference_table_field", referenceTableField));
-
-    retval
-        .append("      ")
-        .append(
-            XmlHandler.addTagValue(
-                "compare_connection",
-                compareConnection == null ? null : compareConnection.getName()));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("compare_schema_field", compareSchemaField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("compare_table_field", compareTableField));
-
-    retval.append("      ").append(XmlHandler.addTagValue("key_fields_field", keyFieldsField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("exclude_fields_field", excludeFieldsField));
-    retval.append("      ").append(XmlHandler.addTagValue("nr_errors_field", nrErrorsField));
-
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("nr_records_reference_field", nrRecordsReferenceField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("nr_records_compare_field", nrRecordsCompareField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("nr_errors_left_join_field", nrErrorsLeftJoinField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("nr_errors_inner_join_field", nrErrorsInnerJoinField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("nr_errors_right_join_field", nrErrorsRightJoinField));
-
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("key_description_field", keyDescriptionField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("value_reference_field", valueReferenceField));
-    retval
-        .append("      ")
-        .append(XmlHandler.addTagValue("value_compare_field", valueCompareField));
-
-    return retval.toString();
-  }
-
   @Override
   public void setDefault() {
     nrErrorsField = "nrErrors";
diff --git a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
index 8e0e244ece..23b40f51b0 100644
--- a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
+++ b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_en_US.properties
@@ -17,9 +17,12 @@
 BaseTransform.TypeLongDesc.TableCompare=Table compare
 BaseTransform.TypeTooltipDesc.TableCompare=Compares 2 tables and gives back a list of differences
 TableCompareDialog.CompareDB.Label=Compare connection
-TableCompare.Error.MissingRowFoundInCompareData=Missing row detected in compare table ''{0}'' with key ''{1}''
 TableCompare.Exception.KeyFieldsNotSpecified=The field to use as input for the key fields was not specified
 TableCompareDialog.ReferenceValueField.Label=Error handling reference value input field
+
+TableCompare.RefConnection.ConnectionMissing=Reference database connection is missing for transform [{0}]
+TableCompare.CompConnection.ConnectionMissing=Compare database connection is missing for transform [{0}]
+
 TableCompare.Exception.UnexpectedErrorConnectingToCompareDatabase=Unable to connect to compare database connection ''{0}''
 TableCompare.Exception.ValueCompareFieldNotSpecified=The field to use as output in the error handling for the compare value description was not specified.
 TableCompare.Exception.NoKeyFieldsDefined=No key fields defined comparing tables ''{0}'' and ''{1}''
@@ -50,9 +53,9 @@ TableCompare.Exception.ExcludeFieldsNotSpecified=The field to use as input for t
 TableCompareMeta.Exception.NrErrorsRightJoinFieldNotSpecified=The name of the result field for the number of right join errors is not specified.
 TableCompareDialog.ReferenceSchemaField.Tooltip=Select the field to get the reference schema values from
 TableCompareDialog.ReferenceTableField.Label=Reference table field
+TableCompareDialog.ReferenceDB.Label=Reference connection
 TableCompare.Exception.CompareTableNotSpecified=The field to use as input for the compare table was not specified
 TableCompareDialog.ReferenceDB.Tooltip=Select the reference database connection to use
-TableCompareDialog.ReferenceDB.Label=Reference connection
 TableCompareDialog.NrErrorsRightJoinField.Tooltip=Specify the name of the field that will contain the number of records that are only present in the compare table.
 TableCompareMeta.Exception.NrRecordsReferenceFieldNotSpecified=The name of the result field for the number of records in the reference table is not specified.
 TableCompare.Error.KeyFieldWasNotFoundInReferenceTable=Key ''{0}'' was not found in reference table ''{1}''
@@ -60,7 +63,6 @@ TableCompare.Exception.CompareSchemaNotSpecified=The field to use as input for t
 TableCompareDialog.CompareValueField.Tooltip=The name of the field that will be used by the error handling of this transform to describe the compare value that caused an error.
 TableCompareDialog.CompareTableField.Tooltip=Select the field to get the compare table values from
 TableCompare.Exception.ReferenceSchemaNotSpecified=The field to use as input for the reference schema was not specified
-TableCompare.Error.ExtraRowFoundInCompareData=Extra row found in compare table ''{0}'' with key ''{1}'' 
 TableCompare.Exception.CanNotFindField=Field ''{0}'' is used but can''t be found.
 TableCompareDialog.NrErrorsRightJoinField.Label=Number of right join errors field
 TableCompareDialog.ReferenceValueField.Tooltip=The name of the field that will be used by the error handling of this transform to describe the reference value that caused an error.
@@ -88,3 +90,31 @@ TableCompareDialog.NrErrorsField.Label=Number of errors field
 TableCompare.Error.RecordNotInReferenceFoundInCompareTable=Record found in compare table ''{0}'' was not found in reference table for key ''{1}'' 
 TableCompareDialog.CompareSchemaField.Tooltip=Select the field to get the compare schema values from
 TableCompareMeta.keyword=table,compare
+
+TableComparisonDialog.ReferenceTab.TabTitle=Reference data
+TableComparisonDialog.ComparisonTab.TabTitle=Comparison data 
+TableComparisonDialog.OtherFieldsTab.TabTitle=Other Fields
+TableComparisonDialog.AdditionalFieldsTab.TabTitle=Additional Fields
+
+TableCompareDialog.InvalidConnection.ReferenceConnection.DialogMessage=Please select a valid connection for ReferenceDatabase\!
+TableCompareDialog.InvalidConnection.ReferenceConnection.DialogTitle=ERROR
+TableCompareDialog.InvalidConnection.ComparisonConnection.DialogMessage=Please select a valid connection for ComparisonDatabase\!
+TableCompareDialog.InvalidConnection.ComparisonConnection.DialogTitle=ERROR
+
+TableCompareMeta.Injection.ReferenceConnection=Reference connection
+TableCompareMeta.Injection.ReferenceSchemaField=Reference schema field
+TableCompareMeta.Injection.ReferenceTableField=Reference table field
+TableCompareMeta.Injection.CompareConnection=Comparison connection
+TableCompareMeta.Injection.CompareSchemaField=Comparison schema field
+TableCompareMeta.Injection.CompareTableField=Compare table field
+TableCompareMeta.Injection.KeyFieldsField=Key fields field
+TableCompareMeta.Injection.ExcludeFieldsField=Exclude fields field
+TableCompareMeta.Injection.NrErrorsField=Number of errors field
+TableCompareMeta.Injection.NrRecordsReferenceField=Number of reference table records field
+TableCompareMeta.Injection.NrRecordsCompareField=Number of compare table records field
+TableCompareMeta.Injection.NrErrorsLeftJoinField=Number of left join errors field
+TableCompareMeta.Injection.NrErrorsInnerJoinField=Number of inner join errors field
+TableCompareMeta.Injection.NrErrorsRightJoinField=Number of right join errors field
+TableCompareMeta.Injection.KeyDescriptionField=Error handling key description input field
+TableCompareMeta.Injection.ValueReferenceField=Error handling reference value input field
+TableCompareMeta.Injection.ValueCompareField=Error handling compare value input field
\ No newline at end of file
diff --git a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_fr_FR.properties b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_fr_FR.properties
index d8d34e2dd3..18fec4dbc4 100644
--- a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_fr_FR.properties
+++ b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_fr_FR.properties
@@ -50,7 +50,6 @@ TableCompareDialog.NrErrorsRightJoinField.Tooltip=Nom du champ contenant le nomb
 TableCompare.Exception.UnexpectedErrorComparingTables=An unexpected error occurred during table compare
 TableCompare.Error.NumberOfFieldsIsDifferent=The number of fields in reference table ''{0}'' is different ({1}) from the number of fields in compare table ''{2}'' ({3})
 TableCompareDialog.CompareDB.Label=R\u00E9f\u00E9rence de comparaison
-TableCompare.Error.ExtraRowFoundInCompareData=Extra row found in compare table ''{0}'' with key ''{1}'' 
 TableCompare.Exception.CanNotFindField=Le champ ''{0}'' est utilis\u00E9 mai est introuvable dans le flux d''entr\u00E9e\!
 TableCompareDialog.NrRecordsReferenceField.Tooltip=Nom du champ contenant le nombre d''enregistrements de la table de r\u00E9f\u00E9rence.\nCe champ sera ajout\u00E9 au flux d''entr\u00E9e (entier).
 TableCompareMeta.Exception.NrRecordsCompareFieldNotSpecified=The name of the result field for the number of number of records in the compare table is not specified.
@@ -71,7 +70,6 @@ TableCompareDialog.ReferenceDB.Label=Connexion de r\u00E9f\u00E9rence
 TableCompare.Error.RecordInReferenceNotFoundInCompareTable=Record in reference table ''{0}'' was not found in compare table with key ''{1}''
 TableCompareDialog.ReferenceValueField.Tooltip=Le nom du champ dont la valeur sera utilis\u00E9e par la gestion d''erreur\nafin de d\u00E9crire la ligne de r\u00E9f\u00E9rence source d''une erreur.
 TableCompare.Exception.NoKeyFieldsDefined=No key fields defined comparing tables ''{0}'' and ''{1}''
-TableCompare.Error.MissingRowFoundInCompareData=Missing row detected in compare table ''{0}'' with key ''{1}''
 TableCompareDialog.NrRecordsCompareField.Label=Champ nombre d''enregistrements comparaison
 TableCompareMeta.Exception.NrErrorsFieldIsNotSpecified=The name of the result field for the number of compare errors is not specified. 
 TableCompare.Exception.NoReferenceTableDefined=No reference table defined for compare operation, skipping row.
diff --git a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_it_IT.properties b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_it_IT.properties
index 3cb4ea82ae..7deb07cd62 100644
--- a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_it_IT.properties
+++ b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_it_IT.properties
@@ -19,70 +19,102 @@
 #
 TableCompareDialog.CompareDB.Label=Connessione di comparazione
 TableCompare.Exception.KeyFieldsNotSpecified=Il campo da utilizzare come input per i campi chiave non \u00E8 stato specificato.
-TableCompareDialog.ReferenceValueField.Label=Campo di input per il valore di riferimento della gestione errore
+TableCompareDialog.ReferenceValueField.Label=Input per il valore di riferimento della gestione errore
 TableCompare.Exception.UnexpectedErrorConnectingToCompareDatabase=Impossibile connettersi alla connessione di comparazione database ''{0}''
-TableCompare.Exception.ValueCompareFieldNotSpecified=Il campo da utilizzare come output nella gestione errore per la descrizione del valore di comparazione non \u00E8 stato specificato.
+TableCompare.Exception.ValueCompareFieldNotSpecified=Il campo da utilizzare come output nella gestione errore per la descrizione del valore di confronto non \u00E8 stato specificato.
 TableCompare.Exception.NoKeyFieldsDefined=Nessun campo chiave definito nelle tabelle di comparazione ''{0}'' e ''{1}''
 TableCompare.Exception.KeyDescriptionFieldNotSpecified=Il campo da utilizzare come output nella gestione errori per la descrizione chiave non \u00E8 stato specificato.
-TableCompareDialog.KeyFieldsField.Label=Campo con i campi chiave
-TableCompareDialog.KeyDescField.Label=Campo di input con la descrizione della chiave di gestione errore
-IfNullMeta.CheckResult.TransformRecevingData=Questo passo sta ricevendo {0} campi dagli altri passi\!
-TableCompareDialog.NrErrorsLeftJoinField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record che sono presenti solo nella tabella di riferimento.
-TableCompareDialog.KeyDescField.Tooltip=Il nome del campo che verr\u00E0 utilizzato dalla gestione errore di questo passo per descrivere la chiave/i in cui si \u00E8 verificato l''errore.
+
+TableComparisonDialog.ReferenceTab.TabTitle=Dati di riferimento
+TableComparisonDialog.ComparisonTab.TabTitle=Dati di confronto
+TableComparisonDialog.OtherFieldsTab.TabTitle=Altri campi
+TableComparisonDialog.AdditionalFieldsTab.TabTitle=Campi aggiuntivi
+
+TableCompare.RefConnection.ConnectionMissing=Reference database connection non definita per il transform [{0}]
+TableCompare.CompConnection.ConnectionMissing=Compare database connection non definita per il transform [{0}]
+
+TableCompareDialog.KeyFieldsField.Label=Insieme dei campi chiave
+TableCompareDialog.KeyDescField.Label=Descrizione della chiave di gestione errore
+IfNullMeta.CheckResult.TransformRecevingData=Questo transform sta ricevendo {0} campi dagli altri transforms\!
+TableCompareDialog.NrErrorsLeftJoinField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record che sono presenti solo nella tabella di reference.
+TableCompareDialog.KeyDescField.Tooltip=Il nome del campo che verr\u00E0 utilizzato dalla gestione errore di questo transform per descrivere la chiave/i in cui si \u00E8 verificato l''errore.
 TableCompareDialog.DoMapping.UnableToFindInput=Errore nel prelevare i campi dal flusso in ingresso\!
 TableCompareMeta.Exception.NrErrorsLeftJoinFieldNotSpecified=Il nome del campo risultato per il numero di left join non \u00E8 stato specificato.
 TableCompare.Error.RecordInReferenceNotFoundInCompareTable=Il record nella tabella di riferimento ''{0}'' non \u00E8 stato trovato nella tabella di comparazione con chiave ''{1}''
 TableCompareDialog.KeyFieldsField.Tooltip=Selezionare il campo che contiene i campi chiave (separati da virgola)
 TableCompareDialog.NrRecordsCompareField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record nella tabella di riferimento.
-IfNullMeta.CheckResult.TransformRecevingData2=Questo passo sta ricevendo dati dagli altri passi
+IfNullMeta.CheckResult.TransformRecevingData2=Questo transform sta ricevendo dati dagli altri transforms
 TableCompare.Exception.ReferenceTableNotSpecified=Il campo da utilizzare come input per la tabella di riferimento non \u00E8 stato specificato.
-TableCompareDialog.NrRecordsReferenceField.Label=Campo col numero di recordo della tabella di riferimento
+TableCompareDialog.NrRecordsReferenceField.Label=Numero di records nella tabella di riferimento
 TableCompareDialog.NrErrorsInnerJoinField.Tooltip=Specificare qua il nome del campo che conterr\u00E0 il numero di record che mostra la differenza tra i record comuni
 TableCompare.Error.NumberOfFieldsIsDifferent=Il numero di campi nella tabella di riferimento ''{0}'' \u00E8 diverso ({1}) dal numero di campi nella tabella di comparazione ''{2}'' ({3})
-TableCompare.Error.CompareRowIsDifferentFromReference=Trovata differenza di campo tra i dati di riferimento e di comparazione.
-TableCompare.Exception.NoCompareTableDefined=Nessuna tabella di comparazione definita per l''operazione di comparazione, la riga viene saltata.
-TableCompareDialog.CompareValueField.Label=Campo input con il valore di comparazione della gestione errori
-IfNullMeta.CheckResult.NoInputReceivedFromOtherTransforms=Nessun input ricevuto dagli altri passi\!
-TableCompareDialog.NrErrorsInnerJoinField.Label=Campo con il numero di errori di inner join
-TableCompareDialog.CompareSchemaField.Label=Campo con lo schema di comparazione
+TableCompare.Error.CompareRowIsDifferentFromReference=Trovata una differenza fra i dati contenuti nel campo riferimento rispetto al campo di confronto.
+TableCompare.Exception.NoCompareTableDefined=Nessuna tabella di confronto definita per l''operazione di confronto, la riga viene saltata.
+TableCompareDialog.CompareValueField.Label=Valore di confronto della gestione errori
+IfNullMeta.CheckResult.NoInputReceivedFromOtherTransforms=Nessun input ricevuto dagli altri transforms\!
+TableCompareDialog.NrErrorsInnerJoinField.Label=Numero di errori di inner join
+TableCompareDialog.CompareSchemaField.Label=Schema di confronto
 TableCompareDialog.NrRecordsReferenceField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record nella tabella di riferimento
 TableCompare.Exception.ExcludeFieldsNotSpecified=Il campo da utilizzare come input per i campi esclusi non \u00E8 stato specificato.
 TableCompareMeta.Exception.NrErrorsRightJoinFieldNotSpecified=Il nome del campo risultato per il numero di right join non \u00E8 stato specificato.
-TableCompareDialog.ReferenceSchemaField.Tooltip=Selezionare il campo da cui prelevare i valori delle schema di riferimento
-TableCompareDialog.ReferenceTableField.Label=Campo tabella di riferimento
-TableCompareDialog.ReferenceDB.Tooltip=Selezionare la connessione database di riferimento da utilizzare
-TableCompare.Exception.CompareTableNotSpecified=Il campo da utilizzare come input per la tabella di comparazione non \u00E8 stato specificato.
+TableCompareDialog.ReferenceSchemaField.Tooltip=Selezionare il campo da cui prelevare i valori dello schema di riferimento
+TableCompareDialog.ReferenceTableField.Label=Tabella di riferimento
+TableCompareDialog.ReferenceDB.Tooltip=Selezionare la connessione al database da utilizzare contenente la tabella di riferimento 
+TableCompare.Exception.CompareTableNotSpecified=Il campo da utilizzare come input per la tabella di confronto non \u00E8 stato specificato.
 TableCompareDialog.ReferenceDB.Label=Connessione di riferimento
-TableCompareDialog.NrErrorsRightJoinField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record che sono presenti solo nella tabella di comparazione.
+TableCompareDialog.NrErrorsRightJoinField.Tooltip=Specificare il nome del campo che conterr\u00E0 il numero di record che sono presenti solo nella tabella di confronto.
 TableCompareMeta.Exception.NrRecordsReferenceFieldNotSpecified=Il nome del campo risultato per il numero di record nella tabella di riferimento non \u00E8 stato specificato.
 TableCompare.Error.KeyFieldWasNotFoundInReferenceTable=La chiave ''{0}'' non \u00E8 stata trovata nella tabella di riferimento ''{1}'' 
-TableCompare.Exception.CompareSchemaNotSpecified=Il campo da utilizzare come input per lo schema di comparazione non \u00E8 stato specificato.
-TableCompareDialog.CompareValueField.Tooltip=Il nome del campo che verr\u00E0 utilizzato dalla gestione errore di questo passo per descrivere il valore di comparazione che ha causato l'errore.
-TableCompareDialog.CompareTableField.Tooltip=Selezionare il campo da cui prelevare i valori di comparazione tabella
+TableCompare.Exception.CompareSchemaNotSpecified=Il campo da utilizzare come input per lo schema di confronto non \u00E8 stato specificato.
+TableCompareDialog.CompareValueField.Tooltip=Il nome del campo che verr\u00E0 utilizzato dalla gestione errore di questo transform per descrivere il valore di confronto che ha causato l'errore.
+TableCompareDialog.CompareTableField.Tooltip=Selezionare il campo da cui prelevare i valori di confronto tabella
 TableCompare.Exception.ReferenceSchemaNotSpecified=Il campo da utilizzare come input per lo schema di riferimento non \u00E8 stato specificato.
-TableCompareDialog.NrErrorsRightJoinField.Label=Campo con il numero di errori di right join
-TableCompareDialog.ReferenceValueField.Tooltip=Il nome del campo che verr\u00E0 usato dalla gestione errore di questo passo per descrivere il valore di riferimento che ha causato un errore.
+TableCompareDialog.NrErrorsRightJoinField.Label=Numero di errori di right join
+TableCompareDialog.ReferenceValueField.Tooltip=Il nome del campo che verr\u00E0 usato dalla gestione errore di questo transform per descrivere il valore di riferimento che ha causato un errore.
 TableCompare.Exception.CanNotFindField=Il campo ''{0}'' \u00E8 utilizzato ma non pu\u00F2 essere trovato.
 TableCompareDialog.ReferenceTableField.Tooltip=Selezionare il campo da cui prelevare i valori della tabella di riferimento
-TableCompare.Exception.UnexpectedErrorComparingTables=Errore inatteso durante la comparazione delle tabelle
-TableCompareDialog.TransformName.Label=Nome del passo
-TableCompareDialog.Shell.Title=Tabella comparazione
-TableCompareDialog.ReferenceSchemaField.Label=Campo con lo schema di riferimento
-TableCompareDialog.CompareDB.Tooltip=Selezionare la connessione di comparazione da utilizzare
-TableCompareDialog.CompareTableField.Label=Campo comparazione tabella
-TableCompare.Error.KeyFieldWasNotFoundInCompareTable=La chiave ''{0}'' non \u00E8 stata trovata nella tabella di comparazione ''{1}'' 
-TableCompareMeta.Exception.NrRecordsCompareFieldNotSpecified=Il nome del campo risultato per il numero di record nella tabella di comparazione non \u00E8 stato specificato.
-TableCompareDialog.NrErrorsLeftJoinField.Label=Campo con il numero di errori di left join
-TableCompare.Exception.UnexpectedErrorConnectingToReferenceDatabase=Impossibile connettersi alla connessione per il database di riferimento ''{0}''
-IfNullMeta.CheckResult.NotReceivingFields=Questo passo non sta ricevendo campi dagli altri passi\!
-TableCompareMeta.Exception.NrErrorsFieldIsNotSpecified=Il nome del campo risultato per il numero di comparazione non \u00E8 stato specificato.
-TableCompareDialog.NrRecordsCompareField.Label=Campo con il numero dei recordo di comparazione tabella
+TableCompare.Exception.UnexpectedErrorComparingTables=Errore inatteso durante il confronto delle tabelle
+TableCompareDialog.TransformName.Label=Nome del transform
+TableCompareDialog.Shell.Title=Table comparison
+TableCompareDialog.ReferenceSchemaField.Label=Schema di riferimento
+TableCompareDialog.CompareDB.Tooltip=Selezionare la connessione al database la tabella di confronto da utilizzare
+TableCompareDialog.CompareTableField.Label=Tabella di confronto
+TableCompare.Error.KeyFieldWasNotFoundInCompareTable=La chiave ''{0}'' non \u00E8 stata trovata nella tabella di confronto ''{1}'' 
+TableCompareMeta.Exception.NrRecordsCompareFieldNotSpecified=Il nome del campo risultato per il numero di record nella tabella di confronto non \u00E8 stato specificato.
+TableCompareDialog.NrErrorsLeftJoinField.Label=Numero di errori di left join
+TableCompare.Exception.UnexpectedErrorConnectingToReferenceDatabase=Impossibile connettersi al database contenente la tabella di riferimento ''{0}''
+IfNullMeta.CheckResult.NotReceivingFields=Questo transform non sta ricevendo campi dagli altri transforms\!
+TableCompareMeta.Exception.NrErrorsFieldIsNotSpecified=Il nome del campo risultato per il numero di confronto non \u00E8 stato specificato.
+TableCompareDialog.NrRecordsCompareField.Label=Numero dei records di confronto tabella
 TableCompareDialog.NrErrorsField.Tooltip=Specificare il nome del campo risultato che conterr\u00E0 il numero di errori per ogni coppia di tabelle con cui \u00E8 stato comparato.
 TableCompareMeta.Exception.NrErrorsInnerJoinFieldNotSpecified=Il nome del campo risultato per il numero di inner join non \u00E8 stato specificato.
-TableCompareDialog.ExcludeFieldsField.Label=Campo di esclusione campi
-TableCompare.Exception.NoReferenceTableDefined=Nessuna tabella di riferimento definita per l''operazione di comparazione, la riga viene saltata.
-TableCompareDialog.ExcludeFieldsField.Tooltip=Selezionare il campo che contiene i campi da escludere (separato da virgola)
+TableCompareDialog.ExcludeFieldsField.Label=Insieme dei campi da escludere
+TableCompare.Exception.NoReferenceTableDefined=Nessuna tabella di riferimento definita per l''operazione di confronto, la riga viene saltata.
+TableCompareDialog.ExcludeFieldsField.Tooltip=Selezionare il campo che contiene i campi da escludere (insieme di campi separati da virgola)
 TableCompare.Exception.ValueReferenceFieldNotSpecified=Il campo da utilizzare come output nella gestione errore per la descrizione del valore di riferimento non \u00E8 stato specificato.
-TableCompareDialog.NrErrorsField.Label=Campo col numero di errori
-TableCompare.Error.RecordNotInReferenceFoundInCompareTable=Il record trovato nella tabella di comparazione  ''{0}'' non \u00E8 stato trovato nella tabella di riferimento per la chiave ''{1}''
-TableCompareDialog.CompareSchemaField.Tooltip=Selezionare il campo da cui prelevare i valori dello schema di comparazione
+TableCompareDialog.NrErrorsField.Label=Numero di errori
+TableCompare.Error.RecordNotInReferenceFoundInCompareTable=Il record trovato nella tabella di confronto ''{0}'' non \u00E8 stato trovato nella tabella di riferimento per la chiave ''{1}''
+TableCompareDialog.CompareSchemaField.Tooltip=Selezionare il campo da cui prelevare i valori dello schema di confronto
+
+TableCompareDialog.InvalidConnection.ReferenceConnection.DialogMessage=Please select a valid connection for ReferenceDatabase\!
+TableCompareDialog.InvalidConnection.ReferenceConnection.DialogTitle=ERROR
+TableCompareDialog.InvalidConnection.ComparisonConnection.DialogMessage=Please select a valid connection for ComparisonDatabase\!
+TableCompareDialog.InvalidConnection.ComparisonConnection.DialogTitle=ERROR
+
+TableCompareMeta.Injection.ReferenceConnection=Reference connection
+TableCompareMeta.Injection.ReferenceSchemaField=Reference schema field
+TableCompareMeta.Injection.ReferenceTableField=Reference table field
+TableCompareMeta.Injection.CompareConnection=Comparison connection
+TableCompareMeta.Injection.CompareSchemaField=Comparison schema field
+TableCompareMeta.Injection.CompareTableField=Compare table field
+TableCompareMeta.Injection.KeyFieldsField=Key fields field
+TableCompareMeta.Injection.ExcludeFieldsField=Exclude fields field
+TableCompareMeta.Injection.NrErrorsField=Number of errors field
+TableCompareMeta.Injection.NrRecordsReferenceField=Number of reference table records field
+TableCompareMeta.Injection.NrRecordsCompareField=Number of compare table records field
+TableCompareMeta.Injection.NrErrorsLeftJoinField=Number of left join errors field
+TableCompareMeta.Injection.NrErrorsInnerJoinField=Number of inner join errors field
+TableCompareMeta.Injection.NrErrorsRightJoinField=Number of right join errors field
+TableCompareMeta.Injection.KeyDescriptionField=Error handling key description input field
+TableCompareMeta.Injection.ValueReferenceField=Error handling reference value input field
+TableCompareMeta.Injection.ValueCompareField=Error handling compare value input field
\ No newline at end of file
diff --git a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_ja_JP.properties b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_ja_JP.properties
index 5877164f4d..a18913d90c 100644
--- a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_ja_JP.properties
+++ b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_ja_JP.properties
@@ -20,7 +20,6 @@
 BaseTransform.TypeLongDesc.TableCompare=\u30C6\u30FC\u30D6\u30EB\u6BD4\u8F03
 BaseTransform.TypeTooltipDesc.TableCompare=Table Compare\n\uFF12\u3064\u306E\u30C6\u30FC\u30D6\u30EB\u3092\u6BD4\u8F03\u3057\u3001\u5DEE\u3092\u30EA\u30B9\u30C8\u3067\u51FA\u529B\u3057\u307E\u3059\u3002
 TableCompareDialog.CompareDB.Label=\u6bd4\u8f03\u63a5\u7d9a
-TableCompare.Error.MissingRowFoundInCompareData=Missing row detected in compare table ''{0}'' with key ''{1}''
 TableCompare.Exception.KeyFieldsNotSpecified=The field to use as input for the key fields was not specified
 TableCompareDialog.ReferenceValueField.Label=\u53c2\u7167\u5024\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u30d5\u30a3\u30fc\u30eb\u30c9
 TableCompare.Exception.UnexpectedErrorConnectingToCompareDatabase=Unable to connect to compare database connection ''{0}''
@@ -63,7 +62,6 @@ TableCompare.Exception.CompareSchemaNotSpecified=The field to use as input for t
 TableCompareDialog.CompareValueField.Tooltip=\u30a8\u30e9\u30fc\u51e6\u7406\u6642\u306b\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u306a\u3063\u305f\u6bd4\u8f03\u5024\u306e\u8aac\u660e\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u3067\u3059\u3002
 TableCompareDialog.CompareTableField.Tooltip=\u6bd4\u8f03\u30c6\u30fc\u30d6\u30eb\u540d\u3092\u53d6\u5f97\u3059\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
 TableCompare.Exception.ReferenceSchemaNotSpecified=The field to use as input for the reference schema was not specified
-TableCompare.Error.ExtraRowFoundInCompareData=Extra row found in compare table ''{0}'' with key ''{1}'' 
 TableCompare.Exception.CanNotFindField=Field ''{0}'' is used but can''t be found.
 TableCompareDialog.NrErrorsRightJoinField.Label=right join\u30a8\u30e9\u30fc\u6570\u30d5\u30a3\u30fc\u30eb\u30c9
 TableCompareDialog.ReferenceValueField.Tooltip=\u30a8\u30e9\u30fc\u51e6\u7406\u6642\u306b\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u306a\u3063\u305f\u53c2\u7167\u5024\u306e\u8aac\u660e\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u3067\u3059\u3002
diff --git a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_zh_CN.properties b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_zh_CN.properties
index 7d2c25b735..2d81c7a20c 100644
--- a/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_zh_CN.properties
+++ b/plugins/transforms/tablecompare/src/main/resources/org/apache/hop/pipeline/transforms/tablecompare/messages/messages_zh_CN.properties
@@ -23,10 +23,8 @@ IfNullMeta.CheckResult.NotReceivingFields=This transform is not receiving fields
 IfNullMeta.CheckResult.TransformRecevingData=This transform is receiving {0} fields from other transforms\!
 IfNullMeta.CheckResult.TransformRecevingData2=This transform is receiving data from other transforms
 TableCompare.Error.CompareRowIsDifferentFromReference=Field difference found between reference and compare data.
-TableCompare.Error.ExtraRowFoundInCompareData=Extra row found in compare table "{0}" with key "{1}" 
 TableCompare.Error.KeyFieldWasNotFoundInCompareTable=Key "{0}" was not found in compare table "{1}"
 TableCompare.Error.KeyFieldWasNotFoundInReferenceTable=Key "{0}" was not found in reference table "{1}"
-TableCompare.Error.MissingRowFoundInCompareData=Missing row detected in compare table "{0}" with key "{1}"
 TableCompare.Error.NumberOfFieldsIsDifferent=The number of fields in reference table "{0}" is different ({1}) from the number of fields in compare table "{2}" ({3})
 TableCompare.Error.RecordInReferenceNotFoundInCompareTable=Record in reference table "{0}" was not found in compare table with key "{1}"
 TableCompare.Error.RecordNotInReferenceFoundInCompareTable=Record found in compare table "{0}" was not found in reference table for key "{1}" 
diff --git a/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java b/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java
index 5f5b6ba280..c17dff1046 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java
@@ -363,7 +363,7 @@ public class MetaSelectionLine<T extends IHopMetadata> extends Composite {
     if (previous != null) {
       fdConnection.top = new FormAttachment(previous, props.getMargin());
     } else {
-      fdConnection.top = new FormAttachment(0, 0);
+      fdConnection.top = new FormAttachment(0, props.getMargin());
     }
     setLayoutData(fdConnection);
   }
diff --git a/ui/src/main/java/org/apache/hop/ui/pipeline/transform/BaseTransformDialog.java b/ui/src/main/java/org/apache/hop/ui/pipeline/transform/BaseTransformDialog.java
index 0d8e085315..1d585d4920 100644
--- a/ui/src/main/java/org/apache/hop/ui/pipeline/transform/BaseTransformDialog.java
+++ b/ui/src/main/java/org/apache/hop/ui/pipeline/transform/BaseTransformDialog.java
@@ -161,7 +161,7 @@ public class BaseTransformDialog extends Dialog {
   public BaseTransformDialog(
       Shell parent,
       IVariables variables,
-      BaseTransformMeta<?,?> baseTransformMeta,
+      BaseTransformMeta<?, ?> baseTransformMeta,
       PipelineMeta pipelineMeta,
       String transformName) {
     super(parent, SWT.NONE);
@@ -212,7 +212,7 @@ public class BaseTransformDialog extends Dialog {
    * @param tr the pipeline metadata
    */
   public BaseTransformDialog(
-      Shell parent, int nr, IVariables variables, BaseTransformMeta<?,?> in, PipelineMeta tr) {
+      Shell parent, int nr, IVariables variables, BaseTransformMeta<?, ?> in, PipelineMeta tr) {
     this(parent, variables, in, tr, null);
   }
 
@@ -557,6 +557,37 @@ public class BaseTransformDialog extends Dialog {
   public MetaSelectionLine<DatabaseMeta> addConnectionLine(
       Composite parent, Control previous, DatabaseMeta selected, ModifyListener lsMod) {
 
+    return addConnectionLine(
+        parent,
+        previous,
+        selected,
+        lsMod,
+        BaseMessages.getString(PKG, "BaseTransformDialog.Connection.Label"),
+        BaseMessages.getString(PKG, "BaseTransformDialog.Connection.Tooltip"));
+  }
+
+  public MetaSelectionLine<DatabaseMeta> addConnectionLine(
+      Composite parent,
+      Control previous,
+      DatabaseMeta selected,
+      ModifyListener lsMod,
+      String connectionLabel) {
+    return addConnectionLine(
+        parent,
+        previous,
+        selected,
+        lsMod,
+        connectionLabel,
+        BaseMessages.getString(PKG, "BaseTransformDialog.Connection.Tooltip"));
+  }
+
+  public MetaSelectionLine<DatabaseMeta> addConnectionLine(
+      Composite parent,
+      Control previous,
+      DatabaseMeta selected,
+      ModifyListener lsMod,
+      String connectionLabel,
+      String connectionTooltip) {
     final MetaSelectionLine<DatabaseMeta> wConnection =
         new MetaSelectionLine<>(
             variables,
@@ -564,8 +595,8 @@ public class BaseTransformDialog extends Dialog {
             DatabaseMeta.class,
             parent,
             SWT.NONE,
-            BaseMessages.getString(PKG, "BaseTransformDialog.Connection.Label"),
-            BaseMessages.getString(PKG, "BaseTransformDialog.Connection.Tooltip"));
+            connectionLabel,
+            connectionTooltip);
     wConnection.addToConnectionLine(parent, previous, selected, lsMod);
     return wConnection;
   }