diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
index 10d0730..86fac25 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java
@@ -1281,7 +1281,6 @@
 public int getTabHeight(){
 	checkWidget();
 	if (fixedTabHeight != SWT.DEFAULT) return fixedTabHeight;
-	runUpdate(UPDATE_TAB_HEIGHT);
 	return tabHeight - 1; // -1 for line drawn across top of tab //TODO: replace w/ computeTrim of tab area?
 }
 /**
@@ -2697,7 +2696,7 @@
 	// Redraw request alone would only redraw the cached image with old font.
 	renderer.chevronFont = null; // renderer will pickup and adjust(!) the new font automatically
 	updateChevronImage(true);
-	updateFolder(REDRAW | UPDATE_TAB_HEIGHT);
+	updateFolder(REDRAW);
 }
 @Override
 public void setForeground (Color color) {
@@ -3885,30 +3884,6 @@
 	getDisplay().asyncExec(updateRun);
 }
 
-/**
- * Run pending updates if one of the given update flags is deferred for update.
- * <p>
- * If an update is deferred there is no guarantee if only the requested update
- * is run or all pending update types.
- *
- * @param flags only run update if one of this update types is pending
- */
-void runUpdate(int flags) {
-	if ((updateFlags & flags) != 0) {
-		// if requested update is only tab height, update only tab height
-		if (flags == UPDATE_TAB_HEIGHT) {
-			updateFlags &= ~flags;
-			// Changes in button state (added/removed min/max button) can influence the new
-			// tab height. There is no separate flag to run button updates and no need to
-			// introduce one because the update method is very cheap to run if nothing changed.
-			updateButtons();
-			updateTabHeight(false);
-		} else {
-			runUpdate();
-		}
-	}
-}
-
 void runUpdate() {
 	if (updateFlags == 0) return;
 	int flags = updateFlags;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
index 8a0d9cb..c9b7aa7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
@@ -402,10 +402,9 @@
 		int borderRight = borderLeft;
 		int borderTop = parent.onBottom ? borderLeft : 0;
 		int borderBottom = parent.onBottom ? 0 : borderLeft;
+		int tabHeight = parent.tabHeight;
 		switch (part) {
 			case PART_BODY:
-				parent.runUpdate(CTabFolder.UPDATE_TAB_HEIGHT);
-				int tabHeight = parent.tabHeight;
 				int style = parent.getStyle();
 				int highlight_header = (style & SWT.FLAT) != 0 ? 1 : 3;
 				int highlight_margin = (style & SWT.FLAT) != 0 ? 0 : 2;
@@ -789,7 +788,6 @@
 	void drawBody(GC gc, Rectangle bounds, int state) {
 		Point size = new Point(bounds.width, bounds.height);
 		int selectedIndex = parent.selectedIndex;
-		parent.runUpdate(CTabFolder.UPDATE_TAB_HEIGHT);
 		int tabHeight = parent.tabHeight;
 
 		int borderLeft = parent.borderVisible ? 1 : 0;
@@ -1795,7 +1793,6 @@
 	void updateCurves () {
 		//Temp fix for Bug 384743
 		if (this.getClass().getName().equals("org.eclipse.e4.ui.workbench.renderers.swt.CTabRendering")) return;
-		parent.runUpdate(CTabFolder.UPDATE_TAB_HEIGHT);
 		int tabHeight = parent.tabHeight;
 		if (tabHeight == lastTabHeight) return;
 		lastTabHeight = tabHeight;
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java
index 6ea3fbc..8f0743c 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java
@@ -25,8 +25,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
 
 import org.eclipse.swt.SWT;
@@ -52,6 +50,7 @@
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.swt.widgets.Widget;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -199,9 +198,7 @@
 	assertTrue(ctabFolder.getHighlightEnabled());
 }
 
-/**
- * Test for bug 507611.
- */
+@Ignore("Currently failing due to Bug 507611. E.g: Height is 50 instead of being at least 59")
 @Test
 public void test_checkSize() {
 	shell.setLayout(new GridLayout(1, false));
@@ -424,123 +421,6 @@
 	}
 }
 
-/**
- * As default the CTabFolder tab row adjust its height automatically as required for the shown content.
- * This test checks if height changes for different operations including: font size change, showing tab image,
- * min/max icon and chevron.
- */
-@Test
-public void test_tabHeightPreferedResize() {
-	createTabFolder(null);
-
-	AtomicInteger oldTabHeight = new AtomicInteger();
-	AtomicReference<Rectangle> oldClientArea = new AtomicReference<>();
-	// function to check if tab height changed since last check
-	// direction <= -1 -> expect height has shrunk
-	// direction = 0 -> expect height did not changed
-	// direction >= 1 -> expect height has grown
-	// msg = optional message to be appended on assertion message
-	BiConsumer<Integer, String> assertTabHeightChange = (direction, msg) -> {
-		int newTabHeight = ctabFolder.getTabHeight();
-		Rectangle newClientArea = ctabFolder.getClientArea();
-		String assertMsgTemplate = "Tab %s should %s%s. %d %s %d";
-		if (msg == null) {
-			msg = "";
-		}
-		if (!msg.isEmpty() && !msg.startsWith(" ")) {
-			msg = " " + msg;
-		}
-		if (direction > 0) {
-			assertTrue(String.format(assertMsgTemplate, "height", "grow", msg, newTabHeight, ">", oldTabHeight.get()), newTabHeight > oldTabHeight.get());
-			assertTrue(String.format(assertMsgTemplate, "client area offset", "grow", msg, newClientArea.y, ">", oldClientArea.get().y), newClientArea.y > oldClientArea.get().y);
-		} else if (direction < 0) {
-			assertTrue(String.format(assertMsgTemplate, "height", "shrink", msg, newTabHeight, "<", oldTabHeight.get()), newTabHeight < oldTabHeight.get());
-			assertTrue(String.format(assertMsgTemplate, "client area offset", "shrink", msg, newClientArea.y, "<", oldClientArea.get().y), newClientArea.y < oldClientArea.get().y);
-		} else {
-			assertTrue(String.format(assertMsgTemplate, "height", "not change", msg, newTabHeight, "==", oldTabHeight.get()), newTabHeight == oldTabHeight.get());
-			assertTrue(String.format(assertMsgTemplate, "client area offset", "not change", msg, newClientArea.y, "==", oldClientArea.get().y), newClientArea.y == oldClientArea.get().y);
-		}
-		oldTabHeight.set(newTabHeight);
-		oldClientArea.set(newClientArea);
-	};
-	Runnable rememberTabHeight = () -> {
-		oldTabHeight.set(ctabFolder.getTabHeight());
-		oldClientArea.set(ctabFolder.getClientArea());
-	};
-
-	Font initalFont = ctabFolder.getFont();
-	FontData[] existingFontData = initalFont.getFontData();
-	existingFontData[0].setName(SwtTestUtil.testFontName);
-	existingFontData[0].setHeight(3);
-	Font smallFont = new Font(ctabFolder.getDisplay(), existingFontData);
-	existingFontData[0].setHeight(20);
-	Font largeFont = new Font(ctabFolder.getDisplay(), existingFontData);
-	existingFontData[0].setHeight(55);
-	Font hugeFont = new Font(ctabFolder.getDisplay(), existingFontData);
-	try {
-		SwtTestUtil.openShell(shell);
-		rememberTabHeight.run();
-
-		// Test tab height changes due to font size change
-		ctabFolder.setFont(smallFont);
-		assertTabHeightChange.accept(-1, "with smaller font");
-
-		ctabFolder.setFont(largeFont);
-		assertTabHeightChange.accept(+1, "with larger font");
-
-		ctabFolder.setFont(initalFont);
-		assertTabHeightChange.accept(-1, "with smaller font");
-
-		// Test tab height can change from showing min/max icon
-		ctabFolder.setFont(smallFont);
-		rememberTabHeight.run();
-		ctabFolder.setMinimizeVisible(true);
-		assertTabHeightChange.accept(+1, "with minimize icon");
-
-		ctabFolder.setMaximizeVisible(true);
-		assertTabHeightChange.accept(0, "");
-
-		ctabFolder.setMinimizeVisible(false);
-		ctabFolder.setMaximizeVisible(false);
-		assertTabHeightChange.accept(-1, "without icons");
-
-		// Test tab height change with tab icon
-		Image systemIcon = ctabFolder.getDisplay().getSystemImage(SWT.ICON_INFORMATION);
-		ctabFolder.setSelection(0);
-		ctabFolder.getItem(0).setImage(systemIcon);
-		assertTabHeightChange.accept(+1, "with tab icon");
-
-		ctabFolder.getItem(0).setImage(null);
-		ctabFolder.getItem(1).setImage(systemIcon);
-		ctabFolder.setUnselectedImageVisible(true);
-		assertTabHeightChange.accept(0, "");
-
-		ctabFolder.getItem(0).setFont(hugeFont);
-		assertTabHeightChange.accept(+1, "with font larger than icon");
-
-		// Test tab height change with chevron
-		createTabFolder(null, 10);
-		ctabFolder.setFont(smallFont);
-		shell.layout(true, true);
-		processEvents();
-		rememberTabHeight.run();
-		showChevron();
-		assertTabHeightChange.accept(+1, "with chevron");
-
-		createTabFolder(null, 10);
-		ctabFolder.setFont(largeFont);
-		shell.layout(true, true);
-		processEvents();
-		rememberTabHeight.run();
-		showChevron();
-		assertTabHeightChange.accept(0, "with chevron");
-	} finally {
-		smallFont.dispose();
-		largeFont.dispose();
-		hugeFont.dispose();
-	}
-}
-
 private void processEvents() {
 	Display display = shell.getDisplay();
 
