diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp
index db29c53d98..54feb6c161 100644
--- a/common/eda_shape.cpp
+++ b/common/eda_shape.cpp
@@ -1556,6 +1556,105 @@ std::vector<VECTOR2I> EDA_SHAPE::GetRectCorners() const
 }
 
 
+std::vector<VECTOR2I> EDA_SHAPE::GetCornersInSequence() const
+{
+    std::vector<VECTOR2I> pts;
+    EDA_ANGLE             textAngle( getDrawRotation() );
+
+    textAngle.Normalize();
+
+    BOX2I bbox = getBoundingBox();
+    bbox.Normalize();
+
+    if( textAngle.IsCardinal() )
+    {
+        if( textAngle == ANGLE_0 )
+        {
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
+        }
+        else if( textAngle == ANGLE_90 )
+        {
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
+        }
+        else if( textAngle == ANGLE_180 )
+        {
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
+        }
+        else if( textAngle == ANGLE_270 )
+        {
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
+            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
+        }
+    }
+    else
+    {
+        std::vector<VECTOR2I> corners = GetRectCorners();
+
+        VECTOR2I minX = corners[0];
+        VECTOR2I maxX = corners[0];
+        VECTOR2I minY = corners[0];
+        VECTOR2I maxY = corners[0];
+
+        for( const VECTOR2I& corner : corners )
+        {
+            if( corner.x < minX.x )
+                minX = corner;
+
+            if( corner.x > maxX.x )
+                maxX = corner;
+
+            if( corner.y < minY.y )
+                minY = corner;
+
+            if( corner.y > maxY.y )
+                maxY = corner;
+        }
+
+        if( textAngle < ANGLE_90 )
+        {
+            pts.emplace_back( minX );
+            pts.emplace_back( minY );
+            pts.emplace_back( maxX );
+            pts.emplace_back( maxY );
+        }
+        else if( textAngle < ANGLE_180 )
+        {
+            pts.emplace_back( maxY );
+            pts.emplace_back( minX );
+            pts.emplace_back( minY );
+            pts.emplace_back( maxX );
+        }
+        else if( textAngle < ANGLE_270 )
+        {
+            pts.emplace_back( maxX );
+            pts.emplace_back( maxY );
+            pts.emplace_back( minX );
+            pts.emplace_back( minY );
+        }
+        else
+        {
+            pts.emplace_back( minY );
+            pts.emplace_back( maxX );
+            pts.emplace_back( maxY );
+            pts.emplace_back( minX );
+        }
+    }
+
+    return pts;
+}
+
+
 void EDA_SHAPE::computeArcBBox( BOX2I& aBBox ) const
 {
     // Start, end, and each inflection point the arc crosses will enclose the entire arc.
diff --git a/eeschema/dialogs/dialog_table_properties.cpp b/eeschema/dialogs/dialog_table_properties.cpp
index c3cb1f4df5..8a4f9cb06c 100644
--- a/eeschema/dialogs/dialog_table_properties.cpp
+++ b/eeschema/dialogs/dialog_table_properties.cpp
@@ -280,15 +280,16 @@ void DIALOG_TABLE_PROPERTIES::getContextualTextVars( const wxString& aCrossRef,
 void DIALOG_TABLE_PROPERTIES::onBorderChecked( wxCommandEvent& aEvent )
 {
     bool border = m_borderCheckbox->GetValue();
+    bool headerSeparator = m_headerBorder->GetValue();
 
-    if( border && m_borderWidth.GetValue() < 0 )
+    if( ( border || headerSeparator ) && m_borderWidth.GetValue() < 0 )
         m_borderWidth.SetValue( m_frame->eeconfig()->m_Drawing.default_line_thickness );
 
-    m_borderWidth.Enable( border );
-    m_borderColorLabel->Enable( border );
-    m_borderColorSwatch->Enable( border );
-    m_borderStyleLabel->Enable( border );
-    m_borderStyleCombo->Enable( border );
+    m_borderWidth.Enable( border || headerSeparator );
+    m_borderColorLabel->Enable( border || headerSeparator );
+    m_borderColorSwatch->Enable( border || headerSeparator );
+    m_borderStyleLabel->Enable( border || headerSeparator );
+    m_borderStyleCombo->Enable( border || headerSeparator );
 
     bool row = m_rowSeparators->GetValue();
     bool col = m_colSeparators->GetValue();
@@ -348,7 +349,7 @@ bool DIALOG_TABLE_PROPERTIES::TransferDataFromWindow()
     {
         STROKE_PARAMS stroke = m_table->GetBorderStroke();
 
-        if( m_borderCheckbox->GetValue() )
+        if( m_borderCheckbox->GetValue() || m_headerBorder->GetValue() )
             stroke.SetWidth( std::max( 0, m_borderWidth.GetIntValue() ) );
         else
             stroke.SetWidth( -1 );
diff --git a/eeschema/sch_painter.cpp b/eeschema/sch_painter.cpp
index 34ac3a1a1d..08c800a7ff 100644
--- a/eeschema/sch_painter.cpp
+++ b/eeschema/sch_painter.cpp
@@ -2098,19 +2098,12 @@ void SCH_PAINTER::draw( const SCH_TABLE* aTable, int aLayer, bool aDimmed )
     if( aLayer == LAYER_SELECTION_SHADOWS )
         return;
 
-    VECTOR2I pos = aTable->GetPosition();
-    VECTOR2I end = aTable->GetEnd();
-
-    int        lineWidth;
-    COLOR4D    color;
-    LINE_STYLE lineStyle;
-
-    auto setupStroke =
-            [&]( const STROKE_PARAMS& stroke )
+    aTable->DrawBorders(
+            [&]( const VECTOR2I& ptA, const VECTOR2I& ptB, const STROKE_PARAMS& stroke )
             {
-                lineWidth = stroke.GetWidth();
-                color = stroke.GetColor();
-                lineStyle = stroke.GetLineStyle();
+                int        lineWidth = stroke.GetWidth();
+                COLOR4D    color = stroke.GetColor();
+                LINE_STYLE lineStyle = stroke.GetLineStyle();
 
                 if( lineWidth == 0 )
                     lineWidth = m_schSettings.GetDefaultPenWidth();
@@ -2125,25 +2118,7 @@ void SCH_PAINTER::draw( const SCH_TABLE* aTable, int aLayer, bool aDimmed )
                 m_gal->SetIsStroke( true );
                 m_gal->SetStrokeColor( color );
                 m_gal->SetLineWidth( (float) lineWidth );
-            };
 
-    auto strokeShape =
-            [&]( const SHAPE& shape )
-            {
-                STROKE_PARAMS::Stroke( &shape, lineStyle, lineWidth, &m_schSettings,
-                        [&]( const VECTOR2I& a, const VECTOR2I& b )
-                        {
-                            // DrawLine has problem with 0 length lines so enforce minimum
-                            if( a == b )
-                                m_gal->DrawLine( a+1, b );
-                            else
-                                m_gal->DrawLine( a, b );
-                        } );
-            };
-
-    auto strokeLine =
-            [&]( const VECTOR2I& ptA, const VECTOR2I& ptB )
-            {
                 if( lineStyle <= LINE_STYLE::FIRST_TYPE )
                 {
                     m_gal->DrawLine( ptA, ptB );
@@ -2151,92 +2126,17 @@ void SCH_PAINTER::draw( const SCH_TABLE* aTable, int aLayer, bool aDimmed )
                 else
                 {
                     SHAPE_SEGMENT seg( ptA, ptB );
-                    strokeShape( seg );
+                    STROKE_PARAMS::Stroke( &seg, lineStyle, lineWidth, &m_schSettings,
+                            [&]( const VECTOR2I& a, const VECTOR2I& b )
+                            {
+                                // DrawLine has problem with 0 length lines so enforce minimum
+                                if( a == b )
+                                    m_gal->DrawLine( a+1, b );
+                                else
+                                    m_gal->DrawLine( a, b );
+                            } );
                 }
-            };
-
-    auto strokeRect =
-            [&]( const VECTOR2I& ptA, const VECTOR2I& ptB )
-            {
-                if( lineStyle <= LINE_STYLE::FIRST_TYPE )
-                {
-                    m_gal->DrawRectangle( ptA, ptB );
-                }
-                else
-                {
-                    SHAPE_RECT rect( BOX2I( ptA, ptB - ptA ) );
-                    strokeShape( rect );
-                }
-            };
-
-    if( aTable->GetSeparatorsStroke().GetWidth() >= 0 )
-    {
-        setupStroke( aTable->GetSeparatorsStroke() );
-
-        if( aTable->StrokeColumns() )
-        {
-            for( int col = 0; col < aTable->GetColCount() - 1; ++col )
-            {
-                for( int row = 0; row < aTable->GetRowCount(); ++row )
-                {
-                    SCH_TABLECELL* cell = aTable->GetCell( row, col );
-                    VECTOR2I       topRight( cell->GetEndX(), cell->GetStartY() );
-
-                    if( !cell->GetTextAngle().IsHorizontal() )
-                        topRight = VECTOR2I( cell->GetStartX(), cell->GetEndY() );
-
-                    if( cell->GetColSpan() > 0 && cell->GetRowSpan() > 0 )
-                        strokeLine( topRight, cell->GetEnd() );
-                }
-            }
-        }
-
-        if( aTable->StrokeRows() )
-        {
-            for( int row = 0; row < aTable->GetRowCount() - 1; ++row )
-            {
-                for( int col = 0; col < aTable->GetColCount(); ++col )
-                {
-                    SCH_TABLECELL* cell = aTable->GetCell( row, col );
-                    VECTOR2I       botLeft( cell->GetStartX(), cell->GetEndY() );
-
-                    if( !cell->GetTextAngle().IsHorizontal() )
-                        botLeft = VECTOR2I( cell->GetEndX(), cell->GetStartY() );
-
-                    if( cell->GetColSpan() > 0 && cell->GetRowSpan() > 0 )
-                        strokeLine( botLeft, cell->GetEnd() );
-                }
-            }
-        }
-    }
-
-    if( aTable->GetBorderStroke().GetWidth() >= 0 )
-    {
-        SCH_TABLECELL* first = aTable->GetCell( 0, 0 );
-
-        setupStroke( aTable->GetBorderStroke() );
-
-        if( aTable->StrokeHeaderSeparator() )
-        {
-            if( !first->GetTextAngle().IsHorizontal() )
-                strokeLine( VECTOR2I( first->GetEndX(), pos.y ),
-                            VECTOR2I( first->GetEndX(), first->GetEndY() ) );
-            else
-                strokeLine( VECTOR2I( pos.x, first->GetEndY() ),
-                            VECTOR2I( end.x, first->GetEndY() ) );
-        }
-
-        if( aTable->StrokeExternal() )
-        {
-            if( !first->GetTextAngle().IsHorizontal() )
-            {
-                RotatePoint( pos, aTable->GetPosition(), ANGLE_90 );
-                RotatePoint( end, aTable->GetPosition(), ANGLE_90 );
-            }
-
-            strokeRect( pos, end );
-        }
-    }
+            } );
 }
 
 
diff --git a/eeschema/sch_table.cpp b/eeschema/sch_table.cpp
index 2914f49845..041a5b2f0e 100644
--- a/eeschema/sch_table.cpp
+++ b/eeschema/sch_table.cpp
@@ -329,6 +329,75 @@ bool SCH_TABLE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) co
 }
 
 
+void SCH_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1, const VECTOR2I& aPt2,
+                                                       const STROKE_PARAMS& aStroke )>& aCallback ) const
+{
+    std::vector<VECTOR2I> topLeft     = GetCell( 0, 0 )->GetCornersInSequence();
+    std::vector<VECTOR2I> bottomLeft  = GetCell( GetRowCount() - 1, 0 )->GetCornersInSequence();
+    std::vector<VECTOR2I> topRight    = GetCell( 0, GetColCount() - 1 )->GetCornersInSequence();
+    std::vector<VECTOR2I> bottomRight = GetCell( GetRowCount() - 1, GetColCount() - 1 )->GetCornersInSequence();
+    STROKE_PARAMS         stroke;
+
+    for( int col = 0; col < GetColCount() - 1; ++col )
+    {
+        if( StrokeColumns() )
+            stroke = GetSeparatorsStroke();
+        else
+            continue;
+
+        for( int row = 0; row < GetRowCount(); ++row )
+        {
+            SCH_TABLECELL* cell = GetCell( row, col );
+
+            if( cell->GetColSpan() == 0 )
+                continue;
+
+            if( col + cell->GetColSpan() == GetColCount() )
+                continue;
+
+            std::vector<VECTOR2I> corners = cell->GetCornersInSequence();
+
+            if( corners.size() == 4 )
+                aCallback( corners[1], corners[2], stroke );
+        }
+    }
+
+    for( int row = 0; row < GetRowCount() - 1; ++row )
+    {
+        if( row == 0 && StrokeHeaderSeparator() )
+            stroke = GetBorderStroke();
+        else if( StrokeRows() )
+            stroke = GetSeparatorsStroke();
+        else
+            continue;
+
+        for( int col = 0; col < GetColCount(); ++col )
+        {
+            SCH_TABLECELL* cell = GetCell( row, col );
+
+            if( cell->GetRowSpan() == 0 )
+                continue;
+
+            if( row + cell->GetRowSpan() == GetRowCount() )
+                continue;
+
+            std::vector<VECTOR2I> corners = cell->GetCornersInSequence();
+
+            if( corners.size() == 4 )
+                aCallback( corners[2], corners[3], stroke );
+        }
+    }
+
+    if( StrokeExternal() && GetBorderStroke().GetWidth() >= 0 )
+    {
+        aCallback( topLeft[0], topRight[1], GetBorderStroke() );
+        aCallback( topRight[1], bottomRight[2], GetBorderStroke() );
+        aCallback( bottomRight[2], bottomLeft[3], GetBorderStroke() );
+        aCallback( bottomLeft[3], topLeft[0], GetBorderStroke() );
+    }
+}
+
+
 void SCH_TABLE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
                       int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
 {
@@ -339,18 +408,13 @@ void SCH_TABLE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS&
         return;
 
     RENDER_SETTINGS* settings = aPlotter->RenderSettings();
-    VECTOR2I         pos = GetPosition();
-    VECTOR2I         end = GetEnd();
-    int              lineWidth;
-    COLOR4D          color;
-    LINE_STYLE       lineStyle;
 
-    auto setupStroke =
-            [&]( const STROKE_PARAMS& stroke )
+    DrawBorders(
+            [&]( const VECTOR2I& ptA, const VECTOR2I& ptB, const STROKE_PARAMS& stroke )
             {
-                lineWidth = stroke.GetWidth();
-                color = stroke.GetColor();
-                lineStyle = stroke.GetLineStyle();
+                int        lineWidth = stroke.GetWidth();
+                COLOR4D    color = stroke.GetColor();
+                LINE_STYLE lineStyle = stroke.GetLineStyle();
 
                 if( lineWidth == 0 )
                 {
@@ -371,82 +435,10 @@ void SCH_TABLE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS&
 
                 aPlotter->SetColor( color );
                 aPlotter->SetDash( lineWidth, lineStyle );
-            };
 
-    if( GetSeparatorsStroke().GetWidth() >= 0 )
-    {
-        setupStroke( GetSeparatorsStroke() );
-
-        if( StrokeColumns() )
-        {
-            for( int col = 0; col < GetColCount() - 1; ++col )
-            {
-                for( int row = 0; row < GetRowCount(); ++row )
-                {
-                    SCH_TABLECELL* cell = GetCell( row, col );
-                    VECTOR2I       topRight( cell->GetEndX(), cell->GetStartY() );
-
-                    if( !cell->GetTextAngle().IsHorizontal() )
-                        topRight = VECTOR2I( cell->GetStartX(), cell->GetEndY() );
-
-                    if( cell->GetColSpan() > 0 && cell->GetRowSpan() > 0 )
-                    {
-                        aPlotter->MoveTo( topRight );
-                        aPlotter->FinishTo( VECTOR2I( cell->GetEndX(), cell->GetEndY() ) );
-                    }
-                }
-            }
-        }
-
-        if( StrokeRows() )
-        {
-            for( int row = 0; row < GetRowCount() - 1; ++row )
-            {
-                for( int col = 0; col < GetColCount(); ++col )
-                {
-                    SCH_TABLECELL* cell = GetCell( row, col );
-                    VECTOR2I       botLeft( cell->GetStartX(), cell->GetEndY() );
-
-                    if( !cell->GetTextAngle().IsHorizontal() )
-                        botLeft = VECTOR2I( cell->GetEndX(), cell->GetStartY() );
-
-                    if( cell->GetColSpan() > 0 && cell->GetRowSpan() > 0 )
-                    {
-                        aPlotter->MoveTo( botLeft );
-                        aPlotter->FinishTo( VECTOR2I( cell->GetEndX(), cell->GetEndY() ) );
-                    }
-                }
-            }
-        }
-    }
-
-    if( GetBorderStroke().GetWidth() >= 0 )
-    {
-        setupStroke( GetBorderStroke() );
-        SCH_TABLECELL* cell = GetCell( 0, 0 );
-
-        if( StrokeHeaderSeparator() )
-        {
-            if( !cell->GetTextAngle().IsHorizontal() )
-            {
-                aPlotter->MoveTo( VECTOR2I( cell->GetEndX(), pos.y ) );
-                aPlotter->FinishTo( VECTOR2I( cell->GetEndX(), cell->GetEndY() ) );
-            }
-            else
-            {
-                aPlotter->MoveTo( VECTOR2I( pos.x, cell->GetEndY() ) );
-                aPlotter->FinishTo( VECTOR2I( end.x, cell->GetEndY() ) );
-            }
-         }
-
-        if( StrokeExternal() )
-        {
-            RotatePoint( pos, GetPosition(), cell->GetTextAngle() );
-            RotatePoint( end, GetPosition(), cell->GetTextAngle() );
-
-            aPlotter->Rect( pos, end, FILL_T::NO_FILL, lineWidth );
-        }
-    }
+                aPlotter->MoveTo( ptA );
+                aPlotter->FinishTo( ptB );
+            } );
 }
 
 
diff --git a/eeschema/sch_table.h b/eeschema/sch_table.h
index 48f593cd9a..f80430d201 100644
--- a/eeschema/sch_table.h
+++ b/eeschema/sch_table.h
@@ -218,6 +218,9 @@ public:
 
     bool HitTest( const BOX2I& aRect, bool aContained, int aAccuracy = 0 ) const override;
 
+    void DrawBorders( const std::function<void( const VECTOR2I& aPt1, const VECTOR2I& aPt2,
+                                                const STROKE_PARAMS& aStroke )>& aCallback ) const;
+
     void Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
                int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed ) override;
 
diff --git a/include/eda_shape.h b/include/eda_shape.h
index bde6716dff..709eae0c62 100644
--- a/include/eda_shape.h
+++ b/include/eda_shape.h
@@ -285,6 +285,7 @@ public:
 
     VECTOR2I              GetArcMid() const;
     std::vector<VECTOR2I> GetRectCorners() const;
+    std::vector<VECTOR2I> GetCornersInSequence() const;
 
     /**
      * Calc arc start and end angles such that aStartAngle < aEndAngle.  Each may be between
@@ -440,6 +441,8 @@ protected:
     void flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
     void scale( double aScale );
 
+    virtual EDA_ANGLE getDrawRotation() const { return ANGLE_0; }
+
     const BOX2I getBoundingBox() const;
 
     void computeArcBBox( BOX2I& aBBox ) const;
diff --git a/pcbnew/pcb_table.cpp b/pcbnew/pcb_table.cpp
index 4b789b4bd4..7ddbda392c 100644
--- a/pcbnew/pcb_table.cpp
+++ b/pcbnew/pcb_table.cpp
@@ -236,8 +236,7 @@ const BOX2I PCB_TABLE::GetBoundingBox() const
 }
 
 
-void PCB_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1,
-                                                       const VECTOR2I& aPt2,
+void PCB_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1, const VECTOR2I& aPt2,
                                                        const STROKE_PARAMS& aStroke )>& aCallback ) const
 {
     std::vector<VECTOR2I> topLeft     = GetCell( 0, 0 )->GetCornersInSequence();
@@ -260,6 +259,9 @@ void PCB_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1,
             if( cell->GetColSpan() == 0 )
                 continue;
 
+            if( col + cell->GetColSpan() == GetColCount() )
+                continue;
+
             std::vector<VECTOR2I> corners = cell->GetCornersInSequence();
 
             if( corners.size() == 4 )
@@ -283,6 +285,9 @@ void PCB_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1,
             if( cell->GetRowSpan() == 0 )
                 continue;
 
+            if( row + cell->GetRowSpan() == GetRowCount() )
+                continue;
+
             std::vector<VECTOR2I> corners = cell->GetCornersInSequence();
 
             if( corners.size() == 4 )
diff --git a/pcbnew/pcb_table.h b/pcbnew/pcb_table.h
index e822bc5c2e..34c6cefdaa 100644
--- a/pcbnew/pcb_table.h
+++ b/pcbnew/pcb_table.h
@@ -204,8 +204,7 @@ public:
 
     const BOX2I GetBoundingBox() const override;
 
-    void DrawBorders( const std::function<void( const VECTOR2I& aPt1,
-                                                const VECTOR2I& aPt2,
+    void DrawBorders( const std::function<void( const VECTOR2I& aPt1, const VECTOR2I& aPt2,
                                                 const STROKE_PARAMS& aStroke )>& aCallback ) const;
 
     // @copydoc BOARD_ITEM::GetEffectiveShape
diff --git a/pcbnew/pcb_textbox.cpp b/pcbnew/pcb_textbox.cpp
index 9f1c4b842a..7d7a10bdb2 100644
--- a/pcbnew/pcb_textbox.cpp
+++ b/pcbnew/pcb_textbox.cpp
@@ -257,105 +257,6 @@ void PCB_TEXTBOX::SetTextAngle( const EDA_ANGLE& aAngle )
 }
 
 
-std::vector<VECTOR2I> PCB_TEXTBOX::GetCornersInSequence() const
-{
-    std::vector<VECTOR2I> pts;
-    EDA_ANGLE             textAngle( GetDrawRotation() );
-
-    textAngle.Normalize();
-
-    BOX2I bbox = PCB_SHAPE::GetBoundingBox();
-    bbox.Normalize();
-
-    if( textAngle.IsCardinal() )
-    {
-        if( textAngle == ANGLE_0 )
-        {
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
-        }
-        else if( textAngle == ANGLE_90 )
-        {
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
-        }
-        else if( textAngle == ANGLE_180 )
-        {
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
-        }
-        else if( textAngle == ANGLE_270 )
-        {
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetTop() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetRight(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetBottom() ) );
-            pts.emplace_back( VECTOR2I( bbox.GetLeft(), bbox.GetTop() ) );
-        }
-    }
-    else
-    {
-        std::vector<VECTOR2I> corners = GetCorners();
-
-        VECTOR2I minX = corners[0];
-        VECTOR2I maxX = corners[0];
-        VECTOR2I minY = corners[0];
-        VECTOR2I maxY = corners[0];
-
-        for( const VECTOR2I& corner : corners )
-        {
-            if( corner.x < minX.x )
-                minX = corner;
-
-            if( corner.x > maxX.x )
-                maxX = corner;
-
-            if( corner.y < minY.y )
-                minY = corner;
-
-            if( corner.y > maxY.y )
-                maxY = corner;
-        }
-
-        if( textAngle < ANGLE_90 )
-        {
-            pts.emplace_back( minX );
-            pts.emplace_back( minY );
-            pts.emplace_back( maxX );
-            pts.emplace_back( maxY );
-        }
-        else if( textAngle < ANGLE_180 )
-        {
-            pts.emplace_back( maxY );
-            pts.emplace_back( minX );
-            pts.emplace_back( minY );
-            pts.emplace_back( maxX );
-        }
-        else if( textAngle < ANGLE_270 )
-        {
-            pts.emplace_back( maxX );
-            pts.emplace_back( maxY );
-            pts.emplace_back( minX );
-            pts.emplace_back( minY );
-        }
-        else
-        {
-            pts.emplace_back( minY );
-            pts.emplace_back( maxX );
-            pts.emplace_back( maxY );
-            pts.emplace_back( minX );
-        }
-    }
-
-    return pts;
-}
-
-
 VECTOR2I PCB_TEXTBOX::GetDrawPos() const
 {
     return GetDrawPos( false );
diff --git a/pcbnew/pcb_textbox.h b/pcbnew/pcb_textbox.h
index 5785c70ddc..6c0dc596e9 100644
--- a/pcbnew/pcb_textbox.h
+++ b/pcbnew/pcb_textbox.h
@@ -98,8 +98,6 @@ public:
 
     bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
 
-    std::vector<VECTOR2I> GetCornersInSequence() const;
-
     void Move( const VECTOR2I& aMoveVector ) override;
 
     void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override;
@@ -164,12 +162,15 @@ public:
     bool operator==( const BOARD_ITEM& aBoardItem ) const override;
 
 protected:
-    bool m_borderEnabled; ///< Controls drawing the border (as defined by the stroke members)
+    EDA_ANGLE getDrawRotation() const override { return GetDrawRotation(); }
 
     virtual void swapData( BOARD_ITEM* aImage ) override;
 
     const KIFONT::METRICS& getFontMetrics() const override { return GetFontMetrics(); }
 
+protected:
+    bool m_borderEnabled; ///< Controls drawing the border (as defined by the stroke members)
+
 private:
     int  m_marginLeft;
     int  m_marginTop;