diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3c1ac56..5173cbe 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,2 +1,12 @@
-# Configuration file
-# key = value
\ No newline at end of file
+quarkus.datasource.driver = org.postgresql.Driver
+quarkus.datasource.max-size = 8
+quarkus.datasource.min-size = 0
+
+#quarkus.flyway.migrate-at-start = true
+#quarkus.flyway.baseline-on-migrate = true
+#quarkus.flyway.baseline-version = 1
+#quarkus.flyway.schemas = public
+
+%dev.quarkus.datasource.url = jdbc:postgresql://localhost:5432/flep
+%dev.quarkus.datasource.username = mulk
+%dev.quarkus.datasource.password =
diff --git a/src/main/scala/eu/mulk/entity/Article.java b/src/main/scala/eu/mulk/entity/Article.java
new file mode 100644
index 0000000..6fc6794
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/Article.java
@@ -0,0 +1,108 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "articles", schema = "public", catalog = "mulkcms")
+public class Article extends PanacheEntityBase {
+
+  private int id;
+  private Collection<ArticleAlias> aliases;
+  private Collection<ArticleCategoryMembership> categoryMemberships;
+  private Collection<ArticleRevision> revisions;
+  private ArticleType type;
+  private Collection<Comment> comments;
+  private Collection<JournalEntry> journalEntries;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Article article = (Article) o;
+    return id == article.id;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id);
+  }
+
+  @OneToMany(mappedBy = "article")
+  public Collection<ArticleAlias> getAliases() {
+    return aliases;
+  }
+
+  public void setAliases(Collection<ArticleAlias> aliases) {
+    this.aliases = aliases;
+  }
+
+  @OneToMany(mappedBy = "article")
+  public Collection<ArticleCategoryMembership> getCategoryMemberships() {
+    return categoryMemberships;
+  }
+
+  public void setCategoryMemberships(
+      Collection<ArticleCategoryMembership> categoryMemberships) {
+    this.categoryMemberships = categoryMemberships;
+  }
+
+  @OneToMany(mappedBy = "article")
+  public Collection<ArticleRevision> getRevisions() {
+    return revisions;
+  }
+
+  public void setRevisions(Collection<ArticleRevision> revisions) {
+    this.revisions = revisions;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "type", referencedColumnName = "id", nullable = false)
+  public ArticleType getType() {
+    return type;
+  }
+
+  public void setType(ArticleType type) {
+    this.type = type;
+  }
+
+  @OneToMany(mappedBy = "article")
+  public Collection<Comment> getComments() {
+    return comments;
+  }
+
+  public void setComments(Collection<Comment> comments) {
+    this.comments = comments;
+  }
+
+  @OneToMany(mappedBy = "article")
+  public Collection<JournalEntry> getJournalEntries() {
+    return journalEntries;
+  }
+
+  public void setJournalEntries(Collection<JournalEntry> journalEntries) {
+    this.journalEntries = journalEntries;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleAlias.java b/src/main/scala/eu/mulk/entity/ArticleAlias.java
new file mode 100644
index 0000000..7599984
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleAlias.java
@@ -0,0 +1,55 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_aliases", schema = "public", catalog = "mulkcms")
+public class ArticleAlias extends PanacheEntityBase {
+
+  private String alias;
+  private Article article;
+
+  @Id
+  @Column(name = "alias", nullable = false, length = -1)
+  public String getAlias() {
+    return alias;
+  }
+
+  public void setAlias(String alias) {
+    this.alias = alias;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleAlias that = (ArticleAlias) o;
+    return Objects.equals(alias, that.alias);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(alias);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "article", referencedColumnName = "id", nullable = false)
+  public Article getArticle() {
+    return article;
+  }
+
+  public void setArticle(Article article) {
+    this.article = article;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleBranchTip.java b/src/main/scala/eu/mulk/entity/ArticleBranchTip.java
new file mode 100644
index 0000000..5bbb0a8
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleBranchTip.java
@@ -0,0 +1,59 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_branch_tips", schema = "public", catalog = "mulkcms")
+@IdClass(ArticleBranchTipPK.class)
+public class ArticleBranchTip extends PanacheEntityBase {
+
+  private Integer articleId;
+  private Integer revisionId;
+
+  @Basic
+  @Column(name = "article", nullable = true)
+  @Id
+  public Integer getArticleId() {
+    return articleId;
+  }
+
+  public void setArticleId(Integer articleId) {
+    this.articleId = articleId;
+  }
+
+  @Basic
+  @Column(name = "revision", nullable = true)
+  @Id
+  public Integer getRevisionId() {
+    return revisionId;
+  }
+
+  public void setRevisionId(Integer revision) {
+    this.revisionId = revision;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleBranchTip that = (ArticleBranchTip) o;
+    return Objects.equals(articleId, that.articleId) &&
+        Objects.equals(revisionId, that.revisionId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(articleId, revisionId);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleBranchTipPK.java b/src/main/scala/eu/mulk/entity/ArticleBranchTipPK.java
new file mode 100644
index 0000000..bab4247
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleBranchTipPK.java
@@ -0,0 +1,32 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class ArticleBranchTipPK implements Serializable {
+
+  private int articleId;
+  private int revisionId;
+
+  @Id
+  @Column(name = "article", nullable = false)
+  public int getArticleId() {
+    return articleId;
+  }
+
+  @Id
+  @Column(name = "revision", nullable = false)
+  public int getRevisionId() {
+    return revisionId;
+  }
+
+  public void setArticleId(int articleId) {
+    this.articleId = articleId;
+  }
+
+  public void setRevisionId(int revisionId) {
+    this.revisionId = revisionId;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleCategoryMembership.java b/src/main/scala/eu/mulk/entity/ArticleCategoryMembership.java
new file mode 100644
index 0000000..dd5982d
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleCategoryMembership.java
@@ -0,0 +1,69 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_category_memberships", schema = "public", catalog = "mulkcms")
+@IdClass(ArticleCategoryMembershipPK.class)
+public class ArticleCategoryMembership extends PanacheEntityBase {
+
+  private int articleId;
+  private String category;
+  private Article article;
+
+  @Id
+  @Column(name = "article", nullable = false)
+  public int getArticleId() {
+    return articleId;
+  }
+
+  public void setArticleId(int articleId) {
+    this.articleId = articleId;
+  }
+
+  @Id
+  @Column(name = "category", nullable = false, length = -1)
+  public String getCategory() {
+    return category;
+  }
+
+  public void setCategory(String category) {
+    this.category = category;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleCategoryMembership that = (ArticleCategoryMembership) o;
+    return articleId == that.articleId &&
+        Objects.equals(category, that.category);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(articleId, category);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "article", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public Article getArticle() {
+    return article;
+  }
+
+  public void setArticle(Article article) {
+    this.article = article;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleCategoryMembershipPK.java b/src/main/scala/eu/mulk/entity/ArticleCategoryMembershipPK.java
new file mode 100644
index 0000000..97ee625
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleCategoryMembershipPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class ArticleCategoryMembershipPK implements Serializable {
+
+  private int articleId;
+  private String category;
+
+  @Column(name = "article", nullable = false)
+  @Id
+  public int getArticleId() {
+    return articleId;
+  }
+
+  public void setArticleId(int articleId) {
+    this.articleId = articleId;
+  }
+
+  @Column(name = "category", nullable = false, length = -1)
+  @Id
+  public String getCategory() {
+    return category;
+  }
+
+  public void setCategory(String category) {
+    this.category = category;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleCategoryMembershipPK that = (ArticleCategoryMembershipPK) o;
+    return articleId == that.articleId &&
+        Objects.equals(category, that.category);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(articleId, category);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleCommentCount.java b/src/main/scala/eu/mulk/entity/ArticleCommentCount.java
new file mode 100644
index 0000000..283a7f4
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleCommentCount.java
@@ -0,0 +1,56 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_comment_counts", schema = "public", catalog = "mulkcms")
+public class ArticleCommentCount extends PanacheEntityBase {
+
+  @Id
+  private Integer article;
+  private Long commentCount;
+
+  @Basic
+  @Column(name = "article", nullable = true)
+  public Integer getArticle() {
+    return article;
+  }
+
+  public void setArticle(Integer article) {
+    this.article = article;
+  }
+
+  @Basic
+  @Column(name = "comment_count", nullable = true)
+  public Long getCommentCount() {
+    return commentCount;
+  }
+
+  public void setCommentCount(Long commentCount) {
+    this.commentCount = commentCount;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleCommentCount that = (ArticleCommentCount) o;
+    return Objects.equals(article, that.article) &&
+        Objects.equals(commentCount, that.commentCount);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(article, commentCount);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticlePublishingDate.java b/src/main/scala/eu/mulk/entity/ArticlePublishingDate.java
new file mode 100644
index 0000000..cc311b7
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticlePublishingDate.java
@@ -0,0 +1,57 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.sql.Timestamp;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_publishing_dates", schema = "public", catalog = "mulkcms")
+public class ArticlePublishingDate extends PanacheEntityBase {
+
+  @Id
+  private Integer article;
+  private Timestamp publishingDate;
+
+  @Basic
+  @Column(name = "article", nullable = true)
+  public Integer getArticle() {
+    return article;
+  }
+
+  public void setArticle(Integer article) {
+    this.article = article;
+  }
+
+  @Basic
+  @Column(name = "publishing_date", nullable = true)
+  public Timestamp getPublishingDate() {
+    return publishingDate;
+  }
+
+  public void setPublishingDate(Timestamp publishingDate) {
+    this.publishingDate = publishingDate;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticlePublishingDate that = (ArticlePublishingDate) o;
+    return Objects.equals(article, that.article) &&
+        Objects.equals(publishingDate, that.publishingDate);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(article, publishingDate);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleRevision.java b/src/main/scala/eu/mulk/entity/ArticleRevision.java
new file mode 100644
index 0000000..278c304
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleRevision.java
@@ -0,0 +1,173 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_revisions", schema = "public", catalog = "mulkcms")
+public class ArticleRevision extends PanacheEntityBase {
+
+  private int id;
+  private Timestamp date;
+  private String title;
+  private String content;
+  private String format;
+  private String status;
+  private String globalId;
+  private Collection<ArticleRevisionCharacteristic> characteristics;
+  private Collection<ArticleRevisionParenthood> children;
+  private Collection<ArticleRevisionParenthood> parents;
+  private Article article;
+  private User authors;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = true)
+  public Timestamp getDate() {
+    return date;
+  }
+
+  public void setDate(Timestamp date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "title", nullable = false, length = -1)
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  @Basic
+  @Column(name = "content", nullable = false, length = -1)
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  @Basic
+  @Column(name = "format", nullable = false, length = -1)
+  public String getFormat() {
+    return format;
+  }
+
+  public void setFormat(String format) {
+    this.format = format;
+  }
+
+  @Basic
+  @Column(name = "status", nullable = false, length = -1)
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @Basic
+  @Column(name = "global_id", nullable = true, length = -1)
+  public String getGlobalId() {
+    return globalId;
+  }
+
+  public void setGlobalId(String globalId) {
+    this.globalId = globalId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleRevision that = (ArticleRevision) o;
+    return id == that.id &&
+        Objects.equals(date, that.date) &&
+        Objects.equals(title, that.title) &&
+        Objects.equals(content, that.content) &&
+        Objects.equals(format, that.format) &&
+        Objects.equals(status, that.status) &&
+        Objects.equals(globalId, that.globalId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, date, title, content, format, status, globalId);
+  }
+
+  @OneToMany(mappedBy = "articleRevision")
+  public Collection<ArticleRevisionCharacteristic> getCharacteristics() {
+    return characteristics;
+  }
+
+  public void setCharacteristics(
+      Collection<ArticleRevisionCharacteristic> characteristics) {
+    this.characteristics = characteristics;
+  }
+
+  @OneToMany(mappedBy = "parent")
+  public Collection<ArticleRevisionParenthood> getChildren() {
+    return children;
+  }
+
+  public void setChildren(Collection<ArticleRevisionParenthood> children) {
+    this.children = children;
+  }
+
+  @OneToMany(mappedBy = "child")
+  public Collection<ArticleRevisionParenthood> getParents() {
+    return parents;
+  }
+
+  public void setParents(Collection<ArticleRevisionParenthood> parents) {
+    this.parents = parents;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "article", referencedColumnName = "id", nullable = false)
+  public Article getArticle() {
+    return article;
+  }
+
+  public void setArticle(Article article) {
+    this.article = article;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "author", referencedColumnName = "id")
+  public User getAuthors() {
+    return authors;
+  }
+
+  public void setAuthors(User authors) {
+    this.authors = authors;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristic.java b/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristic.java
new file mode 100644
index 0000000..8cc0661
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristic.java
@@ -0,0 +1,83 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_revision_characteristics", schema = "public", catalog = "mulkcms")
+@IdClass(ArticleRevisionCharacteristicPK.class)
+public class ArticleRevisionCharacteristic extends PanacheEntityBase {
+
+  private String characteristic;
+  private int articleRevisionId;
+
+  private ArticleRevision articleRevision;
+  private String value;
+
+  @Basic
+  @Column(name = "characteristic", nullable = false, length = -1)
+  @Id
+  public String getCharacteristic() {
+    return characteristic;
+  }
+
+  public void setCharacteristic(String characteristic) {
+    this.characteristic = characteristic;
+  }
+
+  @Basic
+  @Column(name = "value", nullable = true, length = -1)
+  public String getValue() {
+    return value;
+  }
+
+  public void setValue(String value) {
+    this.value = value;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleRevisionCharacteristic that = (ArticleRevisionCharacteristic) o;
+    return Objects.equals(characteristic, that.characteristic) &&
+        Objects.equals(value, that.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(characteristic, value);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "revision", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public ArticleRevision getArticleRevision() {
+    return articleRevision;
+  }
+
+  public void setArticleRevision(ArticleRevision articleRevision) {
+    this.articleRevision = articleRevision;
+  }
+
+  @Id
+  @Column(name = "revision", nullable = false)
+  public int getArticleRevisionId() {
+    return articleRevisionId;
+  }
+
+  public void setArticleRevisionId(int articleRevisionId) {
+    this.articleRevisionId = articleRevisionId;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristicPK.java b/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristicPK.java
new file mode 100644
index 0000000..5e28967
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleRevisionCharacteristicPK.java
@@ -0,0 +1,27 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+
+public class ArticleRevisionCharacteristicPK implements Serializable {
+  private String characteristic;
+  private int articleRevisionId;
+
+  @Id
+  public String getCharacteristic() {
+    return characteristic;
+  }
+
+  public void setCharacteristic(String characteristic) {
+    this.characteristic = characteristic;
+  }
+
+  @Id
+  public int getArticleRevisionId() {
+    return articleRevisionId;
+  }
+
+  public void setArticleRevisionId(int articleRevisionId) {
+    this.articleRevisionId = articleRevisionId;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleRevisionParenthood.java b/src/main/scala/eu/mulk/entity/ArticleRevisionParenthood.java
new file mode 100644
index 0000000..823ca09
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleRevisionParenthood.java
@@ -0,0 +1,80 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_revision_parenthood", schema = "public", catalog = "mulkcms")
+@IdClass(ArticleRevisionParenthoodPK.class)
+public class ArticleRevisionParenthood extends PanacheEntityBase {
+
+  private int parentId;
+  private int childId;
+  private ArticleRevision parent;
+  private ArticleRevision child;
+
+  @Id
+  @Column(name = "parent", nullable = false)
+  public int getParentId() {
+    return parentId;
+  }
+
+  public void setParentId(int parentId) {
+    this.parentId = parentId;
+  }
+
+  @Id
+  @Column(name = "child", nullable = false)
+  public int getChildId() {
+    return childId;
+  }
+
+  public void setChildId(int childId) {
+    this.childId = childId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleRevisionParenthood that = (ArticleRevisionParenthood) o;
+    return parentId == that.parentId &&
+        childId == that.childId;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(parentId, childId);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "parent", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public ArticleRevision getParent() {
+    return parent;
+  }
+
+  public void setParent(ArticleRevision parent) {
+    this.parent = parent;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "child", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public ArticleRevision getChild() {
+    return child;
+  }
+
+  public void setChild(ArticleRevision child) {
+    this.child = child;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleRevisionParenthoodPK.java b/src/main/scala/eu/mulk/entity/ArticleRevisionParenthoodPK.java
new file mode 100644
index 0000000..ecb918c
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleRevisionParenthoodPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class ArticleRevisionParenthoodPK implements Serializable {
+
+  private int parentId;
+  private int childId;
+
+  @Column(name = "parent", nullable = false)
+  @Id
+  public int getParentId() {
+    return parentId;
+  }
+
+  public void setParentId(int parentId) {
+    this.parentId = parentId;
+  }
+
+  @Column(name = "child", nullable = false)
+  @Id
+  public int getChildId() {
+    return childId;
+  }
+
+  public void setChildId(int childId) {
+    this.childId = childId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleRevisionParenthoodPK that = (ArticleRevisionParenthoodPK) o;
+    return parentId == that.parentId &&
+        childId == that.childId;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(parentId, childId);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/ArticleType.java b/src/main/scala/eu/mulk/entity/ArticleType.java
new file mode 100644
index 0000000..4bc5e08
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/ArticleType.java
@@ -0,0 +1,79 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "article_types", schema = "public", catalog = "mulkcms")
+public class ArticleType extends PanacheEntityBase {
+
+  private int id;
+  private String name;
+  private String pageTemplate;
+  private Collection<Article> articles;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "name", nullable = true, length = -1)
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Basic
+  @Column(name = "page_template", nullable = true, length = -1)
+  public String getPageTemplate() {
+    return pageTemplate;
+  }
+
+  public void setPageTemplate(String pageTemplate) {
+    this.pageTemplate = pageTemplate;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ArticleType that = (ArticleType) o;
+    return id == that.id &&
+        Objects.equals(name, that.name) &&
+        Objects.equals(pageTemplate, that.pageTemplate);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, name, pageTemplate);
+  }
+
+  @OneToMany(mappedBy = "type")
+  public Collection<Article> getArticles() {
+    return articles;
+  }
+
+  public void setArticles(Collection<Article> articles) {
+    this.articles = articles;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/CachedPage.java b/src/main/scala/eu/mulk/entity/CachedPage.java
new file mode 100644
index 0000000..0ef1d73
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/CachedPage.java
@@ -0,0 +1,82 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.sql.Timestamp;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "cached_pages", schema = "public", catalog = "mulkcms")
+@IdClass(CachedPagePK.class)
+public class CachedPage extends PanacheEntityBase {
+
+  private String alias;
+  private int characteristicHash;
+  private Timestamp date;
+  private String content;
+
+  @Id
+  @Column(name = "alias", nullable = false, length = -1)
+  public String getAlias() {
+    return alias;
+  }
+
+  public void setAlias(String alias) {
+    this.alias = alias;
+  }
+
+  @Id
+  @Column(name = "characteristic_hash", nullable = false)
+  public int getCharacteristicHash() {
+    return characteristicHash;
+  }
+
+  public void setCharacteristicHash(int characteristicHash) {
+    this.characteristicHash = characteristicHash;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = false)
+  public Timestamp getDate() {
+    return date;
+  }
+
+  public void setDate(Timestamp date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "content", nullable = false, length = -1)
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CachedPage that = (CachedPage) o;
+    return characteristicHash == that.characteristicHash &&
+        Objects.equals(alias, that.alias) &&
+        Objects.equals(date, that.date) &&
+        Objects.equals(content, that.content);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(alias, characteristicHash, date, content);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/CachedPagePK.java b/src/main/scala/eu/mulk/entity/CachedPagePK.java
new file mode 100644
index 0000000..43793bb
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/CachedPagePK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class CachedPagePK implements Serializable {
+
+  private String alias;
+  private int characteristicHash;
+
+  @Column(name = "alias", nullable = false, length = -1)
+  @Id
+  public String getAlias() {
+    return alias;
+  }
+
+  public void setAlias(String alias) {
+    this.alias = alias;
+  }
+
+  @Column(name = "characteristic_hash", nullable = false)
+  @Id
+  public int getCharacteristicHash() {
+    return characteristicHash;
+  }
+
+  public void setCharacteristicHash(int characteristicHash) {
+    this.characteristicHash = characteristicHash;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CachedPagePK that = (CachedPagePK) o;
+    return characteristicHash == that.characteristicHash &&
+        Objects.equals(alias, that.alias);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(alias, characteristicHash);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/Category.java b/src/main/scala/eu/mulk/entity/Category.java
new file mode 100644
index 0000000..d74ccfb
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/Category.java
@@ -0,0 +1,77 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "categories", schema = "public", catalog = "mulkcms")
+public class Category extends PanacheEntityBase {
+
+  private int id;
+  private String name;
+  private Collection<CategoryInclusion> supercategories;
+  private Collection<CategoryInclusion> subcategories;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "name", nullable = false, length = -1)
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Category category = (Category) o;
+    return id == category.id &&
+        Objects.equals(name, category.name);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, name);
+  }
+
+  @OneToMany(mappedBy = "subcategory")
+  public Collection<CategoryInclusion> getSupercategories() {
+    return supercategories;
+  }
+
+  public void setSupercategories(Collection<CategoryInclusion> supercategories) {
+    this.supercategories = supercategories;
+  }
+
+  @OneToMany(mappedBy = "supercategory")
+  public Collection<CategoryInclusion> getSubcategories() {
+    return subcategories;
+  }
+
+  public void setSubcategories(Collection<CategoryInclusion> subcategories) {
+    this.subcategories = subcategories;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/CategoryInclusion.java b/src/main/scala/eu/mulk/entity/CategoryInclusion.java
new file mode 100644
index 0000000..387615f
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/CategoryInclusion.java
@@ -0,0 +1,80 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "category_inclusions", schema = "public", catalog = "mulkcms")
+@IdClass(CategoryInclusionPK.class)
+public class CategoryInclusion extends PanacheEntityBase {
+
+  private int subcategoryId;
+  private int supercategoryId;
+  private Category subcategory;
+  private Category supercategory;
+
+  @Id
+  @Column(name = "category", nullable = false)
+  public int getSubcategoryId() {
+    return subcategoryId;
+  }
+
+  public void setSubcategoryId(int subcategoryId) {
+    this.subcategoryId = subcategoryId;
+  }
+
+  @Id
+  @Column(name = "supercategory", nullable = false)
+  public int getSupercategoryId() {
+    return supercategoryId;
+  }
+
+  public void setSupercategoryId(int supercategoryId) {
+    this.supercategoryId = supercategoryId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CategoryInclusion that = (CategoryInclusion) o;
+    return subcategoryId == that.subcategoryId &&
+        supercategoryId == that.supercategoryId;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(subcategoryId, supercategoryId);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "category", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public Category getSubcategory() {
+    return subcategory;
+  }
+
+  public void setSubcategory(Category subcategory) {
+    this.subcategory = subcategory;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "supercategory", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public Category getSupercategory() {
+    return supercategory;
+  }
+
+  public void setSupercategory(Category supercategory) {
+    this.supercategory = supercategory;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/CategoryInclusionPK.java b/src/main/scala/eu/mulk/entity/CategoryInclusionPK.java
new file mode 100644
index 0000000..6ca2e03
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/CategoryInclusionPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class CategoryInclusionPK implements Serializable {
+
+  private int subcategoryId;
+  private int supercategoryId;
+
+  @Column(name = "category", nullable = false)
+  @Id
+  public int getSubcategoryId() {
+    return subcategoryId;
+  }
+
+  public void setSubcategoryId(int subcategoryId) {
+    this.subcategoryId = subcategoryId;
+  }
+
+  @Column(name = "supercategory", nullable = false)
+  @Id
+  public int getSupercategoryId() {
+    return supercategoryId;
+  }
+
+  public void setSupercategoryId(int supercategoryId) {
+    this.supercategoryId = supercategoryId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CategoryInclusionPK that = (CategoryInclusionPK) o;
+    return subcategoryId == that.subcategoryId &&
+        supercategoryId == that.supercategoryId;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(subcategoryId, supercategoryId);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/Comment.java b/src/main/scala/eu/mulk/entity/Comment.java
new file mode 100644
index 0000000..4a32706
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/Comment.java
@@ -0,0 +1,80 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "comments", schema = "public", catalog = "mulkcms")
+public class Comment extends PanacheEntityBase {
+
+  private int id;
+  private String globalId;
+  private Collection<CommentRevision> revisions;
+  private Article article;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "global_id", nullable = true, length = -1)
+  public String getGlobalId() {
+    return globalId;
+  }
+
+  public void setGlobalId(String globalId) {
+    this.globalId = globalId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Comment comment = (Comment) o;
+    return id == comment.id &&
+        Objects.equals(globalId, comment.globalId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, globalId);
+  }
+
+  @OneToMany(mappedBy = "comment")
+  public Collection<CommentRevision> getRevisions() {
+    return revisions;
+  }
+
+  public void setRevisions(Collection<CommentRevision> revisions) {
+    this.revisions = revisions;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "article", referencedColumnName = "id", nullable = false)
+  public Article getArticle() {
+    return article;
+  }
+
+  public void setArticle(Article article) {
+    this.article = article;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/CommentRevision.java b/src/main/scala/eu/mulk/entity/CommentRevision.java
new file mode 100644
index 0000000..c5b7bcd
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/CommentRevision.java
@@ -0,0 +1,160 @@
+package eu.mulk.entity;
+
+import com.vladmihalcea.hibernate.type.basic.Inet;
+import com.vladmihalcea.hibernate.type.basic.PostgreSQLInetType;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.sql.Timestamp;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import org.hibernate.annotations.TypeDef;
+
+@Entity
+@Table(name = "comment_revisions", schema = "public", catalog = "mulkcms")
+@TypeDef(
+    name = "inet",
+    typeClass = PostgreSQLInetType.class,
+    defaultForType = Inet.class
+)
+public class CommentRevision extends PanacheEntityBase {
+
+  private int id;
+  private Timestamp date;
+  private String content;
+  private String format;
+  private String status;
+  private Integer articleRevision;
+  private Inet submitterIp;
+  private String submitterUserAgent;
+  private Comment comment;
+  private User user;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = true)
+  public Timestamp getDate() {
+    return date;
+  }
+
+  public void setDate(Timestamp date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "content", nullable = false, length = -1)
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  @Basic
+  @Column(name = "format", nullable = false, length = -1)
+  public String getFormat() {
+    return format;
+  }
+
+  public void setFormat(String format) {
+    this.format = format;
+  }
+
+  @Basic
+  @Column(name = "status", nullable = false, length = -1)
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @Basic
+  @Column(name = "article_revision", nullable = true)
+  public Integer getArticleRevision() {
+    return articleRevision;
+  }
+
+  public void setArticleRevision(Integer articleRevision) {
+    this.articleRevision = articleRevision;
+  }
+
+  @Column(name = "submitter_ip", nullable = true, columnDefinition = "inet")
+  public Inet getSubmitterIp() {
+    return submitterIp;
+  }
+
+  public void setSubmitterIp(Inet submitterIp) {
+    this.submitterIp = submitterIp;
+  }
+
+  @Basic
+  @Column(name = "submitter_user_agent", nullable = true, length = -1)
+  public String getSubmitterUserAgent() {
+    return submitterUserAgent;
+  }
+
+  public void setSubmitterUserAgent(String submitterUserAgent) {
+    this.submitterUserAgent = submitterUserAgent;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommentRevision that = (CommentRevision) o;
+    return id == that.id &&
+        Objects.equals(date, that.date) &&
+        Objects.equals(content, that.content) &&
+        Objects.equals(format, that.format) &&
+        Objects.equals(status, that.status) &&
+        Objects.equals(articleRevision, that.articleRevision) &&
+        Objects.equals(submitterIp, that.submitterIp) &&
+        Objects.equals(submitterUserAgent, that.submitterUserAgent);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects
+        .hash(id, date, content, format, status, articleRevision, submitterIp, submitterUserAgent);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "comment", referencedColumnName = "id", nullable = false)
+  public Comment getComment() {
+    return comment;
+  }
+
+  public void setComment(Comment comment) {
+    this.comment = comment;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "author", referencedColumnName = "id")
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/Journal.java b/src/main/scala/eu/mulk/entity/Journal.java
new file mode 100644
index 0000000..63447df
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/Journal.java
@@ -0,0 +1,67 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journals", schema = "public", catalog = "mulkcms")
+public class Journal extends PanacheEntityBase {
+
+  private int id;
+  private String pathPrefix;
+  private Collection<JournalEntry> entries;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "path_prefix", nullable = true, length = -1)
+  public String getPathPrefix() {
+    return pathPrefix;
+  }
+
+  public void setPathPrefix(String pathPrefix) {
+    this.pathPrefix = pathPrefix;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Journal journal = (Journal) o;
+    return id == journal.id &&
+        Objects.equals(pathPrefix, journal.pathPrefix);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, pathPrefix);
+  }
+
+  @OneToMany(mappedBy = "journal")
+  public Collection<JournalEntry> getEntries() {
+    return entries;
+  }
+
+  public void setEntries(Collection<JournalEntry> entries) {
+    this.entries = entries;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/JournalEntry.java b/src/main/scala/eu/mulk/entity/JournalEntry.java
new file mode 100644
index 0000000..1c4040e
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/JournalEntry.java
@@ -0,0 +1,80 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_entries", schema = "public", catalog = "mulkcms")
+@IdClass(JournalEntryPK.class)
+public class JournalEntry extends PanacheEntityBase {
+
+  private int journalId;
+  private int index;
+  private Journal journal;
+  private Article article;
+
+  @Id
+  @Column(name = "journal", nullable = false)
+  public int getJournalId() {
+    return journalId;
+  }
+
+  public void setJournalId(int journalId) {
+    this.journalId = journalId;
+  }
+
+  @Id
+  @Column(name = "index", nullable = false)
+  public int getIndex() {
+    return index;
+  }
+
+  public void setIndex(int index) {
+    this.index = index;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    JournalEntry that = (JournalEntry) o;
+    return journalId == that.journalId &&
+        index == that.index;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(journalId, index);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "journal", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public Journal getJournal() {
+    return journal;
+  }
+
+  public void setJournal(Journal journal) {
+    this.journal = journal;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "article", referencedColumnName = "id", nullable = false)
+  public Article getArticle() {
+    return article;
+  }
+
+  public void setArticle(Article article) {
+    this.article = article;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/JournalEntryPK.java b/src/main/scala/eu/mulk/entity/JournalEntryPK.java
new file mode 100644
index 0000000..189d94f
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/JournalEntryPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class JournalEntryPK implements Serializable {
+
+  private int journalId;
+  private int index;
+
+  @Column(name = "journal", nullable = false)
+  @Id
+  public int getJournalId() {
+    return journalId;
+  }
+
+  public void setJournalId(int journalId) {
+    this.journalId = journalId;
+  }
+
+  @Column(name = "index", nullable = false)
+  @Id
+  public int getIndex() {
+    return index;
+  }
+
+  public void setIndex(int index) {
+    this.index = index;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    JournalEntryPK that = (JournalEntryPK) o;
+    return journalId == that.journalId &&
+        index == that.index;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(journalId, index);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LegacyJournalCategory.java b/src/main/scala/eu/mulk/entity/LegacyJournalCategory.java
new file mode 100644
index 0000000..35b0587
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LegacyJournalCategory.java
@@ -0,0 +1,55 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_category", schema = "public", catalog = "mulkcms")
+public class LegacyJournalCategory extends PanacheEntityBase {
+
+  private int id;
+  private String uuid;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "uuid", nullable = false, length = 36)
+  public String getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(String uuid) {
+    this.uuid = uuid;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LegacyJournalCategory that = (LegacyJournalCategory) o;
+    return id == that.id &&
+        Objects.equals(uuid, that.uuid);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, uuid);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LegacyJournalComment.java b/src/main/scala/eu/mulk/entity/LegacyJournalComment.java
new file mode 100644
index 0000000..8e6cc25
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LegacyJournalComment.java
@@ -0,0 +1,165 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_comment", schema = "public", catalog = "mulkcms")
+public class LegacyJournalComment extends PanacheEntityBase {
+
+  private int id;
+  private String uuid;
+  private long date;
+  private String body;
+  private String author;
+  private String email;
+  private String website;
+  private Boolean spamP;
+  private String submitterIp;
+  private String submitterUserAgent;
+  private LegacyJournalEntry journalEntry;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "uuid", nullable = false, length = 36)
+  public String getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(String uuid) {
+    this.uuid = uuid;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = false)
+  public long getDate() {
+    return date;
+  }
+
+  public void setDate(long date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "body", nullable = false, length = -1)
+  public String getBody() {
+    return body;
+  }
+
+  public void setBody(String body) {
+    this.body = body;
+  }
+
+  @Basic
+  @Column(name = "author", nullable = true, length = -1)
+  public String getAuthor() {
+    return author;
+  }
+
+  public void setAuthor(String author) {
+    this.author = author;
+  }
+
+  @Basic
+  @Column(name = "email", nullable = true, length = -1)
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
+  @Basic
+  @Column(name = "website", nullable = true, length = -1)
+  public String getWebsite() {
+    return website;
+  }
+
+  public void setWebsite(String website) {
+    this.website = website;
+  }
+
+  @Basic
+  @Column(name = "spam_p", nullable = true)
+  public Boolean getSpamP() {
+    return spamP;
+  }
+
+  public void setSpamP(Boolean spamP) {
+    this.spamP = spamP;
+  }
+
+  @Basic
+  @Column(name = "submitter_ip", nullable = false, length = -1)
+  public String getSubmitterIp() {
+    return submitterIp;
+  }
+
+  public void setSubmitterIp(String submitterIp) {
+    this.submitterIp = submitterIp;
+  }
+
+  @Basic
+  @Column(name = "submitter_user_agent", nullable = false, length = -1)
+  public String getSubmitterUserAgent() {
+    return submitterUserAgent;
+  }
+
+  public void setSubmitterUserAgent(String submitterUserAgent) {
+    this.submitterUserAgent = submitterUserAgent;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LegacyJournalComment that = (LegacyJournalComment) o;
+    return id == that.id &&
+        date == that.date &&
+        Objects.equals(uuid, that.uuid) &&
+        Objects.equals(body, that.body) &&
+        Objects.equals(author, that.author) &&
+        Objects.equals(email, that.email) &&
+        Objects.equals(website, that.website) &&
+        Objects.equals(spamP, that.spamP) &&
+        Objects.equals(submitterIp, that.submitterIp) &&
+        Objects.equals(submitterUserAgent, that.submitterUserAgent);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects
+        .hash(id, uuid, date, body, author, email, website, spamP, submitterIp, submitterUserAgent);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "entry_id", referencedColumnName = "id", nullable = false)
+  public LegacyJournalEntry getJournalEntry() {
+    return journalEntry;
+  }
+
+  public void setJournalEntry(LegacyJournalEntry journalEntry) {
+    this.journalEntry = journalEntry;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LegacyJournalEntry.java b/src/main/scala/eu/mulk/entity/LegacyJournalEntry.java
new file mode 100644
index 0000000..341fdc0
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LegacyJournalEntry.java
@@ -0,0 +1,147 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_entry", schema = "public", catalog = "mulkcms")
+public class LegacyJournalEntry extends PanacheEntityBase {
+
+  private int id;
+  private String uuid;
+  private String title;
+  private long date;
+  private Long lastModification;
+  private String body;
+  private String type;
+  private Collection<LegacyJournalComment> comments;
+  private Collection<LegacyJournalPingback> pingbacks;
+  private Collection<LegacyJournalTrackback> trackbacks;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "uuid", nullable = false, length = 36)
+  public String getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(String uuid) {
+    this.uuid = uuid;
+  }
+
+  @Basic
+  @Column(name = "title", nullable = false, length = -1)
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = false)
+  public long getDate() {
+    return date;
+  }
+
+  public void setDate(long date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "last_modification", nullable = true)
+  public Long getLastModification() {
+    return lastModification;
+  }
+
+  public void setLastModification(Long lastModification) {
+    this.lastModification = lastModification;
+  }
+
+  @Basic
+  @Column(name = "body", nullable = false, length = -1)
+  public String getBody() {
+    return body;
+  }
+
+  public void setBody(String body) {
+    this.body = body;
+  }
+
+  @Basic
+  @Column(name = "type", nullable = false, length = -1)
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LegacyJournalEntry that = (LegacyJournalEntry) o;
+    return id == that.id &&
+        date == that.date &&
+        Objects.equals(uuid, that.uuid) &&
+        Objects.equals(title, that.title) &&
+        Objects.equals(lastModification, that.lastModification) &&
+        Objects.equals(body, that.body) &&
+        Objects.equals(type, that.type);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, uuid, title, date, lastModification, body, type);
+  }
+
+  @OneToMany(mappedBy = "journalEntry")
+  public Collection<LegacyJournalComment> getComments() {
+    return comments;
+  }
+
+  public void setComments(Collection<LegacyJournalComment> comments) {
+    this.comments = comments;
+  }
+
+  @OneToMany(mappedBy = "journalEntry")
+  public Collection<LegacyJournalPingback> getPingbacks() {
+    return pingbacks;
+  }
+
+  public void setPingbacks(Collection<LegacyJournalPingback> pingbacks) {
+    this.pingbacks = pingbacks;
+  }
+
+  @OneToMany(mappedBy = "journalEntry")
+  public Collection<LegacyJournalTrackback> getTrackbacks() {
+    return trackbacks;
+  }
+
+  public void setTrackbacks(Collection<LegacyJournalTrackback> trackbacks) {
+    this.trackbacks = trackbacks;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LegacyJournalPingback.java b/src/main/scala/eu/mulk/entity/LegacyJournalPingback.java
new file mode 100644
index 0000000..430518c
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LegacyJournalPingback.java
@@ -0,0 +1,128 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_pingback", schema = "public", catalog = "mulkcms")
+public class LegacyJournalPingback extends PanacheEntityBase {
+
+  private int id;
+  private String uuid;
+  private long date;
+  private String url;
+  private Boolean spamP;
+  private String submitterIp;
+  private String submitterUserAgent;
+  private LegacyJournalEntry journalEntry;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "uuid", nullable = false, length = 36)
+  public String getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(String uuid) {
+    this.uuid = uuid;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = false)
+  public long getDate() {
+    return date;
+  }
+
+  public void setDate(long date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "url", nullable = true, length = -1)
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  @Basic
+  @Column(name = "spam_p", nullable = true)
+  public Boolean getSpamP() {
+    return spamP;
+  }
+
+  public void setSpamP(Boolean spamP) {
+    this.spamP = spamP;
+  }
+
+  @Basic
+  @Column(name = "submitter_ip", nullable = false, length = -1)
+  public String getSubmitterIp() {
+    return submitterIp;
+  }
+
+  public void setSubmitterIp(String submitterIp) {
+    this.submitterIp = submitterIp;
+  }
+
+  @Basic
+  @Column(name = "submitter_user_agent", nullable = false, length = -1)
+  public String getSubmitterUserAgent() {
+    return submitterUserAgent;
+  }
+
+  public void setSubmitterUserAgent(String submitterUserAgent) {
+    this.submitterUserAgent = submitterUserAgent;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LegacyJournalPingback that = (LegacyJournalPingback) o;
+    return id == that.id &&
+        date == that.date &&
+        Objects.equals(uuid, that.uuid) &&
+        Objects.equals(url, that.url) &&
+        Objects.equals(spamP, that.spamP) &&
+        Objects.equals(submitterIp, that.submitterIp) &&
+        Objects.equals(submitterUserAgent, that.submitterUserAgent);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, uuid, date, url, spamP, submitterIp, submitterUserAgent);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "entry_id", referencedColumnName = "id", nullable = false)
+  public LegacyJournalEntry getJournalEntry() {
+    return journalEntry;
+  }
+
+  public void setJournalEntry(LegacyJournalEntry journalEntry) {
+    this.journalEntry = journalEntry;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LegacyJournalTrackback.java b/src/main/scala/eu/mulk/entity/LegacyJournalTrackback.java
new file mode 100644
index 0000000..278909f
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LegacyJournalTrackback.java
@@ -0,0 +1,166 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "journal_trackback", schema = "public", catalog = "mulkcms")
+public class LegacyJournalTrackback extends PanacheEntityBase {
+
+  private int id;
+  private String uuid;
+  private long date;
+  private String excerpt;
+  private String title;
+  private String blogName;
+  private String url;
+  private Boolean spamP;
+  private String submitterIp;
+  private String submitterUserAgent;
+  private LegacyJournalEntry journalEntry;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "uuid", nullable = false, length = 36)
+  public String getUuid() {
+    return uuid;
+  }
+
+  public void setUuid(String uuid) {
+    this.uuid = uuid;
+  }
+
+  @Basic
+  @Column(name = "date", nullable = false)
+  public long getDate() {
+    return date;
+  }
+
+  public void setDate(long date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "excerpt", nullable = false, length = -1)
+  public String getExcerpt() {
+    return excerpt;
+  }
+
+  public void setExcerpt(String excerpt) {
+    this.excerpt = excerpt;
+  }
+
+  @Basic
+  @Column(name = "title", nullable = true, length = -1)
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  @Basic
+  @Column(name = "blog_name", nullable = true, length = -1)
+  public String getBlogName() {
+    return blogName;
+  }
+
+  public void setBlogName(String blogName) {
+    this.blogName = blogName;
+  }
+
+  @Basic
+  @Column(name = "url", nullable = true, length = -1)
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  @Basic
+  @Column(name = "spam_p", nullable = true)
+  public Boolean getSpamP() {
+    return spamP;
+  }
+
+  public void setSpamP(Boolean spamP) {
+    this.spamP = spamP;
+  }
+
+  @Basic
+  @Column(name = "submitter_ip", nullable = false, length = -1)
+  public String getSubmitterIp() {
+    return submitterIp;
+  }
+
+  public void setSubmitterIp(String submitterIp) {
+    this.submitterIp = submitterIp;
+  }
+
+  @Basic
+  @Column(name = "submitter_user_agent", nullable = false, length = -1)
+  public String getSubmitterUserAgent() {
+    return submitterUserAgent;
+  }
+
+  public void setSubmitterUserAgent(String submitterUserAgent) {
+    this.submitterUserAgent = submitterUserAgent;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LegacyJournalTrackback that = (LegacyJournalTrackback) o;
+    return id == that.id &&
+        date == that.date &&
+        Objects.equals(uuid, that.uuid) &&
+        Objects.equals(excerpt, that.excerpt) &&
+        Objects.equals(title, that.title) &&
+        Objects.equals(blogName, that.blogName) &&
+        Objects.equals(url, that.url) &&
+        Objects.equals(spamP, that.spamP) &&
+        Objects.equals(submitterIp, that.submitterIp) &&
+        Objects.equals(submitterUserAgent, that.submitterUserAgent);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects
+        .hash(id, uuid, date, excerpt, title, blogName, url, spamP, submitterIp,
+            submitterUserAgent);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "entry_id", referencedColumnName = "id", nullable = false)
+  public LegacyJournalEntry getJournalEntry() {
+    return journalEntry;
+  }
+
+  public void setJournalEntry(LegacyJournalEntry journalEntry) {
+    this.journalEntry = journalEntry;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LoginCertificate.java b/src/main/scala/eu/mulk/entity/LoginCertificate.java
new file mode 100644
index 0000000..556568e
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LoginCertificate.java
@@ -0,0 +1,72 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Arrays;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "login_certificates", schema = "public", catalog = "mulkcms")
+@IdClass(LoginCertificatePK.class)
+public class LoginCertificate extends PanacheEntityBase {
+
+  private int userId;
+  private byte[] certificate;
+  private User user;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "certificate", nullable = false)
+  public byte[] getCertificate() {
+    return certificate;
+  }
+
+  public void setCertificate(byte[] certificate) {
+    this.certificate = certificate;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LoginCertificate that = (LoginCertificate) o;
+    return userId == that.userId &&
+        Arrays.equals(certificate, that.certificate);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = Objects.hash(userId);
+    result = 31 * result + Arrays.hashCode(certificate);
+    return result;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/LoginCertificatePK.java b/src/main/scala/eu/mulk/entity/LoginCertificatePK.java
new file mode 100644
index 0000000..b9035f5
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/LoginCertificatePK.java
@@ -0,0 +1,53 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class LoginCertificatePK implements Serializable {
+
+  private int userId;
+  private byte[] certificate;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "certificate", nullable = false)
+  @Id
+  public byte[] getCertificate() {
+    return certificate;
+  }
+
+  public void setCertificate(byte[] certificate) {
+    this.certificate = certificate;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LoginCertificatePK that = (LoginCertificatePK) o;
+    return userId == that.userId &&
+        Arrays.equals(certificate, that.certificate);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = Objects.hash(userId);
+    result = 31 * result + Arrays.hashCode(certificate);
+    return result;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/OpenId.java b/src/main/scala/eu/mulk/entity/OpenId.java
new file mode 100644
index 0000000..2708640
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/OpenId.java
@@ -0,0 +1,69 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "openids", schema = "public", catalog = "mulkcms")
+@IdClass(OpenIdPK.class)
+public class OpenId extends PanacheEntityBase {
+
+  private int userId;
+  private String openid;
+  private User user;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "openid", nullable = false, length = -1)
+  public String getOpenid() {
+    return openid;
+  }
+
+  public void setOpenid(String openid) {
+    this.openid = openid;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    OpenId openId = (OpenId) o;
+    return userId == openId.userId &&
+        Objects.equals(openid, openId.openid);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, openid);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/OpenIdPK.java b/src/main/scala/eu/mulk/entity/OpenIdPK.java
new file mode 100644
index 0000000..776911b
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/OpenIdPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class OpenIdPK implements Serializable {
+
+  private int userId;
+  private String openid;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "openid", nullable = false, length = -1)
+  @Id
+  public String getOpenid() {
+    return openid;
+  }
+
+  public void setOpenid(String openid) {
+    this.openid = openid;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    OpenIdPK openIdPK = (OpenIdPK) o;
+    return userId == openIdPK.userId &&
+        Objects.equals(openid, openIdPK.openid);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, openid);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/Password.java b/src/main/scala/eu/mulk/entity/Password.java
new file mode 100644
index 0000000..3e9d302
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/Password.java
@@ -0,0 +1,69 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "passwords", schema = "public", catalog = "mulkcms")
+@IdClass(PasswordPK.class)
+public class Password extends PanacheEntityBase {
+
+  private int userId;
+  private String password;
+  private User user;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "password", nullable = false, length = -1)
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Password password1 = (Password) o;
+    return userId == password1.userId &&
+        Objects.equals(password, password1.password);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, password);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/PasswordPK.java b/src/main/scala/eu/mulk/entity/PasswordPK.java
new file mode 100644
index 0000000..72db872
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/PasswordPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class PasswordPK implements Serializable {
+
+  private int userId;
+  private String password;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "password", nullable = false, length = -1)
+  @Id
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    PasswordPK that = (PasswordPK) o;
+    return userId == that.userId &&
+        Objects.equals(password, that.password);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, password);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/UsedTransactionKey.java b/src/main/scala/eu/mulk/entity/UsedTransactionKey.java
new file mode 100644
index 0000000..8e69a4c
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/UsedTransactionKey.java
@@ -0,0 +1,42 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "used_transaction_keys", schema = "public", catalog = "mulkcms")
+public class UsedTransactionKey extends PanacheEntityBase {
+
+  private long key;
+
+  @Id
+  @Column(name = "key", nullable = false)
+  public long getKey() {
+    return key;
+  }
+
+  public void setKey(long key) {
+    this.key = key;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    UsedTransactionKey that = (UsedTransactionKey) o;
+    return key == that.key;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/User.java b/src/main/scala/eu/mulk/entity/User.java
new file mode 100644
index 0000000..c4bc27d
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/User.java
@@ -0,0 +1,163 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Collection;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "users", schema = "public", catalog = "mulkcms")
+public class User extends PanacheEntityBase {
+
+  private int id;
+  private String name;
+  private String status;
+  private String email;
+  private String website;
+  private Collection<ArticleRevision> articleRevisions;
+  private Collection<CommentRevision> commentRevisions;
+  private Collection<LoginCertificate> loginCertificates;
+  private Collection<OpenId> openids;
+  private Collection<Password> passwords;
+  private Collection<UserPermission> userPermissions;
+  private Collection<UserSetting> userSettings;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "name", nullable = true, length = -1)
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Basic
+  @Column(name = "status", nullable = false, length = -1)
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @Basic
+  @Column(name = "email", nullable = true, length = -1)
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
+  @Basic
+  @Column(name = "website", nullable = true, length = -1)
+  public String getWebsite() {
+    return website;
+  }
+
+  public void setWebsite(String website) {
+    this.website = website;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    User user = (User) o;
+    return id == user.id &&
+        Objects.equals(name, user.name) &&
+        Objects.equals(status, user.status) &&
+        Objects.equals(email, user.email) &&
+        Objects.equals(website, user.website);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, name, status, email, website);
+  }
+
+  @OneToMany(mappedBy = "authors")
+  public Collection<ArticleRevision> getArticleRevisions() {
+    return articleRevisions;
+  }
+
+  public void setArticleRevisions(Collection<ArticleRevision> articleRevisions) {
+    this.articleRevisions = articleRevisions;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<CommentRevision> getCommentRevisions() {
+    return commentRevisions;
+  }
+
+  public void setCommentRevisions(Collection<CommentRevision> commentRevisions) {
+    this.commentRevisions = commentRevisions;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<LoginCertificate> getLoginCertificates() {
+    return loginCertificates;
+  }
+
+  public void setLoginCertificates(Collection<LoginCertificate> loginCertificates) {
+    this.loginCertificates = loginCertificates;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<OpenId> getOpenids() {
+    return openids;
+  }
+
+  public void setOpenids(Collection<OpenId> openids) {
+    this.openids = openids;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<Password> getPasswords() {
+    return passwords;
+  }
+
+  public void setPasswords(Collection<Password> passwords) {
+    this.passwords = passwords;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserPermission> getUserPermissions() {
+    return userPermissions;
+  }
+
+  public void setUserPermissions(Collection<UserPermission> userPermissions) {
+    this.userPermissions = userPermissions;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserSetting> getUserSettings() {
+    return userSettings;
+  }
+
+  public void setUserSettings(Collection<UserSetting> userSettings) {
+    this.userSettings = userSettings;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/UserPermission.java b/src/main/scala/eu/mulk/entity/UserPermission.java
new file mode 100644
index 0000000..053d790
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/UserPermission.java
@@ -0,0 +1,82 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "user_permissions", schema = "public", catalog = "mulkcms")
+@IdClass(UserPermissionPK.class)
+public class UserPermission extends PanacheEntityBase {
+
+  private int userId;
+  private String permission;
+  private Boolean status;
+  private User user;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "permission", nullable = false, length = -1)
+  public String getPermission() {
+    return permission;
+  }
+
+  public void setPermission(String permission) {
+    this.permission = permission;
+  }
+
+  @Basic
+  @Column(name = "status", nullable = true)
+  public Boolean getStatus() {
+    return status;
+  }
+
+  public void setStatus(Boolean status) {
+    this.status = status;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    UserPermission that = (UserPermission) o;
+    return userId == that.userId &&
+        Objects.equals(permission, that.permission) &&
+        Objects.equals(status, that.status);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, permission, status);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/UserPermissionPK.java b/src/main/scala/eu/mulk/entity/UserPermissionPK.java
new file mode 100644
index 0000000..ae3df66
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/UserPermissionPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserPermissionPK implements Serializable {
+
+  private int userId;
+  private String permission;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "permission", nullable = false, length = -1)
+  @Id
+  public String getPermission() {
+    return permission;
+  }
+
+  public void setPermission(String permission) {
+    this.permission = permission;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    UserPermissionPK that = (UserPermissionPK) o;
+    return userId == that.userId &&
+        Objects.equals(permission, that.permission);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, permission);
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/UserSetting.java b/src/main/scala/eu/mulk/entity/UserSetting.java
new file mode 100644
index 0000000..308c13e
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/UserSetting.java
@@ -0,0 +1,82 @@
+package eu.mulk.entity;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.util.Objects;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "user_settings", schema = "public", catalog = "mulkcms")
+@IdClass(UserSettingPK.class)
+public class UserSetting extends PanacheEntityBase {
+
+  private int userId;
+  private String setting;
+  private String value;
+  private User user;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "setting", nullable = false, length = -1)
+  public String getSetting() {
+    return setting;
+  }
+
+  public void setSetting(String setting) {
+    this.setting = setting;
+  }
+
+  @Basic
+  @Column(name = "value", nullable = true, length = -1)
+  public String getValue() {
+    return value;
+  }
+
+  public void setValue(String value) {
+    this.value = value;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    UserSetting that = (UserSetting) o;
+    return userId == that.userId &&
+        Objects.equals(setting, that.setting) &&
+        Objects.equals(value, that.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, setting, value);
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/scala/eu/mulk/entity/UserSettingPK.java b/src/main/scala/eu/mulk/entity/UserSettingPK.java
new file mode 100644
index 0000000..64168c8
--- /dev/null
+++ b/src/main/scala/eu/mulk/entity/UserSettingPK.java
@@ -0,0 +1,50 @@
+package eu.mulk.entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserSettingPK implements Serializable {
+
+  private int userId;
+  private String setting;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "setting", nullable = false, length = -1)
+  @Id
+  public String getSetting() {
+    return setting;
+  }
+
+  public void setSetting(String setting) {
+    this.setting = setting;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    UserSettingPK that = (UserSettingPK) o;
+    return userId == that.userId &&
+        Objects.equals(setting, that.setting);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, setting);
+  }
+}
