diff --git a/src/Factory.php b/src/Factory.php
index 4ecc8224..65c319b4 100644
--- a/src/Factory.php
+++ b/src/Factory.php
@@ -3,23 +3,54 @@
 namespace Faker;
 
 require_once __DIR__ . '/Generator.php';
-require_once __DIR__ . '/Provider/Name.php';
-require_once __DIR__ . '/Provider/Address.php';
-require_once __DIR__ . '/Provider/PhoneNumber.php';
-require_once __DIR__ . '/Provider/Company.php';
-require_once __DIR__ . '/Provider/Lorem.php';
 
 class Factory
 {
-	public static function create()
+	const DEFAULT_LOCALE = 'en_US';
+	
+	protected static $defaultProviders = array('Name', 'Address', 'PhoneNumber', 'Company', 'Lorem');
+	
+	public static function create($locale = self::DEFAULT_LOCALE)
 	{
 		$generator = new Generator();
-		$generator->addProvider(new Provider\Name($generator));
-		$generator->addProvider(new Provider\Address($generator));
-		$generator->addProvider(new Provider\PhoneNumber($generator));
-		$generator->addProvider(new Provider\Company($generator));
-		$generator->addProvider(new Provider\Lorem($generator));
+		foreach (static::$defaultProviders as $provider) {
+			$providerClassName = self::getProviderClassname($provider, $locale);
+			$generator->addProvider(new $providerClassName($generator));
+		}
 		
 		return $generator;
 	}
+	
+	protected function getProviderClassname($provider, $locale = '')
+	{
+		if ($providerClass = self::findProviderClassname($provider, $locale)) {
+			return $providerClass;
+		}
+		// fallback to default locale
+		if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) {
+			return $providerClass;
+		}
+		// fallback to no locale
+		$providerClass = self::findProviderClassname($provider);
+		if (class_exists($providerClass)) {
+			return $providerClass;
+		}
+		throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale));
+	}
+
+	protected static function findProviderClassname($provider, $locale = '')
+	{
+		$providerName = $locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider);
+		$providerClass = 'Faker\\' . $providerName;
+		echo $providerClass, "\n";
+		if (class_exists($providerClass)) {
+			return $providerClass;
+		}
+		$providerClassPath = __DIR__ . '/' . str_replace('\\', '/', $providerName) . '.php';
+		echo $providerClassPath, "\n";
+		if (file_exists($providerClassPath)) {
+			require $providerClassPath;
+			return $providerClass;
+		}
+	}
 }
diff --git a/src/Provider/Address.php b/src/Provider/en_US/Address.php
similarity index 99%
rename from src/Provider/Address.php
rename to src/Provider/en_US/Address.php
index 260826fb..c2104169 100644
--- a/src/Provider/Address.php
+++ b/src/Provider/en_US/Address.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Faker\Provider;
+namespace Faker\Provider\en_US;
 
 class Address
 {
diff --git a/src/Provider/Company.php b/src/Provider/en_US/Company.php
similarity index 99%
rename from src/Provider/Company.php
rename to src/Provider/en_US/Company.php
index 47e23d3d..8b72f8b5 100644
--- a/src/Provider/Company.php
+++ b/src/Provider/en_US/Company.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Faker\Provider;
+namespace Faker\Provider\en_US;
 
 class Company
 {
diff --git a/src/Provider/Name.php b/src/Provider/en_US/Name.php
similarity index 99%
rename from src/Provider/Name.php
rename to src/Provider/en_US/Name.php
index 76f2ed25..6987eb0d 100644
--- a/src/Provider/Name.php
+++ b/src/Provider/en_US/Name.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Faker\Provider;
+namespace Faker\Provider\en_US;
 
 class Name
 {
diff --git a/src/Provider/PhoneNumber.php b/src/Provider/en_US/PhoneNumber.php
similarity index 96%
rename from src/Provider/PhoneNumber.php
rename to src/Provider/en_US/PhoneNumber.php
index d8beeb06..7790f95a 100644
--- a/src/Provider/PhoneNumber.php
+++ b/src/Provider/en_US/PhoneNumber.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Faker\Provider;
+namespace Faker\Provider\en_US;
 
 class PhoneNumber
 {