diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
index 845f1d0..5a35658 100755
--- a/Lib/webbrowser.py
+++ b/Lib/webbrowser.py
@@ -495,10 +495,23 @@
 #
 
 if sys.platform[:3] == "win":
+
     class WindowsDefault(BaseBrowser):
+        # Windows Default opening arguments.
+
+        cmd = "start"
+        newwindow = ""
+        newtab = ""
+
         def open(self, url, new=0, autoraise=True):
+            # Format the command for optional arguments and add the url.
+            if new == 1:
+                self.cmd += " " + self.newwindow
+            elif new == 2:
+                self.cmd += " " + self.newtab
+            self.cmd += " " + url
             try:
-                os.startfile(url)
+                subprocess.call(self.cmd, shell=True)
             except OSError:
                 # [Error 22] No application is associated with the specified
                 # file for this operation: '<URL>'
@@ -506,19 +519,108 @@
             else:
                 return True
 
+
+    # Windows Sub-Classes for commonly used browsers.
+
+    class InternetExplorer(WindowsDefault):
+        """Launcher class for Internet Explorer browser"""
+
+        cmd = "start iexplore.exe"
+        newwindow = ""
+        newtab = ""
+
+
+    class WinChrome(WindowsDefault):
+        """Launcher class for windows specific Google Chrome browser"""
+
+        cmd = "start chrome.exe"
+        newwindow = "-new-window"
+        newtab = "-new-tab"
+
+
+    class WinFireFox(WindowsDefault):
+        """Launcher class for windows specific Firefox browser"""
+
+        cmd = "start firefox.exe"
+        newwindow = "-new-window"
+        newtab = "-new-tab"
+
+
+    class WinOpera(WindowsDefault):
+        """Launcher class for windows specific Opera browser"""
+
+        cmd = "start opera"
+        newwindow = ""
+        newtab = ""
+
+
+    class WinSeaMonkey(WindowsDefault):
+        """Launcher class for windows specific SeaMonkey browser"""
+
+        cmd = "start seamonkey"
+        newwinow = ""
+        newtab = ""
+
+
     _tryorder = []
     _browsers = {}
 
-    # First try to use the default Windows browser
+    # First try to use the default Windows browser.
     register("windows-default", WindowsDefault)
 
-    # Detect some common Windows browsers, fallback to IE
-    iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"),
-                            "Internet Explorer\\IEXPLORE.EXE")
-    for browser in ("firefox", "firebird", "seamonkey", "mozilla",
-                    "netscape", "opera", iexplore):
-        if shutil.which(browser):
-            register(browser, None, BackgroundBrowser(browser))
+    def find_windows_browsers():
+        """ Access the windows registry to determine
+        what browsers are on the system.
+        """
+
+        import winreg
+        HKLM = winreg.HKEY_LOCAL_MACHINE
+        subkey = r'Software\Clients\StartMenuInternet'
+        read32 = winreg.KEY_READ | winreg.KEY_WOW64_32KEY
+        read64 = winreg.KEY_READ | winreg.KEY_WOW64_64KEY
+        key32 = winreg.OpenKey(HKLM, subkey, access=read32)
+        key64 = winreg.OpenKey(HKLM, subkey, access=read64)
+
+        # Return a list of browsers found in the registry
+        # Check if there are any different browsers in the
+        # 32 bit location instead of the 64 bit location.
+        browsers = []
+        i = 0
+        while True:
+            try:
+                browsers.append(winreg.EnumKey(key32, i))
+            except EnvironmentError:
+                break
+            i += 1
+
+        i = 0
+        while True:
+            try:
+                browsers.append(winreg.EnumKey(key64, i))
+            except EnvironmentError:
+                break
+            i += 1
+
+        winreg.CloseKey(key32)
+        winreg.CloseKey(key64)
+
+        return browsers
+
+    # Detect some common windows browsers
+    for browser in find_windows_browsers():
+        browser = browser.lower()
+        if "iexplore" in browser:
+            register("iexplore", None, InternetExplorer("iexplore"))
+        elif "chrome" in browser:
+            register("chrome", None, WinChrome("chrome"))
+        elif "firefox" in browser:
+            register("firefox", None, WinFireFox("firefox"))
+        elif "opera" in browser:
+            register("opera", None, WinOpera("opera"))
+        elif "seamonkey" in browser:
+            register("seamonkey", None, WinSeaMonkey("seamonkey"))
+        else:
+            register(browser, None, WindowsDefault(browser))
 
 #
 # Platform support for MacOS
diff --git a/Misc/NEWS b/Misc/NEWS
index 5dea7f3..03b8631 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@
 Library
 -------
 
+- Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon
+  Milam
+
 - Issue #24347: Set KeyError if PyDict_GetItemWithError returns NULL.
 
 - Issue #24348: Drop superfluous incref/decref.
