diff --git a/src/attr/_make.py b/src/attr/_make.py
--- a/src/attr/_make.py
+++ b/src/attr/_make.py
@@ -181,11 +181,6 @@ def _transform_attrs(cls, these):
 
     If *these* is passed, use that and don't look for them on the class.
     """
-    super_cls = []
-    for c in reversed(cls.__mro__[1:-1]):
-        sub_attrs = getattr(c, "__attrs_attrs__", None)
-        if sub_attrs is not None:
-            super_cls.extend(a for a in sub_attrs if a not in super_cls)
     if these is None:
         ca_list = [(name, attr)
                    for name, attr
@@ -201,6 +196,17 @@ def _transform_attrs(cls, these):
         for attr_name, ca
         in sorted(ca_list, key=lambda e: e[1].counter)
     ]
+
+    super_cls = []
+    non_super_names = set(a.name for a in non_super_attrs)
+    for c in reversed(cls.__mro__[1:-1]):
+        sub_attrs = getattr(c, "__attrs_attrs__", None)
+        if sub_attrs is not None:
+            super_cls.extend(
+                a for a in sub_attrs
+                if a not in super_cls and a.name not in non_super_names
+            )
+
     attr_names = [a.name for a in super_cls + non_super_attrs]
 
     AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names)

diff --git a/tests/test_dark_magic.py b/tests/test_dark_magic.py
--- a/tests/test_dark_magic.py
+++ b/tests/test_dark_magic.py
@@ -271,3 +271,15 @@ def compute(self):
                 return self.x + 1
 
         assert C(1, 2) == C()
+
+    @pytest.mark.parametrize("slots", [True, False])
+    @pytest.mark.parametrize("frozen", [True, False])
+    def test_attrib_overwrite(self, slots, frozen):
+        """
+        Subclasses can overwrite attributes of their superclass.
+        """
+        @attr.s(slots=slots, frozen=frozen)
+        class SubOverwrite(Super):
+            x = attr.ib(default=attr.Factory(list))
+
+        assert SubOverwrite([]) == SubOverwrite()

Can't overide a __super__'s attrib.
Hi.

Is it not possible to do this? Let's say I want to change the default for arg 'p' in the inherited Class, B:
```
@attr.s
class A(object):
    p=attr.ib(default='old')

@attr.s
class B(A):
    p=attr.ib(default='new')

B().p
```

I get farts:

```
Traceback (most recent call last):
  File "E:/D/OneDrive/PyCharm/attrs_test/01.py", line 44, in <module>
    class B(A):
  File "E:\D\OneDrive\Miniconda3\envs\dev\lib\site-packages\attr\_make.py", line 391, in attributes
    return wrap(maybe_cls)
  File "E:\D\OneDrive\Miniconda3\envs\dev\lib\site-packages\attr\_make.py", line 364, in wrap
    cls = _add_init(cls, effectively_frozen)
  File "E:\D\OneDrive\Miniconda3\envs\dev\lib\site-packages\attr\_make.py", line 569, in _add_init
    bytecode = compile(script, unique_filename, "exec")
  File "<attrs generated init 6e95dcc9478c7a8b8784f6244afbff55f563f7c6>", line 1
SyntaxError: duplicate argument 'p' in function definition
```

Thanks.

Yes that’s a bug that got mentioned in a different ticket and asked the reporter to file a new bug but he didn’t get around to it so it got lost.