diff --git a/src/Mod/TechDraw/Gui/QGCustomText.cpp b/src/Mod/TechDraw/Gui/QGCustomText.cpp
index ff64f747514f..e07f776d0346 100644
--- a/src/Mod/TechDraw/Gui/QGCustomText.cpp
+++ b/src/Mod/TechDraw/Gui/QGCustomText.cpp
@@ -218,6 +218,28 @@ QPointF QGCustomText::tightBoundingAdjust() const
     return QPointF(tight.x()-original.x(), tight.y()-original.y());
 }
 
+// TODO: when setting position, it doesn't take into account the tight bounding rect
+// Meaning top left corner has distance to pos(0, 0)
+// Here is a sketch for a fix
+// Note that the position adjustment will have to carried out every time the font changes
+// void QGCustomText::setPos(const QPointF &pos) {
+//     if(tightBounding) {
+//         QGraphicsTextItem::setPos(pos.x() - tightBoundingAdjust().x(), pos.y() - tightBoundingAdjust().y());
+//         return;
+//     }
+//     QGraphicsTextItem::setPos(pos);
+// }
+
+// void QGCustomText::setPos(qreal x, qreal y) {
+//     setPos(QPointF(x, y));
+// }
+
+// QPointF QGCustomText::pos() const
+// {
+//     // Native Qt pos function doesn't take into account the tight bounding rect
+//     return boundingRect().topLeft();
+// }
+
 QColor QGCustomText::getNormalColor()    //preference!
 {
     return PreferencesGui::normalQColor();
diff --git a/src/Mod/TechDraw/Gui/QGCustomText.h b/src/Mod/TechDraw/Gui/QGCustomText.h
index 47951086a649..5840bf64507a 100644
--- a/src/Mod/TechDraw/Gui/QGCustomText.h
+++ b/src/Mod/TechDraw/Gui/QGCustomText.h
@@ -52,6 +52,9 @@ class TechDrawGuiExport QGCustomText : public QGraphicsTextItem
     QRectF boundingRect() const override;
     QRectF tightBoundingRect() const;
     QPointF tightBoundingAdjust() const;
+    // void setPos(const QPointF &pos);
+    // void setPos(qreal x, qreal y);
+    // QPointF pos() const;
 
     void setHighlighted(bool state);
     virtual void setPrettyNormal();
diff --git a/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp b/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp
index 9d467132bf64..f4e2ebec89a0 100644
--- a/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp
+++ b/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp
@@ -66,8 +66,6 @@ using DGU = DrawGuiUtil;
 
 QGIBalloonLabel::QGIBalloonLabel()
 {
-    posX = 0;
-    posY = 0;
     m_ctrl = false;
     m_drag = false;
 
@@ -78,6 +76,7 @@ QGIBalloonLabel::QGIBalloonLabel()
     setAcceptHoverEvents(true);
 
     m_labelText = new QGCustomText();
+    m_labelText->setTightBounding(true);
     m_labelText->setParentItem(this);
 
     verticalSep = false;
@@ -99,7 +98,6 @@ QVariant QGIBalloonLabel::itemChange(GraphicsItemChange change, const QVariant&
         update();
     }
     else if (change == ItemPositionHasChanged && scene()) {
-        setLabelCenter();
         if (m_drag) {
             Q_EMIT dragging(m_ctrl);
         }
@@ -195,20 +193,13 @@ void QGIBalloonLabel::paint(QPainter* painter, const QStyleOptionGraphicsItem* o
 void QGIBalloonLabel::setPosFromCenter(const double& xCenter, const double& yCenter)
 {
     //set label's Qt position(top, left) given boundingRect center point
-    setPos(xCenter - m_labelText->boundingRect().width() / 2.,
-           yCenter - m_labelText->boundingRect().height() / 2.);
-}
-
-void QGIBalloonLabel::setLabelCenter()
-{
-    //save label's bRect center (posX, posY) given Qt position (top, left)
-    posX = x() + m_labelText->boundingRect().width() / 2.;
-    posY = y() + m_labelText->boundingRect().height() / 2.;
+    setPos(xCenter - m_labelText->boundingRect().center().x(),
+           yCenter - m_labelText->boundingRect().center().y());
 }
 
 Base::Vector3d QGIBalloonLabel::getLabelCenter() const
 {
-    return Base::Vector3d(posX, posY, 0.0);
+    return Base::Vector3d(getCenterX(), getCenterY(), 0.0);
 }
 
 void QGIBalloonLabel::setFont(QFont font) { m_labelText->setFont(font); }
@@ -504,8 +495,8 @@ void QGIViewBalloon::balloonLabelDragFinished()
     scale = balloonParent->getScale();
 
     //set feature position (x, y) from graphic position
-    double x = Rez::appX(balloonLabel->X() / scale);
-    double y = Rez::appX(balloonLabel->Y() / scale);
+    double x = Rez::appX(balloonLabel->getCenterX() / scale);
+    double y = Rez::appX(balloonLabel->getCenterY() / scale);
     Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Drag Balloon"));
     Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.%s.X = %f",
                             dvb->getNameInDocument(), x);
@@ -1002,8 +993,8 @@ void QGIViewBalloon::getBalloonPoints(TechDraw::DrawViewBalloon* balloon, DrawVi
         arrowTipPosInParent = DGU::toGuiPoint(refObj, originApp);
     }
     else {
-        x =  balloonLabel->X();
-        y = -balloonLabel->Y();     // invert from Qt scene units to R2 mm
+        x =  balloonLabel->getCenterX();
+        y = -balloonLabel->getCenterY();     // invert from Qt scene units to R2 mm
         if (m_originDragged) {
             // moving the whole bubble object. do not adjust origin point.
             arrowTipPosInParent = arrowPosInDrag();
diff --git a/src/Mod/TechDraw/Gui/QGIViewBalloon.h b/src/Mod/TechDraw/Gui/QGIViewBalloon.h
index be657bb80426..671b6e7df4f8 100644
--- a/src/Mod/TechDraw/Gui/QGIViewBalloon.h
+++ b/src/Mod/TechDraw/Gui/QGIViewBalloon.h
@@ -80,14 +80,15 @@ class QGIBalloonLabel: public QGraphicsObject
     void setLabelCenter();
     Base::Vector3d getLabelCenter() const;
     void setPosFromCenter(const double& xCenter, const double& yCenter);
-    double X() const
+
+    double getCenterX() const
     {
-        return posX;
+        return mapToParent(m_labelText->boundingRect().center()).x();
     }
-    double Y() const
+    double getCenterY() const
     {
-        return posY;
-    }//minus posY?
+        return mapToParent(m_labelText->boundingRect().center()).y();
+    }
 
     void setFont(QFont font);
     QFont getFont()
@@ -114,6 +115,7 @@ class QGIBalloonLabel: public QGraphicsObject
 
     void setDimText(QGCustomText* newText)
     {
+        newText->setTightBounding(true);
         m_labelText = newText;
     }
     bool getVerticalSep() const
@@ -132,6 +134,7 @@ class QGIBalloonLabel: public QGraphicsObject
     {
         seps = newSeps;
     }
+    QGCustomText* m_labelText;
 
 Q_SIGNALS:
     void dragging(bool state);
@@ -153,11 +156,8 @@ class QGIBalloonLabel: public QGraphicsObject
     bool verticalSep;
     std::vector<int> seps;
 
-    QGCustomText* m_labelText;
     QColor m_colNormal;
 
-    double posX;
-    double posY;
     bool m_ctrl;
     bool m_drag;
 };