diff --git a/CHANGES.rst b/CHANGES.rst
index 5b9a667..49b78a2 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -10,6 +10,8 @@ CHANGES
 
 * Unsafe encoding for QS fixed. Encode `;` char in value param (#104)
 
+* Process passwords without user names (#95)
+
 0.12.0 (2017-06-26)
 -------------------
 
diff --git a/yarl/__init__.py b/yarl/__init__.py
index 41a3089..e1151c0 100644
--- a/yarl/__init__.py
+++ b/yarl/__init__.py
@@ -176,8 +176,11 @@ class URL:
                     netloc += ':{}'.format(val.port)
                 if val.username:
                     user = _quote(val.username)
-                    if val.password:
-                        user += ':' + _quote(val.password)
+                else:
+                    user = ''
+                if val.password:
+                    user += ':' + _quote(val.password)
+                if user:
                     netloc = user + '@' + netloc
 
             path = _quote(val[2], safe='+@:', protected='/+', strict=strict)
@@ -380,7 +383,10 @@ class URL:
 
         """
         # not .username
-        return self._val.username
+        ret = self._val.username
+        if not ret:
+            return None
+        return ret
 
     @cached_property
     def user(self):
@@ -590,7 +596,7 @@ class URL:
             ret = ret + ':' + str(port)
         if password:
             if not user:
-                raise ValueError("Non-empty password requires non-empty user")
+                user = ''
             user = user + ':' + password
         if user:
             ret = user + '@' + ret

diff --git a/tests/test_url.py b/tests/test_url.py
index b5d365e..d2582ff 100644
--- a/tests/test_url.py
+++ b/tests/test_url.py
@@ -77,6 +77,11 @@ def test_raw_user_non_ascii():
     assert '%D0%B2%D0%B0%D1%81%D1%8F' == url.raw_user
 
 
+def test_no_user():
+    url = URL('http://example.com')
+    assert url.user is None
+
+
 def test_user_non_ascii():
     url = URL('http://вася@example.com')
     assert 'вася' == url.user
@@ -97,6 +102,11 @@ def test_password_non_ascii():
     assert 'пароль' == url.password
 
 
+def test_password_without_user():
+    url = URL('http://:password@example.com')
+    assert 'password' == url.password
+
+
 def test_raw_host():
     url = URL('http://example.com')
     assert "example.com" == url.raw_host
diff --git a/tests/test_url_update_netloc.py b/tests/test_url_update_netloc.py
index 9790dd4..46bdab0 100644
--- a/tests/test_url_update_netloc.py
+++ b/tests/test_url_update_netloc.py
@@ -90,8 +90,10 @@ def test_with_password_invalid_type():
 
 def test_with_password_and_empty_user():
     url = URL('http://example.com')
-    with pytest.raises(ValueError):
-        assert str(url.with_password('pass'))
+    url2 = url.with_password('pass')
+    assert url2.password == 'pass'
+    assert url2.user is None
+    assert str(url2) == 'http://:pass@example.com'
 
 
 def test_from_str_with_host_ipv4():

Passwords without users
Currently, yarl refuses to set an password if a user isn't set.  That's a bit unfortunate because that’s exactly what you need if you’re building redis URLs: https://redis-py.readthedocs.io/en/latest/#redis.StrictRedis.from_url
tests/test_url.py::test_password_without_user tests/test_url_update_netloc.py::test_with_password_and_empty_user
tests/test_url.py::test_absolute_url_without_host tests/test_url.py::test_url_is_not_str tests/test_url.py::test_str tests/test_url.py::test_repr tests/test_url.py::test_origin tests/test_url.py::test_origin_not_absolute_url tests/test_url.py::test_origin_no_scheme tests/test_url.py::test_drop_dots tests/test_url.py::test_abs_cmp tests/test_url.py::test_abs_hash tests/test_url.py::test_scheme tests/test_url.py::test_raw_user tests/test_url.py::test_raw_user_non_ascii tests/test_url.py::test_no_user tests/test_url.py::test_user_non_ascii tests/test_url.py::test_raw_password tests/test_url.py::test_raw_password_non_ascii tests/test_url.py::test_password_non_ascii tests/test_url.py::test_raw_host tests/test_url.py::test_raw_host_non_ascii tests/test_url.py::test_host_non_ascii tests/test_url.py::test_raw_host_when_port_is_specified tests/test_url.py::test_raw_host_from_str_with_ipv4 tests/test_url.py::test_raw_host_from_str_with_ipv6 tests/test_url.py::test_explicit_port tests/test_url.py::test_implicit_port tests/test_url.py::test_port_for_relative_url tests/test_url.py::test_port_for_unknown_scheme tests/test_url.py::test_raw_path_string_empty tests/test_url.py::test_raw_path tests/test_url.py::test_raw_path_non_ascii tests/test_url.py::test_path_non_ascii tests/test_url.py::test_path_with_spaces tests/test_url.py::test_raw_path_for_empty_url tests/test_url.py::test_raw_path_for_colon_and_at tests/test_url.py::test_raw_query_string tests/test_url.py::test_raw_query_string_non_ascii tests/test_url.py::test_query_string_non_ascii tests/test_url.py::test_path_qs tests/test_url.py::test_query_string_spaces tests/test_url.py::test_raw_fragment_empty tests/test_url.py::test_raw_fragment tests/test_url.py::test_raw_fragment_non_ascii tests/test_url.py::test_raw_fragment_safe tests/test_url.py::test_fragment_non_ascii tests/test_url.py::test_raw_parts_empty tests/test_url.py::test_raw_parts tests/test_url.py::test_raw_parts_without_path tests/test_url.py::test_raw_path_parts_with_2F_in_path tests/test_url.py::test_raw_path_parts_with_2f_in_path tests/test_url.py::test_raw_parts_for_relative_path tests/test_url.py::test_raw_parts_for_relative_path_starting_from_slash tests/test_url.py::test_raw_parts_for_relative_double_path tests/test_url.py::test_parts_for_empty_url tests/test_url.py::test_raw_parts_non_ascii tests/test_url.py::test_parts_non_ascii tests/test_url.py::test_name_for_empty_url tests/test_url.py::test_raw_name tests/test_url.py::test_raw_name_root tests/test_url.py::test_raw_name_root2 tests/test_url.py::test_raw_name_root3 tests/test_url.py::test_relative_raw_name tests/test_url.py::test_relative_raw_name_starting_from_slash tests/test_url.py::test_relative_raw_name_slash tests/test_url.py::test_name_non_ascii tests/test_url.py::test_plus_in_path tests/test_url.py::test_parent_raw_path tests/test_url.py::test_parent_raw_parts tests/test_url.py::test_double_parent_raw_path tests/test_url.py::test_empty_parent_raw_path tests/test_url.py::test_empty_parent_raw_path2 tests/test_url.py::test_clear_fragment_on_getting_parent tests/test_url.py::test_clear_fragment_on_getting_parent_toplevel tests/test_url.py::test_clear_query_on_getting_parent tests/test_url.py::test_clear_query_on_getting_parent_toplevel tests/test_url.py::test_div_root tests/test_url.py::test_div_root_with_slash tests/test_url.py::test_div tests/test_url.py::test_div_with_slash tests/test_url.py::test_div_path_starting_from_slash_is_forbidden tests/test_url.py::test_div_cleanup_query_and_fragment tests/test_url.py::test_div_for_empty_url tests/test_url.py::test_div_for_relative_url tests/test_url.py::test_div_for_relative_url_started_with_slash tests/test_url.py::test_div_non_ascii tests/test_url.py::test_div_with_colon_and_at tests/test_url.py::test_div_with_dots tests/test_url.py::test_with_path tests/test_url.py::test_with_path_encoded tests/test_url.py::test_with_path_dots tests/test_url.py::test_with_path_relative tests/test_url.py::test_with_path_query tests/test_url.py::test_with_path_fragment tests/test_url.py::test_with_path_empty tests/test_url.py::test_with_path_leading_slash tests/test_url.py::test_with_fragment tests/test_url.py::test_with_fragment_safe tests/test_url.py::test_with_fragment_non_ascii tests/test_url.py::test_with_fragment_None tests/test_url.py::test_with_fragment_bad_type tests/test_url.py::test_with_name tests/test_url.py::test_with_name_for_naked_path tests/test_url.py::test_with_name_for_relative_path tests/test_url.py::test_with_name_for_relative_path2 tests/test_url.py::test_with_name_for_relative_path_starting_from_slash tests/test_url.py::test_with_name_for_relative_path_starting_from_slash2 tests/test_url.py::test_with_name_empty tests/test_url.py::test_with_name_non_ascii tests/test_url.py::test_with_name_with_slash tests/test_url.py::test_with_name_non_str tests/test_url.py::test_with_name_within_colon_and_at tests/test_url.py::test_with_name_dot tests/test_url.py::test_with_name_double_dot tests/test_url.py::test_is_absolute_for_relative_url tests/test_url.py::test_is_absolute_for_absolute_url tests/test_url.py::test_is_non_absolute_for_empty_url tests/test_url.py::test_is_non_absolute_for_empty_url2 tests/test_url.py::test_is_absolute_path_starting_from_double_slash tests/test_url.py::test_is_default_port_for_relative_url tests/test_url.py::test_is_default_port_for_absolute_url_without_port tests/test_url.py::test_is_default_port_for_absolute_url_with_default_port tests/test_url.py::test_is_default_port_for_absolute_url_with_nondefault_port tests/test_url.py::test_is_default_port_for_unknown_scheme tests/test_url.py::test_no_scheme tests/test_url.py::test_no_scheme2 tests/test_url.py::test_from_non_allowed tests/test_url.py::test_from_idna tests/test_url.py::test_to_idna tests/test_url.py::test_from_ascii_login tests/test_url.py::test_from_non_ascii_login tests/test_url.py::test_from_ascii_login_and_password tests/test_url.py::test_from_non_ascii_login_and_password tests/test_url.py::test_from_ascii_path tests/test_url.py::test_from_ascii_path_lower_case tests/test_url.py::test_from_non_ascii_path tests/test_url.py::test_from_ascii_query_parts tests/test_url.py::test_from_non_ascii_query_parts tests/test_url.py::test_from_non_ascii_query_parts2 tests/test_url.py::test_from_ascii_fragment tests/test_url.py::test_from_bytes_with_non_ascii_fragment tests/test_url.py::test_to_str tests/test_url.py::test_to_str_long tests/test_url.py::test_decoding_with_2F_in_path tests/test_url.py::test_decoding_with_26_and_3D_in_query tests/test_url.py::test_fragment_only_url tests/test_url.py::test_url_from_url tests/test_url.py::test_lowercase_scheme tests/test_url.py::test_str_for_empty_url tests/test_url.py::test_parent_for_empty_url tests/test_url.py::test_empty_value_for_query tests/test_url.py::test_decode_pct_in_path tests/test_url.py::test_decode_pct_in_path_lower_case tests/test_url.py::test_join tests/test_url.py::test_join_absolute tests/test_url.py::test_join_non_url tests/test_url.py::test_join_from_rfc_3986_normal[g:h-g:h] tests/test_url.py::test_join_from_rfc_3986_normal[g-http://a/b/c/g] tests/test_url.py::test_join_from_rfc_3986_normal[./g-http://a/b/c/g] tests/test_url.py::test_join_from_rfc_3986_normal[g/-http://a/b/c/g/] tests/test_url.py::test_join_from_rfc_3986_normal[/g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_normal[//g-http://g] tests/test_url.py::test_join_from_rfc_3986_normal[?y-http://a/b/c/d;p?y] tests/test_url.py::test_join_from_rfc_3986_normal[g?y-http://a/b/c/g?y] tests/test_url.py::test_join_from_rfc_3986_normal[#s-http://a/b/c/d;p?q#s] tests/test_url.py::test_join_from_rfc_3986_normal[g#s-http://a/b/c/g#s] tests/test_url.py::test_join_from_rfc_3986_normal[g?y#s-http://a/b/c/g?y#s] tests/test_url.py::test_join_from_rfc_3986_normal[;x-http://a/b/c/;x] tests/test_url.py::test_join_from_rfc_3986_normal[g;x-http://a/b/c/g;x] tests/test_url.py::test_join_from_rfc_3986_normal[g;x?y#s-http://a/b/c/g;x?y#s] tests/test_url.py::test_join_from_rfc_3986_normal[-http://a/b/c/d;p?q] tests/test_url.py::test_join_from_rfc_3986_normal[.-http://a/b/c/] tests/test_url.py::test_join_from_rfc_3986_normal[./-http://a/b/c/] tests/test_url.py::test_join_from_rfc_3986_normal[..-http://a/b/] tests/test_url.py::test_join_from_rfc_3986_normal[../-http://a/b/] tests/test_url.py::test_join_from_rfc_3986_normal[../g-http://a/b/g] tests/test_url.py::test_join_from_rfc_3986_normal[../..-http://a/] tests/test_url.py::test_join_from_rfc_3986_normal[../../-http://a/] tests/test_url.py::test_join_from_rfc_3986_normal[../../g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[../../../g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[../../../../g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[/./g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[/../g-http://a/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[g.-http://a/b/c/g.] tests/test_url.py::test_join_from_rfc_3986_abnormal[.g-http://a/b/c/.g] tests/test_url.py::test_join_from_rfc_3986_abnormal[g..-http://a/b/c/g..] tests/test_url.py::test_join_from_rfc_3986_abnormal[..g-http://a/b/c/..g] tests/test_url.py::test_join_from_rfc_3986_abnormal[./../g-http://a/b/g] tests/test_url.py::test_join_from_rfc_3986_abnormal[./g/.-http://a/b/c/g/] tests/test_url.py::test_join_from_rfc_3986_abnormal[g/./h-http://a/b/c/g/h] tests/test_url.py::test_join_from_rfc_3986_abnormal[g/../h-http://a/b/c/h] tests/test_url.py::test_join_from_rfc_3986_abnormal[g;x=1/./y-http://a/b/c/g;x=1/y] tests/test_url.py::test_join_from_rfc_3986_abnormal[g;x=1/../y-http://a/b/c/y] tests/test_url.py::test_join_from_rfc_3986_abnormal[g?y/./x-http://a/b/c/g?y/./x] tests/test_url.py::test_join_from_rfc_3986_abnormal[g?y/../x-http://a/b/c/g?y/../x] tests/test_url.py::test_join_from_rfc_3986_abnormal[g#s/./x-http://a/b/c/g#s/./x] tests/test_url.py::test_join_from_rfc_3986_abnormal[g#s/../x-http://a/b/c/g#s/../x] tests/test_url.py::test_split_result_non_decoded tests/test_url.py::test_human_repr tests/test_url.py::test_human_repr_defaults tests/test_url.py::test_human_repr_default_port tests/test_url.py::test_relative tests/test_url.py::test_relative_is_relative tests/test_url.py::test_relative_abs_parts_are_removed tests/test_url.py::test_relative_fails_on_rel_url tests/test_url.py::test_slash_and_question_in_query tests/test_url.py::test_slash_and_question_in_fragment tests/test_url.py::test_requoting tests/test_url_update_netloc.py::test_with_scheme tests/test_url_update_netloc.py::test_with_scheme_uppercased tests/test_url_update_netloc.py::test_with_scheme_for_relative_url tests/test_url_update_netloc.py::test_with_scheme_invalid_type tests/test_url_update_netloc.py::test_with_user tests/test_url_update_netloc.py::test_with_user_non_ascii tests/test_url_update_netloc.py::test_with_user_for_relative_url tests/test_url_update_netloc.py::test_with_user_invalid_type tests/test_url_update_netloc.py::test_with_user_None tests/test_url_update_netloc.py::test_with_user_None_when_password_present tests/test_url_update_netloc.py::test_with_password tests/test_url_update_netloc.py::test_with_password_non_ascii tests/test_url_update_netloc.py::test_with_password_for_relative_url tests/test_url_update_netloc.py::test_with_password_None tests/test_url_update_netloc.py::test_with_password_invalid_type tests/test_url_update_netloc.py::test_from_str_with_host_ipv4 tests/test_url_update_netloc.py::test_from_str_with_host_ipv6 tests/test_url_update_netloc.py::test_with_host tests/test_url_update_netloc.py::test_with_host_empty tests/test_url_update_netloc.py::test_with_host_non_ascii tests/test_url_update_netloc.py::test_with_host_for_relative_url tests/test_url_update_netloc.py::test_with_host_invalid_type tests/test_url_update_netloc.py::test_with_port tests/test_url_update_netloc.py::test_with_port_keeps_query_and_fragment tests/test_url_update_netloc.py::test_with_port_for_relative_url tests/test_url_update_netloc.py::test_with_port_invalid_type