diff --git a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs
new file mode 100644
index 0000000000..d568c19ac8
--- /dev/null
+++ b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs
@@ -0,0 +1,217 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+using Umbraco.Tests.TestHelpers;
+using Umbraco.Web.Routing;
+using umbraco.cms.businesslogic.web;
+using umbraco.cms.businesslogic.language;
+
+namespace Umbraco.Tests.Routing
+{
+ [TestFixture]
+ class DomainsAndCulturesTests : BaseRoutingTest
+ {
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ // ensure we can create them although the content is not in the database
+ TestHelper.DropForeignKeys("umbracoDomains");
+
+ InitializeLanguagesAndDomains();
+ }
+
+ void InitializeLanguagesAndDomains()
+ {
+ var domains = Domain.GetDomains();
+ foreach (var d in domains)
+ d.Delete();
+
+ var langs = Language.GetAllAsList();
+ foreach (var l in langs.Skip(1))
+ l.Delete();
+
+ // en-US is there by default
+ Language.MakeNew("fr-FR");
+ Language.MakeNew("de-DE");
+
+ Language.MakeNew("da-DK");
+ Language.MakeNew("cs-CZ");
+ Language.MakeNew("nl-NL");
+ }
+
+ void SetDomains1()
+ {
+ var langEn = Language.GetByCultureCode("en-US");
+ var langFr = Language.GetByCultureCode("fr-FR");
+ var langDe = Language.GetByCultureCode("de-DE");
+
+ Domain.MakeNew("domain1.com/", 1001, langDe.id);
+ Domain.MakeNew("domain1.com/en", 10011, langEn.id);
+ Domain.MakeNew("domain1.com/fr", 10012, langFr.id);
+ }
+
+ void SetDomains2()
+ {
+ SetDomains1();
+
+ var langDk = Language.GetByCultureCode("da-DK");
+ var langCz = Language.GetByCultureCode("cs-CZ");
+ var langNl = Language.GetByCultureCode("nl-NL");
+
+ Domain.MakeNew("*1001", 1001, langDk.id);
+ Domain.MakeNew("*10011", 10011, langCz.id);
+ Domain.MakeNew("*10012", 10012, langNl.id);
+ }
+
+ protected override string GetXmlContent(int templateId)
+ {
+ return @"
+
+
+]>
+
+
+
+
+
+ This is some content]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is some content]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is some content]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is some content]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+";
+ }
+
+ [TestCase("http://domain1.com/", "de-DE", 1001)]
+ [TestCase("http://domain1.com/1001-1", "de-DE", 10011)]
+ [TestCase("http://domain1.com/1001-1/1001-1-1", "de-DE", 100111)]
+ [TestCase("http://domain1.com/en", "en-US", 10011)]
+ [TestCase("http://domain1.com/en/1001-1-1", "en-US", 100111)]
+ [TestCase("http://domain1.com/fr", "fr-FR", 10012)]
+ [TestCase("http://domain1.com/fr/1001-2-1", "fr-FR", 100121)]
+ public void DomainAndCulture(string inputUrl, string expectedCulture, int expectedNode)
+ {
+ SetDomains1();
+
+ var routingContext = GetRoutingContext(inputUrl);
+ var url = routingContext.UmbracoContext.CleanedUmbracoUrl; //very important to use the cleaned up umbraco url
+ var pcr = new PublishedContentRequest(url, routingContext);
+
+ // lookup domain
+ pcr.Engine.FindDomain();
+
+ Assert.AreEqual(expectedCulture, pcr.Culture.Name);
+
+ var finder = new ContentFinderByNiceUrl();
+ var result = finder.TryFindDocument(pcr);
+
+ Assert.IsTrue(result);
+ Assert.AreEqual(pcr.PublishedContent.Id, expectedNode);
+ }
+
+ [TestCase("http://domain1.com/", "de-DE", 1001)] // domain takes over wildcard FIXME
+ [TestCase("http://domain1.com/1001-1", "cs-CZ", 10011)] // wildcard applies
+ [TestCase("http://domain1.com/1001-1/1001-1-1", "cs-CZ", 100111)] // wildcard applies
+ [TestCase("http://domain1.com/1001-2", "nl-NL", 10012)] // wildcard applies
+ [TestCase("http://domain1.com/1001-2/1001-2-1", "nl-NL", 100121)] // wildcard applies
+ [TestCase("http://domain1.com/en", "en-US", 10011)] // domain takes over wildcard FIXME
+ [TestCase("http://domain1.com/en/1001-1-1", "cs-CZ", 100111)] // wildcard applies
+ [TestCase("http://domain1.com/fr", "fr-FR", 10012)] // domain takes over wildcard FIXME
+ [TestCase("http://domain1.com/fr/1001-2-1", "nl-NL", 100121)] // wildcard applies
+ public void DomainAndCultureWithWildcards(string inputUrl, string expectedCulture, int expectedNode)
+ {
+ SetDomains2();
+
+ var routingContext = GetRoutingContext(inputUrl);
+ var url = routingContext.UmbracoContext.CleanedUmbracoUrl; //very important to use the cleaned up umbraco url
+ var pcr = new PublishedContentRequest(url, routingContext);
+
+ // lookup domain
+ pcr.Engine.FindDomain();
+
+ // find document
+ var finder = new ContentFinderByNiceUrl();
+ var result = finder.TryFindDocument(pcr);
+
+ // apply wildcard domain
+ pcr.Engine.HandleWildcardDomains();
+
+ Assert.AreEqual(expectedCulture, pcr.Culture.Name);
+ Assert.IsTrue(result);
+ Assert.AreEqual(pcr.PublishedContent.Id, expectedNode);
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 3b9c93ffec..0251eed133 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -254,6 +254,7 @@
+
diff --git a/src/Umbraco.Web/Routing/PublishedContentRequestEngine.cs b/src/Umbraco.Web/Routing/PublishedContentRequestEngine.cs
index ddd9aece32..9b6face92c 100644
--- a/src/Umbraco.Web/Routing/PublishedContentRequestEngine.cs
+++ b/src/Umbraco.Web/Routing/PublishedContentRequestEngine.cs
@@ -208,7 +208,7 @@ namespace Umbraco.Web.Routing
///
/// Looks for wildcard domains in the path and updates Culture accordingly.
///
- private void HandleWildcardDomains()
+ internal void HandleWildcardDomains()
{
const string tracePrefix = "HandleWildcardDomains: ";