Index: System.Windows.Forms/Application.cs
===================================================================
--- System.Windows.Forms/Application.cs	(revision 88805)
+++ System.Windows.Forms/Application.cs	(working copy)
@@ -195,20 +195,34 @@
 
 		public static string CommonAppDataPath {
 			get {
-				return Environment.GetFolderPath (Environment.SpecialFolder.CommonApplicationData);
+				string basepath = Environment.GetFolderPath (Environment.SpecialFolder.CommonApplicationData);
+				string company = CompanyName;
+				string product = ProductName;
+				string version = ProductVersion;
+				
+				string path = Path.Combine (basepath, company);
+				path = Path.Combine (path, product);
+				path = Path.Combine (path, version);
+
+				if (!Directory.Exists (path))
+					Directory.CreateDirectory (path);
+				
+				return path;
 			}
 		}
 
 		public static RegistryKey CommonAppDataRegistry {
 			get {
-				return Registry.LocalMachine.OpenSubKey ("Software\\" +
+				return Registry.LocalMachine.CreateSubKey ("Software\\" +
 					Application.CompanyName + "\\" + Application.ProductName +
-					"\\" + Application.ProductVersion, true);
+					"\\" + Application.ProductVersion);
 			}
 		}
 
 		public static string CompanyName {
 			get {
+				string company = null;
+
 				Assembly assembly = Assembly.GetEntryAssembly ();
 				if (assembly == null)
 					assembly = Assembly.GetCallingAssembly ();
@@ -216,9 +230,12 @@
 				AssemblyCompanyAttribute[] attrs = (AssemblyCompanyAttribute[])
 					assembly.GetCustomAttributes (typeof(AssemblyCompanyAttribute), true);
 				if (attrs != null && attrs.Length > 0)
-					return attrs [0].Company;
+					company = attrs [0].Company;
 
-				return assembly.GetName().Name;
+				if (String.IsNullOrEmpty (company))
+					company = assembly.EntryPoint.DeclaringType.Namespace;
+
+				return company;
 			}
 		}
 
@@ -248,9 +265,19 @@
 
 		public static string LocalUserAppDataPath {
 			get {
-				return Path.Combine (Path.Combine (Path.Combine (
-					Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData),
-					CompanyName), ProductName), ProductVersion);
+                string basepath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
+                string company = CompanyName;
+                string product = ProductName;
+                string version = ProductVersion;
+
+                string path = Path.Combine(basepath, company);
+                path = Path.Combine(path, product);
+                path = Path.Combine(path, version);
+
+                if (!Directory.Exists(path))
+                    Directory.CreateDirectory(path);
+
+                return path;
 			}
 		}
 
@@ -313,17 +340,27 @@
 
 		public static string UserAppDataPath {
 			get {
-				return Path.Combine (Path.Combine (Path.Combine (
-					Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
-					CompanyName), ProductName), ProductVersion);
+				string basepath = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
+				string company = CompanyName;
+				string product = ProductName;
+				string version = ProductVersion;
+				
+				string path = Path.Combine (basepath, company);
+				path = Path.Combine (path, product);
+				path = Path.Combine (path, version);
+
+				if (!Directory.Exists (path))
+					Directory.CreateDirectory (path);
+				
+				return path;
 			}
 		}
 
 		public static RegistryKey UserAppDataRegistry {
 			get {
-				return Registry.CurrentUser.OpenSubKey ("Software\\" +
+				return Registry.CurrentUser.CreateSubKey ("Software\\" +
 					Application.CompanyName + "\\" + Application.ProductName +
-					"\\" + Application.ProductVersion, true);
+					"\\" + Application.ProductVersion);
 			}
 		}
 
Index: System.Windows.Forms/ChangeLog
===================================================================
--- System.Windows.Forms/ChangeLog	(revision 88805)
+++ System.Windows.Forms/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2007-11-03	Justin Cherniak <justin.cherniak@gmail.com>
+	* Application.cs: Fixed implementation of the following properties to match MSDN 
+	documentation: CommonAppDataPath, CommonAppDataRegistry, LocalUserAppDataPath.
+	UserAppDataPath, UserAppDataRegistry.  In all of these cases, Mono was not creating
+	the path if it did not exist while MSDN states that it should.
+
 2007-11-03  Gert Driesen  <drieseng@users.sourceforge.net>
 
 	* PropertyGrid.cs: Fixed default value for PropertySort. Allow invalid
Index: Test/System.Windows.Forms/ApplicationTest.cs
===================================================================
--- Test/System.Windows.Forms/ApplicationTest.cs	(revision 88805)
+++ Test/System.Windows.Forms/ApplicationTest.cs	(working copy)
@@ -13,6 +13,8 @@
 using System.Drawing;
 using System.Reflection;
 using NUnit.Framework;
+using System.IO;
+using Microsoft.Win32;
 
 namespace MonoTests.System.Windows.Forms
 {
@@ -41,6 +43,35 @@
 			Assert.IsNull (ctx.MainForm, "2");
 			f1.Dispose ();
 		}
+
+        [Test]
+        public void AppDataTest()
+        {
+            string expectedPath;
+
+            // Application.CommonAppDataPath test
+            expectedPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.CommonApplicationData), 
+                Path.Combine (Path.Combine (Application.CompanyName, Application.ProductName), Application.ProductVersion));
+            Assert.AreEqual (Application.CommonAppDataPath, expectedPath);
+            Assert.IsTrue (Directory.Exists (Application.CommonAppDataPath));
+
+            // Application.UserAppDataPath test
+            expectedPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
+                Path.Combine (Path.Combine (Application.CompanyName, Application.ProductName), Application.ProductVersion));
+            Assert.AreEqual (Application.UserAppDataPath, expectedPath);
+            Assert.IsTrue (Directory.Exists (Application.UserAppDataPath));
+
+            // Application.LocalUserAppDataPath test
+            expectedPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData),
+                Path.Combine (Path.Combine (Application.CompanyName, Application.ProductName), Application.ProductVersion));
+            Assert.AreEqual (Application.LocalUserAppDataPath, expectedPath);
+            Assert.IsTrue (Directory.Exists (Application.LocalUserAppDataPath));
+
+            // Registry tests
+            Assert.IsNotNull (Application.CommonAppDataRegistry);
+            Assert.IsNotNull (Application.UserAppDataRegistry);
+        }
+
 #if NET_2_0
 		[Test]
 		[ExpectedException (typeof (NotSupportedException))]
Index: Test/System.Windows.Forms/ChangeLog
===================================================================
--- Test/System.Windows.Forms/ChangeLog	(revision 88805)
+++ Test/System.Windows.Forms/ChangeLog	(working copy)
@@ -1,3 +1,6 @@
+2007-11-03	Justin Cherniak <justin.cherniak@gmail.com>
+	* ApplicationTest.cs: Added tests for all AppDataPath and AppDataRegistry properties
+
 2007-11-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
 
 	* ListViewItemTest.cs: Mark RemoveFocusedItem as NotWorking.
