diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java b/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java
index efb81cb..220ebfa 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java
@@ -1,7 +1,7 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
-import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -12,123 +12,28 @@
 
 @Entity
 @Table(name = "bookmarks", schema = "public", catalog = "benki")
-public class Bookmark {
-
-  private int id;
-  private Object date;
-  private String uri;
-  private String title;
-  private String description;
-  private Collection<BookmarkTag> tags;
-  private User owner;
+public class Bookmark extends PanacheEntityBase {
 
   @Id
   @Column(name = "id", nullable = false)
-  public int getId() {
-    return id;
-  }
+  public int id;
 
-  public void setId(int id) {
-    this.id = id;
-  }
-
-  @Basic
   @Column(name = "date", nullable = true)
-  public Object getDate() {
-    return date;
-  }
+  public Object date;
 
-  public void setDate(Object date) {
-    this.date = date;
-  }
-
-  @Basic
   @Column(name = "uri", nullable = false, length = -1)
-  public String getUri() {
-    return uri;
-  }
+  public String uri;
 
-  public void setUri(String uri) {
-    this.uri = uri;
-  }
-
-  @Basic
   @Column(name = "title", nullable = true, length = -1)
-  public String getTitle() {
-    return title;
-  }
+  public String title;
 
-  public void setTitle(String title) {
-    this.title = title;
-  }
-
-  @Basic
   @Column(name = "description", nullable = true, length = -1)
-  public String getDescription() {
-    return description;
-  }
-
-  public void setDescription(String description) {
-    this.description = description;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    Bookmark bookmark = (Bookmark) o;
-
-    if (id != bookmark.id) {
-      return false;
-    }
-    if (date != null ? !date.equals(bookmark.date) : bookmark.date != null) {
-      return false;
-    }
-    if (uri != null ? !uri.equals(bookmark.uri) : bookmark.uri != null) {
-      return false;
-    }
-    if (title != null ? !title.equals(bookmark.title) : bookmark.title != null) {
-      return false;
-    }
-    if (description != null ? !description.equals(bookmark.description)
-        : bookmark.description != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = id;
-    result = 31 * result + (date != null ? date.hashCode() : 0);
-    result = 31 * result + (uri != null ? uri.hashCode() : 0);
-    result = 31 * result + (title != null ? title.hashCode() : 0);
-    result = 31 * result + (description != null ? description.hashCode() : 0);
-    return result;
-  }
+  public String description;
 
   @OneToMany(mappedBy = "bookmark")
-  public Collection<BookmarkTag> getTags() {
-    return tags;
-  }
-
-  public void setTags(Collection<BookmarkTag> tags) {
-    this.tags = tags;
-  }
+  public Collection<BookmarkTag> tags;
 
   @ManyToOne
   @JoinColumn(name = "owner", referencedColumnName = "id")
-  public User getOwner() {
-    return owner;
-  }
-
-  public void setOwner(User owner) {
-    this.owner = owner;
-  }
+  public User owner;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java
index 1de1f36..6efa87e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,67 +12,17 @@
 @Entity
 @Table(name = "bookmark_tags", schema = "public", catalog = "benki")
 @IdClass(BookmarkTagPK.class)
-public class BookmarkTag {
-
-  private int bookmarkId;
-  private String tag;
-  private Bookmark bookmark;
+public class BookmarkTag extends PanacheEntityBase {
 
   @Id
   @Column(name = "bookmark", nullable = false)
-  public int getBookmarkId() {
-    return bookmarkId;
-  }
-
-  public void setBookmarkId(int bookmarkId) {
-    this.bookmarkId = bookmarkId;
-  }
+  public int bookmarkId;
 
   @Id
   @Column(name = "tag", nullable = false, length = -1)
-  public String getTag() {
-    return tag;
-  }
-
-  public void setTag(String tag) {
-    this.tag = tag;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    BookmarkTag that = (BookmarkTag) o;
-
-    if (bookmarkId != that.bookmarkId) {
-      return false;
-    }
-    if (tag != null ? !tag.equals(that.tag) : that.tag != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = bookmarkId;
-    result = 31 * result + (tag != null ? tag.hashCode() : 0);
-    return result;
-  }
+  public String tag;
 
   @ManyToOne
   @JoinColumn(name = "bookmark", referencedColumnName = "id", nullable = false)
-  public Bookmark getBookmark() {
-    return bookmark;
-  }
-
-  public void setBookmark(Bookmark bookmark) {
-    this.bookmark = bookmark;
-  }
+  public Bookmark bookmark;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java
index a72c9db..adc2a50 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java
@@ -1,62 +1,17 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
 @Entity
 @Table(name = "effective_role_subroles", schema = "public", catalog = "benki")
-public class EffectiveRoleSubrole {
+public class EffectiveRoleSubrole extends PanacheEntityBase {
 
-  private Integer superroleId;
-  private Integer subroleId;
-
-  @Basic
   @Column(name = "superrole", nullable = true)
-  public Integer getSuperroleId() {
-    return superroleId;
-  }
+  public Integer superroleId;
 
-  public void setSuperroleId(Integer superroleId) {
-    this.superroleId = superroleId;
-  }
-
-  @Basic
   @Column(name = "subrole", nullable = true)
-  public Integer getSubroleId() {
-    return subroleId;
-  }
-
-  public void setSubroleId(Integer subroleId) {
-    this.subroleId = subroleId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    EffectiveRoleSubrole that = (EffectiveRoleSubrole) o;
-
-    if (superroleId != null ? !superroleId.equals(that.superroleId) : that.superroleId != null) {
-      return false;
-    }
-    if (subroleId != null ? !subroleId.equals(that.subroleId) : that.subroleId != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = superroleId != null ? superroleId.hashCode() : 0;
-    result = 31 * result + (subroleId != null ? subroleId.hashCode() : 0);
-    return result;
-  }
+  public Integer subroleId;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java
index 00c5738..fc2e453 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java
@@ -1,62 +1,17 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
 @Entity
 @Table(name = "effective_user_roles", schema = "public", catalog = "benki")
-public class EffectiveUserRole {
+public class EffectiveUserRole extends PanacheEntityBase {
 
-  private Integer userId;
-  private Integer roleId;
-
-  @Basic
   @Column(name = "user", nullable = true)
-  public Integer getUserId() {
-    return userId;
-  }
+  public Integer userId;
 
-  public void setUserId(Integer userId) {
-    this.userId = userId;
-  }
-
-  @Basic
   @Column(name = "role", nullable = true)
-  public Integer getRoleId() {
-    return roleId;
-  }
-
-  public void setRoleId(Integer roleId) {
-    this.roleId = roleId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    EffectiveUserRole that = (EffectiveUserRole) o;
-
-    if (userId != null ? !userId.equals(that.userId) : that.userId != null) {
-      return false;
-    }
-    if (roleId != null ? !roleId.equals(that.roleId) : that.roleId != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId != null ? userId.hashCode() : 0;
-    result = 31 * result + (roleId != null ? roleId.hashCode() : 0);
-    return result;
-  }
+  public Integer roleId;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java
index 97d3365..43363d2 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java
@@ -1,7 +1,7 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
-import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -12,107 +12,25 @@
 
 @Entity
 @Table(name = "lazychat_messages", schema = "public", catalog = "benki")
-public class LazychatMessage {
-
-  private int id;
-  private Object date;
-  private String content;
-  private String format;
-  private User owner;
-  private Collection<LazychatReference> references;
+public class LazychatMessage extends PanacheEntityBase {
 
   @Id
   @Column(name = "id", nullable = false)
-  public int getId() {
-    return id;
-  }
+  public int id;
 
-  public void setId(int id) {
-    this.id = id;
-  }
-
-  @Basic
   @Column(name = "date", nullable = true)
-  public Object getDate() {
-    return date;
-  }
+  public Object date;
 
-  public void setDate(Object date) {
-    this.date = date;
-  }
-
-  @Basic
   @Column(name = "content", nullable = true, length = -1)
-  public String getContent() {
-    return content;
-  }
+  public String 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;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    LazychatMessage that = (LazychatMessage) o;
-
-    if (id != that.id) {
-      return false;
-    }
-    if (date != null ? !date.equals(that.date) : that.date != null) {
-      return false;
-    }
-    if (content != null ? !content.equals(that.content) : that.content != null) {
-      return false;
-    }
-    if (format != null ? !format.equals(that.format) : that.format != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = id;
-    result = 31 * result + (date != null ? date.hashCode() : 0);
-    result = 31 * result + (content != null ? content.hashCode() : 0);
-    result = 31 * result + (format != null ? format.hashCode() : 0);
-    return result;
-  }
+  public String format;
 
   @ManyToOne
   @JoinColumn(name = "owner", referencedColumnName = "id")
-  public User getOwner() {
-    return owner;
-  }
-
-  public void setOwner(User owner) {
-    this.owner = owner;
-  }
+  public User owner;
 
   @OneToMany(mappedBy = "referrer")
-  public Collection<LazychatReference> getReferences() {
-    return references;
-  }
-
-  public void setReferences(Collection<LazychatReference> references) {
-    this.references = references;
-  }
+  public Collection<LazychatReference> references;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java
index 330e607..19803ba 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,67 +12,21 @@
 @Entity
 @Table(name = "lazychat_references", schema = "public", catalog = "benki")
 @IdClass(LazychatReferencePK.class)
-public class LazychatReference {
-
-  private int referrerId;
-  private int refereeId;
-  private LazychatMessage referrer;
+public class LazychatReference extends PanacheEntityBase {
 
   @Id
   @Column(name = "referrer", nullable = false)
-  public int getReferrerId() {
-    return referrerId;
-  }
-
-  public void setReferrerId(int referrerId) {
-    this.referrerId = referrerId;
-  }
+  public int referrerId;
 
   @Id
   @Column(name = "referee", nullable = false)
-  public int getRefereeId() {
-    return refereeId;
-  }
-
-  public void setRefereeId(int refereeId) {
-    this.refereeId = refereeId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    LazychatReference that = (LazychatReference) o;
-
-    if (referrerId != that.referrerId) {
-      return false;
-    }
-    if (refereeId != that.refereeId) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = referrerId;
-    result = 31 * result + refereeId;
-    return result;
-  }
+  public int refereeId;
 
   @ManyToOne
   @JoinColumn(name = "referrer", referencedColumnName = "id", nullable = false)
-  public LazychatMessage getReferrer() {
-    return referrer;
-  }
+  public LazychatMessage referrer;
 
-  public void setReferrer(LazychatMessage referrer) {
-    this.referrer = referrer;
-  }
+  @ManyToOne
+  @JoinColumn(name = "referee", referencedColumnName = "id", nullable = false)
+  public LazychatMessage referee;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Openids.java b/src/main/java/eu/mulk/mulkcms2/benki/Openids.java
index c56fe4c..d0551e4 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/Openids.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Openids.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -7,51 +8,13 @@
 import javax.persistence.ManyToOne;
 
 @Entity
-public class Openids {
-
-  private String openid;
-  private User user;
+public class Openids extends PanacheEntityBase {
 
   @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;
-    }
-
-    Openids openids = (Openids) o;
-
-    if (openid != null ? !openid.equals(openids.openid) : openids.openid != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return openid != null ? openid.hashCode() : 0;
-  }
+  public String openid;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java b/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java
index 1423e00..26c1d57 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.math.BigInteger;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -12,67 +13,17 @@
 @Entity
 @Table(name = "page_keys", schema = "public", catalog = "benki")
 @IdClass(PageKeyPK.class)
-public class PageKey {
-
-  private String page;
-  private BigInteger key;
-  private User user;
+public class PageKey extends PanacheEntityBase {
 
   @Id
   @Column(name = "page", nullable = false, length = -1)
-  public String getPage() {
-    return page;
-  }
-
-  public void setPage(String page) {
-    this.page = page;
-  }
+  public String page;
 
   @Id
   @Column(name = "key", nullable = false, precision = 0)
-  public BigInteger getKey() {
-    return key;
-  }
-
-  public void setKey(BigInteger key) {
-    this.key = key;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    PageKey pageKey = (PageKey) o;
-
-    if (page != null ? !page.equals(pageKey.page) : pageKey.page != null) {
-      return false;
-    }
-    if (key != null ? !key.equals(pageKey.key) : pageKey.key != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = page != null ? page.hashCode() : 0;
-    result = 31 * result + (key != null ? key.hashCode() : 0);
-    return result;
-  }
+  public BigInteger key;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/Post.java
index ba448c6..2fc6b05 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/Post.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Post.java
@@ -1,6 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -10,67 +10,16 @@
 
 @Entity
 @Table(name = "posts", schema = "public", catalog = "benki")
-public class Post {
-
-  private int id;
-  private Object date;
-  private User owner;
+public class Post extends PanacheEntityBase {
 
   @Id
   @Column(name = "id", nullable = false)
-  public int getId() {
-    return id;
-  }
+  public int id;
 
-  public void setId(int id) {
-    this.id = id;
-  }
-
-  @Basic
   @Column(name = "date", nullable = true)
-  public Object getDate() {
-    return date;
-  }
-
-  public void setDate(Object date) {
-    this.date = date;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    Post post = (Post) o;
-
-    if (id != post.id) {
-      return false;
-    }
-    if (date != null ? !date.equals(post.date) : post.date != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = id;
-    result = 31 * result + (date != null ? date.hashCode() : 0);
-    return result;
-  }
+  public Object date;
 
   @ManyToOne
   @JoinColumn(name = "owner", referencedColumnName = "id")
-  public User getOwner() {
-    return owner;
-  }
-
-  public void setOwner(User owner) {
-    this.owner = owner;
-  }
+  public User owner;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java b/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java
index 5a01cfa..d785d78 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,67 +12,17 @@
 @Entity
 @Table(name = "post_targets", schema = "public", catalog = "benki")
 @IdClass(PostTargetPK.class)
-public class PostTarget {
-
-  private int message;
-  private int targetId;
-  private Role target;
+public class PostTarget extends PanacheEntityBase {
 
   @Id
   @Column(name = "message", nullable = false)
-  public int getMessage() {
-    return message;
-  }
-
-  public void setMessage(int message) {
-    this.message = message;
-  }
+  public int message;
 
   @Id
   @Column(name = "target", nullable = false)
-  public int getTargetId() {
-    return targetId;
-  }
-
-  public void setTargetId(int targetId) {
-    this.targetId = targetId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    PostTarget that = (PostTarget) o;
-
-    if (message != that.message) {
-      return false;
-    }
-    if (targetId != that.targetId) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = message;
-    result = 31 * result + targetId;
-    return result;
-  }
+  public int targetId;
 
   @ManyToOne
   @JoinColumn(name = "target", referencedColumnName = "id", nullable = false)
-  public Role getTarget() {
-    return target;
-  }
-
-  public void setTarget(Role target) {
-    this.target = target;
-  }
+  public Role target;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Role.java b/src/main/java/eu/mulk/mulkcms2/benki/Role.java
index ea1c388..48bd042 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/Role.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Role.java
@@ -1,7 +1,7 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
-import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -10,117 +10,30 @@
 
 @Entity
 @Table(name = "roles", schema = "public", catalog = "benki")
-public class Role {
-
-  private int id;
-  private String name;
-  private Collection<PostTarget> targetedPosts;
-  private Collection<RoleSubrole> subroles;
-  private Collection<RoleSubrole> superroles;
-  private Collection<UserDefaultTarget> usersUsedByAsDefaultTarget;
-  private Collection<UserRole> users;
-  private Collection<User> owningUsers;
+public class Role extends PanacheEntityBase {
 
   @Id
   @Column(name = "id", nullable = false)
-  public int getId() {
-    return id;
-  }
+  public int 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;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    Role role = (Role) o;
-
-    if (id != role.id) {
-      return false;
-    }
-    if (name != null ? !name.equals(role.name) : role.name != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = id;
-    result = 31 * result + (name != null ? name.hashCode() : 0);
-    return result;
-  }
+  public String name;
 
   @OneToMany(mappedBy = "target")
-  public Collection<PostTarget> getTargetedPosts() {
-    return targetedPosts;
-  }
-
-  public void setTargetedPosts(Collection<PostTarget> targetedPosts) {
-    this.targetedPosts = targetedPosts;
-  }
+  public Collection<PostTarget> targetedPosts;
 
   @OneToMany(mappedBy = "superrole")
-  public Collection<RoleSubrole> getSubroles() {
-    return subroles;
-  }
-
-  public void setSubroles(Collection<RoleSubrole> subroles) {
-    this.subroles = subroles;
-  }
+  public Collection<RoleSubrole> subroles;
 
   @OneToMany(mappedBy = "subrole")
-  public Collection<RoleSubrole> getSuperroles() {
-    return superroles;
-  }
-
-  public void setSuperroles(Collection<RoleSubrole> superroles) {
-    this.superroles = superroles;
-  }
+  public Collection<RoleSubrole> superroles;
 
   @OneToMany(mappedBy = "target")
-  public Collection<UserDefaultTarget> getUsersUsedByAsDefaultTarget() {
-    return usersUsedByAsDefaultTarget;
-  }
-
-  public void setUsersUsedByAsDefaultTarget(
-      Collection<UserDefaultTarget> usersUsedByAsDefaultTarget) {
-    this.usersUsedByAsDefaultTarget = usersUsedByAsDefaultTarget;
-  }
+  public Collection<UserDefaultTarget> usersUsedByAsDefaultTarget;
 
   @OneToMany(mappedBy = "role")
-  public Collection<UserRole> getUsers() {
-    return users;
-  }
-
-  public void setUsers(Collection<UserRole> users) {
-    this.users = users;
-  }
+  public Collection<UserRole> users;
 
   @OneToMany(mappedBy = "ownedRole")
-  public Collection<User> getOwningUsers() {
-    return owningUsers;
-  }
-
-  public void setOwningUsers(Collection<User> owningUsers) {
-    this.owningUsers = owningUsers;
-  }
+  public Collection<User> owningUsers;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java
index 12c68ca..0be5493 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,78 +12,21 @@
 @Entity
 @Table(name = "role_subroles", schema = "public", catalog = "benki")
 @IdClass(RoleSubrolePK.class)
-public class RoleSubrole {
-
-  private int superroleId;
-  private int subroleId;
-  private Role superrole;
-  private Role subrole;
+public class RoleSubrole extends PanacheEntityBase {
 
   @Id
   @Column(name = "superrole", nullable = false)
-  public int getSuperroleId() {
-    return superroleId;
-  }
-
-  public void setSuperroleId(int superroleId) {
-    this.superroleId = superroleId;
-  }
+  public int superroleId;
 
   @Id
   @Column(name = "subrole", nullable = false)
-  public int getSubroleId() {
-    return subroleId;
-  }
-
-  public void setSubroleId(int subroleId) {
-    this.subroleId = subroleId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    RoleSubrole that = (RoleSubrole) o;
-
-    if (superroleId != that.superroleId) {
-      return false;
-    }
-    if (subroleId != that.subroleId) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = superroleId;
-    result = 31 * result + subroleId;
-    return result;
-  }
+  public int subroleId;
 
   @ManyToOne
   @JoinColumn(name = "superrole", referencedColumnName = "id", nullable = false)
-  public Role getSuperrole() {
-    return superrole;
-  }
-
-  public void setSuperrole(Role superrole) {
-    this.superrole = superrole;
-  }
+  public Role superrole;
 
   @ManyToOne
   @JoinColumn(name = "subrole", referencedColumnName = "id", nullable = false)
-  public Role getSubrole() {
-    return subrole;
-  }
-
-  public void setSubrole(Role subrole) {
-    this.subrole = subrole;
-  }
+  public Role subrole;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java
index a51bf9c..9bc72c4 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -9,56 +10,13 @@
 @Entity
 @Table(name = "role_tags", schema = "public", catalog = "benki")
 @IdClass(RoleTagPK.class)
-public class RoleTag {
-
-  private int roleId;
-  private String tag;
+public class RoleTag extends PanacheEntityBase {
 
   @Id
   @Column(name = "role", nullable = false)
-  public int getRoleId() {
-    return roleId;
-  }
-
-  public void setRoleId(int roleId) {
-    this.roleId = roleId;
-  }
+  public int roleId;
 
   @Id
   @Column(name = "tag", nullable = false, length = -1)
-  public String getTag() {
-    return tag;
-  }
-
-  public void setTag(String tag) {
-    this.tag = tag;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    RoleTag roleTag = (RoleTag) o;
-
-    if (roleId != roleTag.roleId) {
-      return false;
-    }
-    if (tag != null ? !tag.equals(roleTag.tag) : roleTag.tag != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = roleId;
-    result = 31 * result + (tag != null ? tag.hashCode() : 0);
-    return result;
-  }
+  public String tag;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java b/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java
index f2bbb8a..d3da90e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.math.BigInteger;
 import java.util.Collection;
 import javax.persistence.Column;
@@ -12,66 +13,16 @@
 @Entity
 @Table(name = "rsa_keys", schema = "public", catalog = "benki")
 @IdClass(RsaKeyPK.class)
-public class RsaKey {
-
-  private BigInteger modulus;
-  private BigInteger exponent;
-  private Collection<UserRsaKey> users;
+public class RsaKey extends PanacheEntityBase {
 
   @Id
   @Column(name = "modulus", nullable = false, precision = 0)
-  public BigInteger getModulus() {
-    return modulus;
-  }
-
-  public void setModulus(BigInteger modulus) {
-    this.modulus = modulus;
-  }
+  public BigInteger modulus;
 
   @Id
   @Column(name = "exponent", nullable = false, precision = 0)
-  public BigInteger getExponent() {
-    return exponent;
-  }
-
-  public void setExponent(BigInteger exponent) {
-    this.exponent = exponent;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    RsaKey rsaKey = (RsaKey) o;
-
-    if (modulus != null ? !modulus.equals(rsaKey.modulus) : rsaKey.modulus != null) {
-      return false;
-    }
-    if (exponent != null ? !exponent.equals(rsaKey.exponent) : rsaKey.exponent != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = modulus != null ? modulus.hashCode() : 0;
-    result = 31 * result + (exponent != null ? exponent.hashCode() : 0);
-    return result;
-  }
+  public BigInteger exponent;
 
   @OneToMany(mappedBy = "rsaKey")
-  public Collection<UserRsaKey> getUsers() {
-    return users;
-  }
-
-  public void setUsers(Collection<UserRsaKey> users) {
-    this.users = users;
-  }
+  public Collection<UserRsaKey> users;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/User.java b/src/main/java/eu/mulk/mulkcms2/benki/User.java
index c1160f5..cabd91f 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/User.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/User.java
@@ -1,7 +1,7 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
-import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -12,29 +12,29 @@
 
 @Entity
 @Table(name = "users", schema = "public", catalog = "benki")
-public class User {
+public class User extends PanacheEntityBase {
 
-  private int id;
-  private String firstName;
-  private String middleNames;
-  private String lastName;
-  private String email;
-  private String website;
-  private String status;
-  private Collection<Bookmark> bookmarks;
-  private Collection<LazychatMessage> lazychatMessages;
-  private Collection<Openids> openids;
-  private Collection<PageKey> pageKeys;
-  private Collection<Post> posts;
-  private Collection<UserDefaultTarget> defaultTargets;
-  private Collection<UserEmailAddress> emailAddresses;
-  private Collection<UserJid> jids;
-  private Collection<UserNickname> nicknames;
-  private Collection<UserRole> roles;
-  private Collection<UserRsaKey> rsaKeys;
-  private Role ownedRole;
-  private Collection<WebId> webids;
-  private Collection<WikiPageRevision> wikiPageRevisions;
+  public int id;
+  public String firstName;
+  public String middleNames;
+  public String lastName;
+  public String email;
+  public String website;
+  public String status;
+  public Collection<Bookmark> bookmarks;
+  public Collection<LazychatMessage> lazychatMessages;
+  public Collection<Openids> openids;
+  public Collection<PageKey> pageKeys;
+  public Collection<Post> posts;
+  public Collection<UserDefaultTarget> defaultTargets;
+  public Collection<UserEmailAddress> emailAddresses;
+  public Collection<UserJid> jids;
+  public Collection<UserNickname> nicknames;
+  public Collection<UserRole> roles;
+  public Collection<UserRsaKey> rsaKeys;
+  public Role ownedRole;
+  public Collection<WebId> webids;
+  public Collection<WikiPageRevision> wikiPageRevisions;
 
   @Id
   @Column(name = "id", nullable = false)
@@ -46,7 +46,6 @@
     this.id = id;
   }
 
-  @Basic
   @Column(name = "first_name", nullable = true, length = -1)
   public String getFirstName() {
     return firstName;
@@ -56,7 +55,6 @@
     this.firstName = firstName;
   }
 
-  @Basic
   @Column(name = "middle_names", nullable = true, length = -1)
   public String getMiddleNames() {
     return middleNames;
@@ -66,7 +64,6 @@
     this.middleNames = middleNames;
   }
 
-  @Basic
   @Column(name = "last_name", nullable = true, length = -1)
   public String getLastName() {
     return lastName;
@@ -76,7 +73,6 @@
     this.lastName = lastName;
   }
 
-  @Basic
   @Column(name = "email", nullable = true, length = -1)
   public String getEmail() {
     return email;
@@ -86,7 +82,6 @@
     this.email = email;
   }
 
-  @Basic
   @Column(name = "website", nullable = true, length = -1)
   public String getWebsite() {
     return website;
@@ -96,7 +91,6 @@
     this.website = website;
   }
 
-  @Basic
   @Column(name = "status", nullable = true, length = -1)
   public String getStatus() {
     return status;
@@ -168,8 +162,7 @@
     return lazychatMessages;
   }
 
-  public void setLazychatMessages(
-      Collection<LazychatMessage> lazychatMessages) {
+  public void setLazychatMessages(Collection<LazychatMessage> lazychatMessages) {
     this.lazychatMessages = lazychatMessages;
   }
 
@@ -205,8 +198,7 @@
     return defaultTargets;
   }
 
-  public void setDefaultTargets(
-      Collection<UserDefaultTarget> defaultTargets) {
+  public void setDefaultTargets(Collection<UserDefaultTarget> defaultTargets) {
     this.defaultTargets = defaultTargets;
   }
 
@@ -215,8 +207,7 @@
     return emailAddresses;
   }
 
-  public void setEmailAddresses(
-      Collection<UserEmailAddress> emailAddresses) {
+  public void setEmailAddresses(Collection<UserEmailAddress> emailAddresses) {
     this.emailAddresses = emailAddresses;
   }
 
@@ -280,8 +271,7 @@
     return wikiPageRevisions;
   }
 
-  public void setWikiPageRevisions(
-      Collection<WikiPageRevision> wikiPageRevisions) {
+  public void setWikiPageRevisions(Collection<WikiPageRevision> wikiPageRevisions) {
     this.wikiPageRevisions = wikiPageRevisions;
   }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTarget.java b/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTarget.java
index 40c0082..4989023 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTarget.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTarget.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,78 +12,21 @@
 @Entity
 @Table(name = "user_default_target", schema = "public", catalog = "benki")
 @IdClass(UserDefaultTargetPK.class)
-public class UserDefaultTarget {
-
-  private int userId;
-  private int targetId;
-  private User user;
-  private Role target;
+public class UserDefaultTarget extends PanacheEntityBase {
 
   @Id
   @Column(name = "user", nullable = false)
-  public int getUserId() {
-    return userId;
-  }
-
-  public void setUserId(int userId) {
-    this.userId = userId;
-  }
+  public int userId;
 
   @Id
   @Column(name = "target", nullable = false)
-  public int getTargetId() {
-    return targetId;
-  }
-
-  public void setTargetId(int targetId) {
-    this.targetId = targetId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserDefaultTarget that = (UserDefaultTarget) o;
-
-    if (userId != that.userId) {
-      return false;
-    }
-    if (targetId != that.targetId) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId;
-    result = 31 * result + targetId;
-    return result;
-  }
+  public int targetId;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 
   @ManyToOne
   @JoinColumn(name = "target", referencedColumnName = "id", nullable = false)
-  public Role getTarget() {
-    return target;
-  }
-
-  public void setTarget(Role target) {
-    this.target = target;
-  }
+  public Role target;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java b/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java
index 03f2a0f..3341687 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -9,51 +10,13 @@
 
 @Entity
 @Table(name = "user_email_addresses", schema = "public", catalog = "benki")
-public class UserEmailAddress {
-
-  private String email;
-  private User user;
+public class UserEmailAddress extends PanacheEntityBase {
 
   @Id
   @Column(name = "email", nullable = false, length = -1)
-  public String getEmail() {
-    return email;
-  }
-
-  public void setEmail(String email) {
-    this.email = email;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserEmailAddress that = (UserEmailAddress) o;
-
-    if (email != null ? !email.equals(that.email) : that.email != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return email != null ? email.hashCode() : 0;
-  }
+  public String email;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java b/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java
index 468b95a..c32d547 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,67 +12,17 @@
 @Entity
 @Table(name = "user_jids", schema = "public", catalog = "benki")
 @IdClass(UserJidPK.class)
-public class UserJid {
-
-  private int userId;
-  private String jid;
-  private User user;
+public class UserJid extends PanacheEntityBase {
 
   @Id
   @Column(name = "user", nullable = false)
-  public int getUserId() {
-    return userId;
-  }
-
-  public void setUserId(int userId) {
-    this.userId = userId;
-  }
+  public int userId;
 
   @Id
   @Column(name = "jid", nullable = false, length = -1)
-  public String getJid() {
-    return jid;
-  }
-
-  public void setJid(String jid) {
-    this.jid = jid;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserJid userJid = (UserJid) o;
-
-    if (userId != userJid.userId) {
-      return false;
-    }
-    if (jid != null ? !jid.equals(userJid.jid) : userJid.jid != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId;
-    result = 31 * result + (jid != null ? jid.hashCode() : 0);
-    return result;
-  }
+  public String jid;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java b/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java
index a6161cc..7bfed4e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -9,51 +10,13 @@
 
 @Entity
 @Table(name = "user_nicknames", schema = "public", catalog = "benki")
-public class UserNickname {
-
-  private String nickname;
-  private User user;
+public class UserNickname extends PanacheEntityBase {
 
   @Id
   @Column(name = "nickname", nullable = false, length = -1)
-  public String getNickname() {
-    return nickname;
-  }
-
-  public void setNickname(String nickname) {
-    this.nickname = nickname;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserNickname that = (UserNickname) o;
-
-    if (nickname != null ? !nickname.equals(that.nickname) : that.nickname != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return nickname != null ? nickname.hashCode() : 0;
-  }
+  public String nickname;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java
index f87b9e4..f735d6c 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -11,78 +12,21 @@
 @Entity
 @Table(name = "user_roles", schema = "public", catalog = "benki")
 @IdClass(UserRolePK.class)
-public class UserRole {
-
-  private int userId;
-  private int roleId;
-  private User user;
-  private Role role;
+public class UserRole extends PanacheEntityBase {
 
   @Id
   @Column(name = "user", nullable = false)
-  public int getUserId() {
-    return userId;
-  }
-
-  public void setUserId(int userId) {
-    this.userId = userId;
-  }
+  public int userId;
 
   @Id
   @Column(name = "role", nullable = false)
-  public int getRoleId() {
-    return roleId;
-  }
-
-  public void setRoleId(int roleId) {
-    this.roleId = roleId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserRole userRole = (UserRole) o;
-
-    if (userId != userRole.userId) {
-      return false;
-    }
-    if (roleId != userRole.roleId) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId;
-    result = 31 * result + roleId;
-    return result;
-  }
+  public int roleId;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 
   @ManyToOne
   @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
-  public Role getRole() {
-    return role;
-  }
-
-  public void setRole(Role role) {
-    this.role = role;
-  }
+  public Role role;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java
index 24aff81..f35afdd 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.math.BigInteger;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -13,95 +14,28 @@
 @Entity
 @Table(name = "user_rsa_keys", schema = "public", catalog = "benki")
 @IdClass(UserRsaKeyPK.class)
-public class UserRsaKey {
-
-  private int userId;
-  private BigInteger modulus;
-  private BigInteger exponent;
-  private User user;
-  private RsaKey rsaKey;
+public class UserRsaKey extends PanacheEntityBase {
 
   @Id
   @Column(name = "user", nullable = false)
-  public int getUserId() {
-    return userId;
-  }
-
-  public void setUserId(int userId) {
-    this.userId = userId;
-  }
+  public int userId;
 
   @Id
   @Column(name = "modulus", nullable = false, precision = 0)
-  public BigInteger getModulus() {
-    return modulus;
-  }
-
-  public void setModulus(BigInteger modulus) {
-    this.modulus = modulus;
-  }
+  public BigInteger modulus;
 
   @Id
   @Column(name = "exponent", nullable = false, precision = 0)
-  public BigInteger getExponent() {
-    return exponent;
-  }
-
-  public void setExponent(BigInteger exponent) {
-    this.exponent = exponent;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserRsaKey that = (UserRsaKey) o;
-
-    if (userId != that.userId) {
-      return false;
-    }
-    if (modulus != null ? !modulus.equals(that.modulus) : that.modulus != null) {
-      return false;
-    }
-    if (exponent != null ? !exponent.equals(that.exponent) : that.exponent != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId;
-    result = 31 * result + (modulus != null ? modulus.hashCode() : 0);
-    result = 31 * result + (exponent != null ? exponent.hashCode() : 0);
-    return result;
-  }
+  public BigInteger exponent;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 
   @ManyToOne
   @JoinColumns({
-      @JoinColumn(name = "modulus", referencedColumnName = "modulus", nullable = false),
-      @JoinColumn(name = "exponent", referencedColumnName = "exponent", nullable = false)})
-  public RsaKey getRsaKey() {
-    return rsaKey;
-  }
-
-  public void setRsaKey(RsaKey rsaKey) {
-    this.rsaKey = rsaKey;
-  }
+    @JoinColumn(name = "modulus", referencedColumnName = "modulus", nullable = false),
+    @JoinColumn(name = "exponent", referencedColumnName = "exponent", nullable = false)
+  })
+  public RsaKey rsaKey;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java
index 5d5cada..ae5d52e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java
@@ -1,62 +1,17 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
 @Entity
 @Table(name = "user_visible_bookmarks", schema = "public", catalog = "benki")
-public class UserVisibleBookmark {
+public class UserVisibleBookmark extends PanacheEntityBase {
 
-  private Integer userId;
-  private Integer messageId;
-
-  @Basic
   @Column(name = "user", nullable = true)
-  public Integer getUserId() {
-    return userId;
-  }
+  public Integer userId;
 
-  public void setUserId(Integer userId) {
-    this.userId = userId;
-  }
-
-  @Basic
   @Column(name = "message", nullable = true)
-  public Integer getMessageId() {
-    return messageId;
-  }
-
-  public void setMessageId(Integer messageId) {
-    this.messageId = messageId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserVisibleBookmark that = (UserVisibleBookmark) o;
-
-    if (userId != null ? !userId.equals(that.userId) : that.userId != null) {
-      return false;
-    }
-    if (messageId != null ? !messageId.equals(that.messageId) : that.messageId != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId != null ? userId.hashCode() : 0;
-    result = 31 * result + (messageId != null ? messageId.hashCode() : 0);
-    return result;
-  }
+  public Integer messageId;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java
index 8f5f2ac..d57dca5 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java
@@ -1,62 +1,17 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
 @Entity
 @Table(name = "user_visible_lazychat_messages", schema = "public", catalog = "benki")
-public class UserVisibleLazychatMessage {
+public class UserVisibleLazychatMessage extends PanacheEntityBase {
 
-  private Integer userId;
-  private Integer messageId;
-
-  @Basic
   @Column(name = "user", nullable = true)
-  public Integer getUserId() {
-    return userId;
-  }
+  public Integer userId;
 
-  public void setUserId(Integer userId) {
-    this.userId = userId;
-  }
-
-  @Basic
   @Column(name = "message", nullable = true)
-  public Integer getMessageId() {
-    return messageId;
-  }
-
-  public void setMessageId(Integer messageId) {
-    this.messageId = messageId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserVisibleLazychatMessage that = (UserVisibleLazychatMessage) o;
-
-    if (userId != null ? !userId.equals(that.userId) : that.userId != null) {
-      return false;
-    }
-    if (messageId != null ? !messageId.equals(that.messageId) : that.messageId != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId != null ? userId.hashCode() : 0;
-    result = 31 * result + (messageId != null ? messageId.hashCode() : 0);
-    return result;
-  }
+  public Integer messageId;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java
index 06862c5..62833e6 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java
@@ -1,62 +1,17 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
 @Entity
 @Table(name = "user_visible_posts", schema = "public", catalog = "benki")
-public class UserVisiblePost {
+public class UserVisiblePost extends PanacheEntityBase {
 
-  private Integer userId;
-  private Integer messageId;
-
-  @Basic
   @Column(name = "user", nullable = true)
-  public Integer getUserId() {
-    return userId;
-  }
+  public Integer userId;
 
-  public void setUserId(Integer userId) {
-    this.userId = userId;
-  }
-
-  @Basic
   @Column(name = "message", nullable = true)
-  public Integer getMessageId() {
-    return messageId;
-  }
-
-  public void setMessageId(Integer messageId) {
-    this.messageId = messageId;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    UserVisiblePost that = (UserVisiblePost) o;
-
-    if (userId != null ? !userId.equals(that.userId) : that.userId != null) {
-      return false;
-    }
-    if (messageId != null ? !messageId.equals(that.messageId) : that.messageId != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = userId != null ? userId.hashCode() : 0;
-    result = 31 * result + (messageId != null ? messageId.hashCode() : 0);
-    return result;
-  }
+  public Integer messageId;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WebId.java b/src/main/java/eu/mulk/mulkcms2/benki/WebId.java
index a1a1cf2..476d91f 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/WebId.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WebId.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -9,51 +10,13 @@
 
 @Entity
 @Table(name = "webids", schema = "public", catalog = "benki")
-public class WebId {
-
-  private String webid;
-  private User user;
+public class WebId extends PanacheEntityBase {
 
   @Id
   @Column(name = "webid", nullable = false, length = -1)
-  public String getWebid() {
-    return webid;
-  }
-
-  public void setWebid(String webid) {
-    this.webid = webid;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    WebId webId = (WebId) o;
-
-    if (webid != null ? !webid.equals(webId.webid) : webId.webid != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return webid != null ? webid.hashCode() : 0;
-  }
+  public String webid;
 
   @ManyToOne
   @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
-  public User getUser() {
-    return user;
-  }
-
-  public void setUser(User user) {
-    this.user = user;
-  }
+  public User user;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java b/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java
index 4b8c3ad..169c70a 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java
@@ -1,5 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import java.util.Collection;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -9,50 +10,12 @@
 
 @Entity
 @Table(name = "wiki_pages", schema = "public", catalog = "benki")
-public class WikiPage {
-
-  private int id;
-  private Collection<WikiPageRevision> revisions;
+public class WikiPage extends PanacheEntityBase {
 
   @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;
-    }
-
-    WikiPage wikiPage = (WikiPage) o;
-
-    if (id != wikiPage.id) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return id;
-  }
+  public int id;
 
   @OneToMany(mappedBy = "page")
-  public Collection<WikiPageRevision> getRevisions() {
-    return revisions;
-  }
-
-  public void setRevisions(Collection<WikiPageRevision> revisions) {
-    this.revisions = revisions;
-  }
+  public Collection<WikiPageRevision> revisions;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java b/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java
index 58bf520..c0e8cfc 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java
@@ -1,6 +1,6 @@
 package eu.mulk.mulkcms2.benki;
 
-import javax.persistence.Basic;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -10,123 +10,29 @@
 
 @Entity
 @Table(name = "wiki_page_revisions", schema = "public", catalog = "benki")
-public class WikiPageRevision {
-
-  private int id;
-  private Object date;
-  private String title;
-  private String content;
-  private String format;
-  private WikiPage page;
-  private User author;
+public class WikiPageRevision extends PanacheEntityBase {
 
   @Id
   @Column(name = "id", nullable = false)
-  public int getId() {
-    return id;
-  }
+  public int id;
 
-  public void setId(int id) {
-    this.id = id;
-  }
-
-  @Basic
   @Column(name = "date", nullable = true)
-  public Object getDate() {
-    return date;
-  }
+  public Object date;
 
-  public void setDate(Object date) {
-    this.date = date;
-  }
-
-  @Basic
   @Column(name = "title", nullable = true, length = -1)
-  public String getTitle() {
-    return title;
-  }
+  public String title;
 
-  public void setTitle(String title) {
-    this.title = title;
-  }
-
-  @Basic
   @Column(name = "content", nullable = true, length = -1)
-  public String getContent() {
-    return content;
-  }
+  public String content;
 
-  public void setContent(String content) {
-    this.content = content;
-  }
-
-  @Basic
   @Column(name = "format", nullable = true, length = -1)
-  public String getFormat() {
-    return format;
-  }
-
-  public void setFormat(String format) {
-    this.format = format;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    WikiPageRevision that = (WikiPageRevision) o;
-
-    if (id != that.id) {
-      return false;
-    }
-    if (date != null ? !date.equals(that.date) : that.date != null) {
-      return false;
-    }
-    if (title != null ? !title.equals(that.title) : that.title != null) {
-      return false;
-    }
-    if (content != null ? !content.equals(that.content) : that.content != null) {
-      return false;
-    }
-    if (format != null ? !format.equals(that.format) : that.format != null) {
-      return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = id;
-    result = 31 * result + (date != null ? date.hashCode() : 0);
-    result = 31 * result + (title != null ? title.hashCode() : 0);
-    result = 31 * result + (content != null ? content.hashCode() : 0);
-    result = 31 * result + (format != null ? format.hashCode() : 0);
-    return result;
-  }
+  public String format;
 
   @ManyToOne
   @JoinColumn(name = "page", referencedColumnName = "id", nullable = false)
-  public WikiPage getPage() {
-    return page;
-  }
-
-  public void setPage(WikiPage page) {
-    this.page = page;
-  }
+  public WikiPage page;
 
   @ManyToOne
   @JoinColumn(name = "author", referencedColumnName = "id")
-  public User getAuthor() {
-    return author;
-  }
-
-  public void setAuthor(User author) {
-    this.author = author;
-  }
+  public User author;
 }
