-    def __init__(self, uri):
-        self.uri = uri
-        match = self._re_wl_uri.match(uri)
-        assert match
-        self.slug = match.group('slug')
-        self.language = match.group('lang')
+    def __init__(self, uri=None):
+        if uri is not None:
+            self.uri = uri
+            match = self._re_wl_uri.match(uri)
+            assert match
+            self.slug = match.group('slug')
+            self.language = match.group('lang') or self.DEFAULT_LANGUAGE
+
+    @classmethod
+    def from_slug_and_lang(cls, slug, lang):
+        """Contructs an URI from slug and language code.
+
+        >>> WLURI.from_slug_and_lang('a-slug', WLURI.DEFAULT_LANGUAGE).uri
+        'http://wolnelektury.pl/katalog/lektura/a-slug/'
+        >>> WLURI.from_slug_and_lang('a-slug', 'deu').uri
+        'http://wolnelektury.pl/katalog/lektura/a-slug/deu/'
+
+        """
+        if lang is None:
+            lang = self.DEFAULT_LANGUAGE
+        uri = 'http://wolnelektury.pl/katalog/lektura/%s/' % slug
+        if lang is not None and lang != cls.DEFAULT_LANGUAGE:
+            uri += lang + '/'
+        instance = cls()
+        instance.slug = slug
+        instance.language = lang
+        instance.uri = uri
+        return instance
+
+    def __unicode__(self):
+        return self.uri
+
+    def __eq__(self, other):
+        return self.slug, self.language == other.slug, other.language
+
+    def filename_stem(self):
+        stem = self.slug
+        if self.language != self.DEFAULT_LANGUAGE:
+            stem += '_' + self.language
+        return stem
+
+    def validate_language(self, language):
+        if language != self.language:
+            raise ValidationError("Incorrect language definition in URI")