Index: System.Windows.Forms/Application.cs
===================================================================
--- System.Windows.Forms/Application.cs	(revision 95598)
+++ 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;
 			}
 		}
 
@@ -321,17 +348,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: Test/System.Windows.Forms/ApplicationTest.cs
===================================================================
--- Test/System.Windows.Forms/ApplicationTest.cs	(revision 95598)
+++ 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,53 @@
 			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));
+			if (Directory.Exists(expectedPath)) Directory.Delete(expectedPath);
+			Assert.AreEqual (Application.CommonAppDataPath, expectedPath);
+			Assert.IsTrue (Directory.Exists(Application.CommonAppDataPath));
+			Directory.Delete (expectedPath);
+
+			// Application.UserAppDataPath test
+			expectedPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData),
+				Path.Combine (Path.Combine (Application.CompanyName, Application.ProductName), Application.ProductVersion));
+			if (Directory.Exists (expectedPath))
+				Directory.Delete (expectedPath);
+			Assert.AreEqual (Application.CommonAppDataPath, expectedPath);
+			Assert.IsTrue (Directory.Exists (Application.CommonAppDataPath));
+			Directory.Delete (expectedPath);
+
+			// Application.LocalUserAppDataPath test
+			expectedPath = Path.Combine (Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
+				Path.Combine (Path.Combine (Application.CompanyName, Application.ProductName), Application.ProductVersion));
+			if (Directory.Exists (expectedPath)) 
+				Directory.Delete (expectedPath);
+			Assert.AreEqual (Application.CommonAppDataPath, expectedPath);
+			Assert.IsTrue (Directory.Exists(Application.CommonAppDataPath));
+			Directory.Delete (expectedPath);
+
+			// Registry tests
+			expectedPath = "Software\\" + Application.CompanyName + "\\" + Application.ProductName + "\\" +
+				Application.ProductVersion;
+
+			Registry.LocalMachine.DeleteSubKey (expectedPath, false);
+			Assert.IsNotNull (Application.CommonAppDataRegistry);
+			Assert.AreEqual (Application.CommonAppDataRegistry, Registry.LocalMachine.OpenSubKey (expectedPath));
+			Registry.LocalMachine.DeleteSubKey (expectedPath, true);
+
+			Registry.CurrentUser.DeleteSubKey (expectedPath, false);
+			Assert.IsNotNull (Application.UserAppDataRegistry);
+			Assert.AreEqual (Application.UserAppDataRegistry, Registry.CurrentUser.OpenSubKey (expectedPath));
+			Registry.CurrentUser.DeleteSubKey (expectedPath, true);
+        }
+
 #if NET_2_0
 		[Test]
 		[ExpectedException (typeof (NotSupportedException))]
