diff --git a/worblehat/__init__.py b/worblehat/__init__.py
index 53ece25..656c36b 100644
--- a/worblehat/__init__.py
+++ b/worblehat/__init__.py
@@ -6,7 +6,7 @@ from flask_admin.contrib.sqla import ModelView
 from os import environ, path
 from dotenv import load_dotenv
 
-from worblehat.database import db_session, init_db
+from worblehat.database import db_session, init_db, drop_db
 
 def create_app():
     app = Flask(__name__, instance_relative_config=True)
@@ -27,6 +27,54 @@ def configure_database(app):
         init_db()
         print("Initialized the database.")
 
+    @app.cli.command("resetdb")
+    def resetdb_command():
+        drop_db()
+        print("Cleared the database.")
+        init_db()
+        from worblehat.models.MediaType import MediaType
+        from worblehat.models.Bookcase import Bookcase
+        from worblehat.models.Location import Location
+        from worblehat.models.Language import Language
+
+        media_types = [
+            MediaType(name='Book', description='A physical book'),
+            MediaType(name='Comic', description='A comic book'),
+            MediaType(name='Video Game', description='A digital game for computers or games consoles'),
+            MediaType(name='Tabletop Game', description='A physical game with cards, boards or similar')
+        ]
+
+        bookcases = [
+            Bookcase(name='A', description='The first bookcase'),
+            Bookcase(name='B', description='The second bookcase'),
+        ]
+        
+        locations = [
+            Location(name='1-1', description='The first location', bookcase=bookcases[0]),
+            Location(name='1-2', description='The second location', bookcase=bookcases[0]),
+            Location(name='1-1', description='The first location', bookcase=bookcases[1]),
+            Location(name='1-2', description='The second location', bookcase=bookcases[1]),
+        ]
+
+        languages = [
+            Language(name='English', shortname='en'),
+            Language(name='Norwegian', shortname='no'),
+            Language(name='Japanese', shortname='ja'),
+            Language(name='Swedish', shortname='sv'),
+            Language(name='German', shortname='de'),
+            Language(name='Russian', shortname='ru'),
+            Language(name='Danish', shortname='da')
+        ]
+
+        db_session.add_all(media_types)
+        db_session.add_all(bookcases)
+        db_session.add_all(locations)
+        db_session.add_all(languages)
+        db_session.commit()
+        print("Added media types, bookcases and locations.")
+
+
+
     @app.teardown_appcontext
     def shutdown_session(exception=None):
         db_session.remove()
@@ -37,8 +85,12 @@ def configure_admin(app):
     from worblehat.models.Category import Category
     from worblehat.models.Item import Item
     from worblehat.models.MediaType import MediaType
+    from worblehat.models.Location import Location
+    from worblehat.models.Bookcase import Bookcase
 
     admin.add_view(ModelView(Category, db_session))
     admin.add_view(ModelView(Item, db_session))
     admin.add_view(ModelView(MediaType, db_session))
+    admin.add_view(ModelView(Location, db_session))
+    admin.add_view(ModelView(Bookcase, db_session))
 
diff --git a/worblehat/database.py b/worblehat/database.py
index bf9827e..28077ad 100644
--- a/worblehat/database.py
+++ b/worblehat/database.py
@@ -18,5 +18,12 @@ def init_db():
     from .models.Category import Category
     from .models.Item import Item
     from .models.MediaType import MediaType
+    from .models.Location import Location
+    from .models.Bookcase import Bookcase
+    from .models.Language import Language
 
     Base.metadata.create_all(bind=engine)
+
+
+def drop_db():
+    Base.metadata.drop_all(bind=engine)
diff --git a/worblehat/models/Bookcase.py b/worblehat/models/Bookcase.py
new file mode 100644
index 0000000..2a04509
--- /dev/null
+++ b/worblehat/models/Bookcase.py
@@ -0,0 +1,16 @@
+from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
+from sqlalchemy.orm import relationship
+from worblehat.database import Base
+
+
+class Bookcase(Base):
+    __tablename__ = 'bookcases'
+    id = Column(Integer, primary_key=True)
+    name = Column(String(10), nullable=False)
+    description = Column(String(255))
+
+    locations = relationship('Location', back_populates='bookcase')
+
+    def __repr__(self):
+        return '<Bookcase %r>' % self.name
+
diff --git a/worblehat/models/Category.py b/worblehat/models/Category.py
index 72d7b93..fefb62a 100644
--- a/worblehat/models/Category.py
+++ b/worblehat/models/Category.py
@@ -1,12 +1,18 @@
-from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
+from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Table
 from sqlalchemy.orm import relationship
 from worblehat.database import Base
 
+category_association = Table('category_association', Base.metadata,
+    Column('category_id', Integer, ForeignKey('categories.id')),
+    Column('item_id', Integer, ForeignKey('items.id'))
+)
+
 class Category(Base):
     __tablename__ = 'categories'
     id = Column(Integer, primary_key=True)
     name = Column(String(80), unique=True)
     description = Column(String(255))
 
+    items = relationship('Item', secondary=category_association, back_populates='categories')
     def __repr__(self):
         return '<Category %r>' % self.name
diff --git a/worblehat/models/Item.py b/worblehat/models/Item.py
index fe1bc2d..9185acb 100644
--- a/worblehat/models/Item.py
+++ b/worblehat/models/Item.py
@@ -1,6 +1,7 @@
 from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
 from sqlalchemy.orm import relationship
 from worblehat.database import Base
+from .Language import Language
 
 class Item(Base):
     __tablename__ = 'items'
@@ -13,6 +14,14 @@ class Item(Base):
     media_id = Column(Integer, ForeignKey('media_types.id'), nullable=False)
     media = relationship('MediaType', back_populates='items')
 
+    location_id = Column(Integer, ForeignKey('locations.id'), nullable=False)
+    location = relationship('Location', back_populates='items')
+
+    language_id = Column(Integer, ForeignKey('languages.id'), nullable=False)
+    language = relationship('Language', back_populates='items')
+    
+    categories = relationship('Category', secondary='category_association', back_populates='items')
+
     def __repr__(self):
         return '<Item %r / %r>' % (self.media.name, self.title)
 
diff --git a/worblehat/models/Language.py b/worblehat/models/Language.py
new file mode 100644
index 0000000..05d53bf
--- /dev/null
+++ b/worblehat/models/Language.py
@@ -0,0 +1,16 @@
+from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
+from sqlalchemy.orm import relationship
+from worblehat.database import Base
+
+class Language(Base):
+    __tablename__ = 'languages'
+    id = Column(Integer, primary_key=True)
+
+    name = Column(String(32), nullable=False)
+    shortname = Column(String(2), nullable=False)
+    flag = Column(String(2))
+
+    items = relationship('Item', back_populates='language')
+
+    def __repr__(self):
+        return '<Language %r>' % self.name
diff --git a/worblehat/models/Location.py b/worblehat/models/Location.py
new file mode 100644
index 0000000..a923785
--- /dev/null
+++ b/worblehat/models/Location.py
@@ -0,0 +1,19 @@
+from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
+from sqlalchemy.orm import relationship
+from worblehat.database import Base
+
+
+class Location(Base):
+    __tablename__ = 'locations'
+    id = Column(Integer, primary_key=True)
+    name = Column(String(100), nullable=False)
+    description = Column(String(255))
+
+    bookcase_id = Column(Integer, ForeignKey('bookcases.id'), nullable=False)
+    bookcase = relationship('Bookcase', back_populates='locations')
+
+    items = relationship('Item', back_populates='location')
+
+    def __repr__(self):
+        return '<Location %s %s>' % (self.bookcase.name, self.name)
+