diff --git a/app/inventory/forms.py b/app/inventory/forms.py
index dbac83a802bb2792f608eaccb452a7cced48bb0d..530b1512858cbcf8eae0a3ac34dcb4b01033968f 100644
--- a/app/inventory/forms.py
+++ b/app/inventory/forms.py
@@ -16,7 +16,8 @@ from .. import utils, models
 
 
 class AttributeForm(CSEntryForm):
-    name = StringField('name', validators=[validators.DataRequired()])
+    name = StringField('Name', validators=[validators.DataRequired()])
+    description = StringField('Description')
 
 
 class ItemForm(CSEntryForm):
diff --git a/app/inventory/views.py b/app/inventory/views.py
index 70746c3ef29f95b4a2791bb14c269b74e046b7cb..3978a6dc84caf895407718d57d316aed098fde4f 100644
--- a/app/inventory/views.py
+++ b/app/inventory/views.py
@@ -157,7 +157,8 @@ def attributes(kind):
     form = AttributeForm()
     if form.validate_on_submit():
         model = getattr(models, kind)
-        new_model = model(name=form.name.data)
+        new_model = model(name=form.name.data,
+                          description=form.description.data or None)
         db.session.add(new_model)
         try:
             db.session.commit()
@@ -178,5 +179,5 @@ def retrieve_attributes_name(kind):
     except AttributeError:
         raise utils.CSEntryError(f"Unknown model '{kind}'", status_code=422)
     items = db.session.query(model).order_by(model.name)
-    data = [[item.name] for item in items]
+    data = [(item.name, item.description) for item in items]
     return jsonify(data=data)
diff --git a/app/models.py b/app/models.py
index 47888491664e9e4f33e1fecda86113a8be8987ce..2570421c0f0e054868264bbfb1ce93b322bd7ce1 100644
--- a/app/models.py
+++ b/app/models.py
@@ -197,6 +197,7 @@ class Token(db.Model):
 class QRCodeMixin:
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(CIText, nullable=False, unique=True)
+    description = db.Column(db.Text)
 
     def image(self):
         """Return a QRCode image to identify a record
@@ -227,6 +228,7 @@ class QRCodeMixin:
         return {
             'id': self.id,
             'name': self.name,
+            'description': self.description,
             'qrcode': self.base64_image(),
         }
 
@@ -240,14 +242,8 @@ class Manufacturer(QRCodeMixin, db.Model):
 
 
 class Model(QRCodeMixin, db.Model):
-    description = db.Column(db.Text)
     items = db.relationship('Item', back_populates='model')
 
-    def to_dict(self):
-        d = super().to_dict()
-        d['description'] = self.description
-        return d
-
 
 class Location(QRCodeMixin, db.Model):
     items = db.relationship('Item', back_populates='location')
diff --git a/app/templates/inventory/attributes.html b/app/templates/inventory/attributes.html
index bd54f1bfaee3b7e19bff531d10a797c805a2c6ec..03501ee95ca0b9e945db79803b8cdd5639e48ac4 100644
--- a/app/templates/inventory/attributes.html
+++ b/app/templates/inventory/attributes.html
@@ -17,6 +17,7 @@
   <form id="attributeForm" method="POST">
     {{ form.hidden_tag() }}
     {{ render_field(form.name) }}
+    {{ render_field(form.description) }}
     <div class="form-group row">
       <div class="col-sm-10">
         <button type="submit" class="btn btn-primary">Create</button>
@@ -30,6 +31,7 @@
     <thead>
       <tr>
         <th>Name</th>
+        <th>Description</th>
       </tr>
     </thead>
   </table>
diff --git a/tests/functional/test_api.py b/tests/functional/test_api.py
index 2991814f6e8fefda1d6860e06183805a950daeef..ee9d0f2706d5df12978486603201db6414629a6d 100644
--- a/tests/functional/test_api.py
+++ b/tests/functional/test_api.py
@@ -180,9 +180,10 @@ def test_create_generic_model(endpoint, client, user_token):
     check_response_message(response, '(psycopg2.IntegrityError) duplicate key value violates unique constraint', 422)
     response = post(client, f'{API_URL}/{endpoint}', data={'name': 'FOO'}, token=user_token)
     check_response_message(response, '(psycopg2.IntegrityError) duplicate key value violates unique constraint', 422)
-    data = {'name': 'Bar'}
+    data = {'name': 'Bar', 'description': 'Bar description'}
     response = post(client, f'{API_URL}/{endpoint}', data=data, token=user_token)
     assert response.status_code == 201
+    assert response.json['description'] == 'Bar description'
     model = ENDPOINT_MODEL[endpoint]
     assert model.query.count() == 2
     response = get(client, f'{API_URL}/{endpoint}', user_token)