diff --git a/packages/eslint-plugin-pf-codemods/index.js b/packages/eslint-plugin-pf-codemods/index.js
index 7a03895fa..2a8082bfb 100644
--- a/packages/eslint-plugin-pf-codemods/index.js
+++ b/packages/eslint-plugin-pf-codemods/index.js
@@ -57,6 +57,8 @@ const rules = {
"simpleList-remove-isCurrent": require('./lib/rules/v5/simpleList-remove-isCurrent'),
"spinner-svg-default": require('./lib/rules/v5/spinner-svg-default'),
"tableComposable-remove-hasSelectableRowCaption": require('./lib/rules/v5/tableComposable-remove-hasSelectableRowCaption'),
+ "tabs-rename-hasBorderBottom": require('./lib/rules/v5/tabs-rename-hasBorderBottom'),
+ "tabs-remove-hasSecondaryBorderBottom": require('./lib/rules/v5/tabs-rename-hasSecondaryBorderBottom'),
"toggle-remove-isPrimary": require('./lib/rules/v5/toggle-remove-isPrimary'),
"toolbar-remove-visiblity": require('./lib/rules/v5/toolbar-remove-visiblity'),
"tooltip-remove-props": require('./lib/rules/v5/tooltip-remove-props'),
diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js
new file mode 100644
index 000000000..e4498cce9
--- /dev/null
+++ b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js
@@ -0,0 +1,11 @@
+const { renameProp } = require('../../helpers');
+
+// https://github.com/patternfly/patternfly-react/pull/8517
+module.exports = {
+ meta: { fixable: 'code' },
+ create: renameProp(
+ 'Tabs',
+ {'hasSecondaryBorderBottom': ''},
+ node => `hasSecondaryBorderBottom prop has been removed for ${node.name.name}.`
+ ),
+};
diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js
new file mode 100644
index 000000000..48ab86237
--- /dev/null
+++ b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js
@@ -0,0 +1,32 @@
+const { getPackageImports } = require('../../helpers');
+
+// https://github.com/patternfly/patternfly-react/pull/8517
+module.exports = {
+ meta: { fixable: 'code' },
+ create: function(context) {
+ const imports = getPackageImports(context, '@patternfly/react-core')
+ .filter(specifier => specifier.imported.name === 'Tabs');
+ const sourceCode = context.getSourceCode();
+
+ return imports.length == 0 ? {} : {
+ JSXOpeningElement(node) {
+ if (imports.map(imp => imp.local.name).includes(node.name.name)) {
+ const attribute = node.attributes.find(node => node.name && node.name.name === 'hasBorderBottom');
+ if (attribute) {
+ context.report({
+ node,
+ message: `hasBorderBottom prop has been removed for ${node.name.name}. Use hasNoBorderBottom instead`,
+ fix(fixer) {
+ const attrText = attribute.value ? sourceCode.getText(attribute.value.expression) : 'true';
+ if (['true', 'false'].includes(attrText.trim())) {
+ return fixer.replaceText(attribute, attrText && attrText.trim() === 'false' ? 'hasNoBorderBottom' : '');
+ }
+ return fixer.replaceText(attribute, `hasNoBorderBottom={!(${attrText})}`)
+ }
+ });
+ }
+ }
+ }
+ };
+ }
+};
diff --git a/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js
new file mode 100644
index 000000000..a99052975
--- /dev/null
+++ b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js
@@ -0,0 +1,26 @@
+const ruleTester = require("../../ruletester");
+const rule = require("../../../lib/rules/v5/tabs-remove-hasSecondaryBorderBottom");
+
+ruleTester.run("tabs-remove-hasSecondaryBorderBottom", rule, {
+ valid: [
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ },
+ {
+ // No @patternfly/react-core import
+ code: ``,
+ },
+ ],
+ invalid: [
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ output: `import { Tabs } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `hasSecondaryBorderBottom prop has been removed for Tabs.`,
+ type: "JSXOpeningElement",
+ },
+ ],
+ },
+ ],
+});
diff --git a/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js
new file mode 100644
index 000000000..b85b7b110
--- /dev/null
+++ b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js
@@ -0,0 +1,56 @@
+const ruleTester = require("../../ruletester");
+const rule = require("../../../lib/rules/v5/tabs-rename-hasBorderBottom");
+
+ruleTester.run("tabs-rename-hasBorderBottom", rule, {
+ valid: [
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ },
+ {
+ // No @patternfly/react-core import
+ code: ``,
+ },
+ ],
+ invalid: [
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ output: `import { Tabs } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`,
+ type: "JSXOpeningElement",
+ },
+ ],
+ },
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ output: `import { Tabs } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`,
+ type: "JSXOpeningElement",
+ },
+ ],
+ },
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ output: `import { Tabs } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`,
+ type: "JSXOpeningElement",
+ },
+ ],
+ },
+ {
+ code: `import { Tabs } from '@patternfly/react-core'; `,
+ output: `import { Tabs } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`,
+ type: "JSXOpeningElement",
+ },
+ ],
+ },
+ ],
+});
diff --git a/packages/pf-codemods/README.md b/packages/pf-codemods/README.md
index 40184412a..163e20891 100644
--- a/packages/pf-codemods/README.md
+++ b/packages/pf-codemods/README.md
@@ -368,6 +368,48 @@ Out:
```
+### tabs-rename-hasBorderBottom [(#8517)](https://github.com/patternfly/patternfly-react/pull/8517)
+
+We've renamed the `hasBorderBottom` prop to `hasNoBorderBottom`.
+
+#### Examples
+
+In:
+
+```jsx
+
+
+
+
+```
+
+Out:
+
+```jsx
+
+
+
+
+```
+
+### tabs-rename-hasSecondaryBorderBottom [(#8517)](https://github.com/patternfly/patternfly-react/pull/8517)
+
+We've removed the deprecated `hasSecondaryBorderBottom` prop.
+
+#### Examples
+
+In:
+
+```jsx
+
+```
+
+Out:
+
+```jsx
+
+```
+
### toggle-remove-isprimary [(#8179)](https://github.com/patternfly/patternfly-react/pull/8179)
We've removed the deprecated `isPrimary` prop. This rule wil replace it with the "primary" value on the `toggleVariant` prop.