diff --git a/pom.xml b/pom.xml
index 37a685e..07ee094 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <cucumber.version>6.9.1</cucumber.version>
-        <selenium-java.version>3.141.59</selenium-java.version>
+        <selenium-java.version>4.1.2</selenium-java.version>
         <browserstack-local-java.version>1.0.6</browserstack-local-java.version>
         <json-simple.version>1.1.1</json-simple.version>
         <slf4j.version>1.7.30</slf4j.version>
@@ -144,7 +144,7 @@
                                 </property>
                                 <property>
                                     <key>parallel-count</key>
-                                    <value>5</value>
+                                    <value>3</value>
                                 </property>
                                 <property>
                                     <key>features</key>
diff --git a/src/test/java/com/browserstack/pageobjects/HomePage.java b/src/test/java/com/browserstack/pageobjects/HomePage.java
new file mode 100644
index 0000000..33dfd00
--- /dev/null
+++ b/src/test/java/com/browserstack/pageobjects/HomePage.java
@@ -0,0 +1,52 @@
+package com.browserstack.pageobjects;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+public class HomePage {
+    private WebDriver webDriver;
+
+    private String selectedProductName;
+
+    public HomePage(WebDriver webDriver) {
+        this.webDriver = webDriver;
+        this.selectedProductName = "";
+    }
+
+    private By firstProductName = By.xpath("//*[@id=\"1\"]/p");
+
+    private By firstProductAddToCartButton = By.xpath("//*[@id=\"1\"]/div[4]");
+
+    private By cartPane = By.cssSelector(".float-cart__content");
+
+    private By productCartText = By.xpath("//*[@id=\"__next\"]/div/div/div[2]/div[2]/div[2]/div/div[3]/p[1]");
+
+    public void selectFirstProductName() {
+        String firstProduct = webDriver.findElement(firstProductName).getText();
+        setSelectedProductName(firstProduct);
+    }
+
+    public void clickAddToCartButton() {
+        webDriver.findElement(firstProductAddToCartButton).click();
+    }
+
+    public void waitForCartToOpen() {
+        new WebDriverWait(webDriver, Duration.ofSeconds(30)).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(cartPane));
+    }
+
+    public String getProductCartText() {
+        return webDriver.findElement(productCartText).getText();
+    }
+
+    public void setSelectedProductName(String selectedProductName) {
+        this.selectedProductName = selectedProductName;
+    }
+
+    public String getSelectedProductName() {
+        return selectedProductName;
+    }
+}
diff --git a/src/test/java/com/browserstack/pageobjects/SearchPage.java b/src/test/java/com/browserstack/pageobjects/SearchPage.java
deleted file mode 100644
index e7cb592..0000000
--- a/src/test/java/com/browserstack/pageobjects/SearchPage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.browserstack.pageobjects;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-
-public class SearchPage {
-    private WebDriver webDriver;
-
-    public SearchPage(WebDriver webDriver) {
-        this.webDriver = webDriver;
-    }
-
-    private By searchTermField = By.name("q");
-
-    public void enterSearchTerm(String searchTerm) {
-        webDriver.findElement(searchTermField).sendKeys(searchTerm);
-    }
-
-    public void submitSearch() {
-        webDriver.findElement(searchTermField).submit();
-    }
-
-}
diff --git a/src/test/java/com/browserstack/stepdefs/SearchSteps.java b/src/test/java/com/browserstack/stepdefs/StackDemoSteps.java
similarity index 64%
rename from src/test/java/com/browserstack/stepdefs/SearchSteps.java
rename to src/test/java/com/browserstack/stepdefs/StackDemoSteps.java
index acce60e..4cb50be 100644
--- a/src/test/java/com/browserstack/stepdefs/SearchSteps.java
+++ b/src/test/java/com/browserstack/stepdefs/StackDemoSteps.java
@@ -2,7 +2,7 @@
 
 import com.browserstack.TestRunner;
 import com.browserstack.local.Local;
-import com.browserstack.pageobjects.SearchPage;
+import com.browserstack.pageobjects.HomePage;
 import com.browserstack.util.Utility;
 import io.cucumber.java.After;
 import io.cucumber.java.Before;
@@ -14,6 +14,8 @@
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.remote.DesiredCapabilities;
 import org.openqa.selenium.remote.RemoteWebDriver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.net.URL;
 import java.util.HashMap;
@@ -22,10 +24,11 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class SearchSteps {
+public class StackDemoSteps {
     private WebDriver driver;
-    private SearchPage searchPage;
+    private HomePage homePage;
     private Local l;
+    private final Logger LOG = LoggerFactory.getLogger(StackDemoSteps.class);
 
     @Before
     public void setUp(Scenario scenario) throws Exception {
@@ -34,15 +37,17 @@ public void setUp(Scenario scenario) throws Exception {
 
         DesiredCapabilities caps = new DesiredCapabilities(capability);
         caps.setCapability("name", scenario.getName());
-        if (caps.getCapability("browserstack.local")!=null && caps.getCapability("browserstack.local").toString().equals("true")) {
+        Map<String, Object> bstackOptions = (Map<String, Object>) caps.getCapability("bstack:options");
+        if (bstackOptions!=null && bstackOptions.get("local")!=null && bstackOptions.get("local").toString().equals("true")) {
+            LOG.info("Start BrowserStack Local");
             l = new Local();
             Map<String, String> options = new HashMap<String, String>();
-            options.put("key", caps.getCapability("browserstack.key").toString());
+            options.put("key", bstackOptions.get("accessKey").toString());
             l.start(options);
         }
 
         driver = new RemoteWebDriver(new URL(URL), caps);
-        searchPage = new SearchPage(driver);
+        homePage = new HomePage(driver);
     }
 
     @Given("^I am on the website '(.+)'$")
@@ -51,20 +56,21 @@ public void I_am_on_the_website(String url) throws Throwable {
         Thread.sleep(2000);
     }
 
-    @When("^I submit the search term '(.+)'$")
-    public void I_submit_the_search_term(String searchTerm) throws Throwable {
-        searchPage.enterSearchTerm(searchTerm);
-        searchPage.submitSearch();
+    @When("^I select a product and click on 'Add to cart' button")
+    public void I_select_a_product_and_add_to_cart() throws Throwable {
+        homePage.selectFirstProductName();
+        homePage.clickAddToCartButton();
         Thread.sleep(2000);
     }
 
-    @Then("the page title should be '(.+)'$")
-    public void I_should_see_pagetitle(String expectedTitle) throws Throwable {
-        assertEquals(expectedTitle, driver.getTitle());
+    @Then("the product should be added to cart")
+    public void product_should_be_added_to_cart() {
+        homePage.waitForCartToOpen();
+        assertEquals(homePage.getSelectedProductName(), homePage.getProductCartText());
     }
 
     @Then("the page should contain '(.+)'$")
-    public void page_should_contain(String expectedTitle) throws Throwable {
+    public void page_should_contain(String expectedTitle) {
         assertTrue(driver.getPageSource().contains(expectedTitle));
     }
 
@@ -79,4 +85,4 @@ public void teardown(Scenario scenario) throws Exception {
         driver.quit();
         if (l != null) l.stop();
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/browserstack/util/Utility.java b/src/test/java/com/browserstack/util/Utility.java
index 1f30bd1..af92e60 100644
--- a/src/test/java/com/browserstack/util/Utility.java
+++ b/src/test/java/com/browserstack/util/Utility.java
@@ -15,13 +15,13 @@ public static JSONObject getCombinedCapability(Map<String, String> envCapabiliti
         Iterator it = envCapabilities.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry pair = (Map.Entry) it.next();
-            capabilities.put(pair.getKey().toString(), pair.getValue().toString());
+            capabilities.put(pair.getKey().toString(), pair.getValue());
         }
         it = commonCapabilities.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry pair = (Map.Entry) it.next();
             if (capabilities.get(pair.getKey().toString()) == null) {
-                capabilities.put(pair.getKey().toString(), pair.getValue().toString());
+                capabilities.put(pair.getKey().toString(), pair.getValue());
             }
         }
         String username = System.getenv("BROWSERSTACK_USERNAME");
@@ -33,8 +33,12 @@ public static JSONObject getCombinedCapability(Map<String, String> envCapabiliti
         if(accessKey == null) {
             accessKey = (String) config.get("key");
         }
-        capabilities.put("browserstack.user", username);
-        capabilities.put("browserstack.key", accessKey);
+        JSONObject bstackOptions = (JSONObject) capabilities.get("bstack:options");
+        if(bstackOptions == null)
+            bstackOptions = new JSONObject();
+        bstackOptions.put("userName", username);
+        bstackOptions.put("accessKey", accessKey);
+        capabilities.put("bstack:options", bstackOptions);
         return capabilities;
     }
 
diff --git a/src/test/resources/conf/local.conf.json b/src/test/resources/conf/local.conf.json
index 306fa86..6703b3a 100644
--- a/src/test/resources/conf/local.conf.json
+++ b/src/test/resources/conf/local.conf.json
@@ -4,12 +4,14 @@
   "key": "BROWSERSTACK_ACCESS_KEY",
 
   "capabilities": {
-    "build": "cucumber-java-browserstack",
-    "browserstack.debug": true,
-    "browserstack.local": true
+    "bstack:options": {
+      "buildName": "cucumber-java-browserstack",
+      "local": "true",
+      "debug": "true"
+    }
   },
 
   "environments": [{
-    "browser": "chrome"
+    "browserName": "chrome"
   }]
 }
diff --git a/src/test/resources/conf/parallel.conf.json b/src/test/resources/conf/parallel.conf.json
index 67d5177..6590da0 100644
--- a/src/test/resources/conf/parallel.conf.json
+++ b/src/test/resources/conf/parallel.conf.json
@@ -4,22 +4,21 @@
   "key": "BROWSERSTACK_ACCESS_KEY",
 
   "capabilities": {
-    "build": "cucumber-java-browserstack",
-    "browserstack.debug": true
+    "bstack:options": {
+      "buildName": "cucumber-java-browserstack",
+      "debug": "true"
+    }
   },
 
   "environments": [
     {
-      "browser": "chrome"
-    },
-    {
-      "browser": "firefox"
+      "browserName": "chrome"
     },
     {
-      "browser": "safari"
+      "browserName": "firefox"
     },
     {
-      "browser": "Internet Explorer"
+      "browserName": "safari"
     }
   ]
 }
diff --git a/src/test/resources/conf/single.conf.json b/src/test/resources/conf/single.conf.json
index 0f2dc7a..ee140d3 100644
--- a/src/test/resources/conf/single.conf.json
+++ b/src/test/resources/conf/single.conf.json
@@ -4,11 +4,13 @@
   "key": "BROWSERSTACK_ACCESS_KEY",
 
   "capabilities": {
-    "build": "cucumber-java-browserstack",
-    "browserstack.debug": true
+    "bstack:options": {
+      "buildName": "cucumber-java-browserstack",
+      "debug": "true"
+    }
   },
 
   "environments": [{
-    "browser": "chrome"
+    "browserName": "chrome"
   }]
 }
diff --git a/src/test/resources/features/localtest/Local.feature b/src/test/resources/features/localtest/Local.feature
index 8d1601f..1e3d812 100644
--- a/src/test/resources/features/localtest/Local.feature
+++ b/src/test/resources/features/localtest/Local.feature
@@ -1,5 +1,5 @@
 Feature: Verify Local test
 
-  Scenario: Navigate to Local check page
+  Scenario: BStack Local Test - Navigate to Local check page
     Given I am on the website 'http://bs-local.com:45691/check'
-    Then the page should contain 'Up and running'
\ No newline at end of file
+    Then the page should contain 'Up and running'
diff --git a/src/test/resources/features/test/Search.feature b/src/test/resources/features/test/Search.feature
deleted file mode 100644
index 48e0bac..0000000
--- a/src/test/resources/features/test/Search.feature
+++ /dev/null
@@ -1,6 +0,0 @@
-Feature: Automatically correct mistyped search terms
-
-  Scenario: Enter search term and get page title
-    Given I am on the website 'http://www.google.com'
-    When I submit the search term 'BrowserStack'
-    Then the page title should be 'BrowserStack - Google Search'
\ No newline at end of file
diff --git a/src/test/resources/features/test/StackDemo.feature b/src/test/resources/features/test/StackDemo.feature
new file mode 100644
index 0000000..f0df316
--- /dev/null
+++ b/src/test/resources/features/test/StackDemo.feature
@@ -0,0 +1,6 @@
+Feature: BrowserStack Demo
+
+  Scenario: BStack Sample Test - Add product to cart
+    Given I am on the website 'https://www.bstackdemo.com'
+    When I select a product and click on 'Add to cart' button
+    Then the product should be added to cart
