diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java b/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java
new file mode 100644
index 0000000..efb81cb
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Bookmark.java
@@ -0,0 +1,134 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.util.Collection;
+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 = "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;
+
+  @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 Object getDate() {
+    return date;
+  }
+
+  public void setDate(Object date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "uri", nullable = false, length = -1)
+  public String getUri() {
+    return uri;
+  }
+
+  public void setUri(String uri) {
+    this.uri = uri;
+  }
+
+  @Basic
+  @Column(name = "title", nullable = true, length = -1)
+  public String getTitle() {
+    return 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;
+  }
+
+  @OneToMany(mappedBy = "bookmark")
+  public Collection<BookmarkTag> getTags() {
+    return tags;
+  }
+
+  public void setTags(Collection<BookmarkTag> tags) {
+    this.tags = tags;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "owner", referencedColumnName = "id")
+  public User getOwner() {
+    return owner;
+  }
+
+  public void setOwner(User owner) {
+    this.owner = owner;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java
new file mode 100644
index 0000000..1de1f36
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTag.java
@@ -0,0 +1,77 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "bookmark_tags", schema = "public", catalog = "benki")
+@IdClass(BookmarkTagPK.class)
+public class BookmarkTag {
+
+  private int bookmarkId;
+  private String tag;
+  private Bookmark bookmark;
+
+  @Id
+  @Column(name = "bookmark", nullable = false)
+  public int getBookmarkId() {
+    return bookmarkId;
+  }
+
+  public void setBookmarkId(int bookmarkId) {
+    this.bookmarkId = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "bookmark", referencedColumnName = "id", nullable = false)
+  public Bookmark getBookmark() {
+    return bookmark;
+  }
+
+  public void setBookmark(Bookmark bookmark) {
+    this.bookmark = bookmark;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTagPK.java b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTagPK.java
new file mode 100644
index 0000000..89e7fb9
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/BookmarkTagPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class BookmarkTagPK implements Serializable {
+
+  private int bookmarkId;
+  private String tag;
+
+  @Column(name = "bookmark", nullable = false)
+  @Id
+  public int getBookmarkId() {
+    return bookmarkId;
+  }
+
+  public void setBookmarkId(int bookmarkId) {
+    this.bookmarkId = bookmarkId;
+  }
+
+  @Column(name = "tag", nullable = false, length = -1)
+  @Id
+  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;
+    }
+
+    BookmarkTagPK that = (BookmarkTagPK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java
new file mode 100644
index 0000000..a72c9db
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveRoleSubrole.java
@@ -0,0 +1,62 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Basic;
+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 {
+
+  private Integer superroleId;
+  private Integer subroleId;
+
+  @Basic
+  @Column(name = "superrole", nullable = true)
+  public Integer getSuperroleId() {
+    return 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java
new file mode 100644
index 0000000..00c5738
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/EffectiveUserRole.java
@@ -0,0 +1,62 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Basic;
+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 {
+
+  private Integer userId;
+  private Integer roleId;
+
+  @Basic
+  @Column(name = "user", nullable = true)
+  public Integer getUserId() {
+    return 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java
new file mode 100644
index 0000000..97d3365
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/LazychatMessage.java
@@ -0,0 +1,118 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.util.Collection;
+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 = "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;
+
+  @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 Object getDate() {
+    return date;
+  }
+
+  public void setDate(Object date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "content", nullable = true, 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;
+  }
+
+  @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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "owner", referencedColumnName = "id")
+  public User getOwner() {
+    return owner;
+  }
+
+  public void setOwner(User owner) {
+    this.owner = owner;
+  }
+
+  @OneToMany(mappedBy = "referrer")
+  public Collection<LazychatReference> getReferences() {
+    return references;
+  }
+
+  public void setReferences(Collection<LazychatReference> references) {
+    this.references = references;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java
new file mode 100644
index 0000000..330e607
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReference.java
@@ -0,0 +1,77 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "lazychat_references", schema = "public", catalog = "benki")
+@IdClass(LazychatReferencePK.class)
+public class LazychatReference {
+
+  private int referrerId;
+  private int refereeId;
+  private LazychatMessage referrer;
+
+  @Id
+  @Column(name = "referrer", nullable = false)
+  public int getReferrerId() {
+    return referrerId;
+  }
+
+  public void setReferrerId(int referrerId) {
+    this.referrerId = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "referrer", referencedColumnName = "id", nullable = false)
+  public LazychatMessage getReferrer() {
+    return referrer;
+  }
+
+  public void setReferrer(LazychatMessage referrer) {
+    this.referrer = referrer;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/LazychatReferencePK.java b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReferencePK.java
new file mode 100644
index 0000000..c7eefc0
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/LazychatReferencePK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class LazychatReferencePK implements Serializable {
+
+  private int referrerId;
+  private int refereeId;
+
+  @Column(name = "referrer", nullable = false)
+  @Id
+  public int getReferrerId() {
+    return referrerId;
+  }
+
+  public void setReferrerId(int referrerId) {
+    this.referrerId = referrerId;
+  }
+
+  @Column(name = "referee", nullable = false)
+  @Id
+  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;
+    }
+
+    LazychatReferencePK that = (LazychatReferencePK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Openids.java b/src/main/java/eu/mulk/mulkcms2/benki/Openids.java
new file mode 100644
index 0000000..c56fe4c
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Openids.java
@@ -0,0 +1,57 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class Openids {
+
+  private String openid;
+  private User user;
+
+  @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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java b/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java
new file mode 100644
index 0000000..1423e00
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PageKey.java
@@ -0,0 +1,78 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.math.BigInteger;
+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 = "page_keys", schema = "public", catalog = "benki")
+@IdClass(PageKeyPK.class)
+public class PageKey {
+
+  private String page;
+  private BigInteger key;
+  private User user;
+
+  @Id
+  @Column(name = "page", nullable = false, length = -1)
+  public String getPage() {
+    return page;
+  }
+
+  public void setPage(String page) {
+    this.page = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PageKeyPK.java b/src/main/java/eu/mulk/mulkcms2/benki/PageKeyPK.java
new file mode 100644
index 0000000..dea94ed
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PageKeyPK.java
@@ -0,0 +1,60 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class PageKeyPK implements Serializable {
+
+  private String page;
+  private BigInteger key;
+
+  @Column(name = "page", nullable = false, length = -1)
+  @Id
+  public String getPage() {
+    return page;
+  }
+
+  public void setPage(String page) {
+    this.page = page;
+  }
+
+  @Column(name = "key", nullable = false, precision = 0)
+  @Id
+  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;
+    }
+
+    PageKeyPK pageKeyPK = (PageKeyPK) o;
+
+    if (page != null ? !page.equals(pageKeyPK.page) : pageKeyPK.page != null) {
+      return false;
+    }
+    if (key != null ? !key.equals(pageKeyPK.key) : pageKeyPK.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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/Post.java
new file mode 100644
index 0000000..ba448c6
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Post.java
@@ -0,0 +1,76 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "posts", schema = "public", catalog = "benki")
+public class Post {
+
+  private int id;
+  private Object date;
+  private User owner;
+
+  @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 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "owner", referencedColumnName = "id")
+  public User getOwner() {
+    return owner;
+  }
+
+  public void setOwner(User owner) {
+    this.owner = owner;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java b/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java
new file mode 100644
index 0000000..5a01cfa
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PostTarget.java
@@ -0,0 +1,77 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "post_targets", schema = "public", catalog = "benki")
+@IdClass(PostTargetPK.class)
+public class PostTarget {
+
+  private int message;
+  private int targetId;
+  private Role target;
+
+  @Id
+  @Column(name = "message", nullable = false)
+  public int getMessage() {
+    return message;
+  }
+
+  public void setMessage(int message) {
+    this.message = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "target", referencedColumnName = "id", nullable = false)
+  public Role getTarget() {
+    return target;
+  }
+
+  public void setTarget(Role target) {
+    this.target = target;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/PostTargetPK.java b/src/main/java/eu/mulk/mulkcms2/benki/PostTargetPK.java
new file mode 100644
index 0000000..0189837
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/PostTargetPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class PostTargetPK implements Serializable {
+
+  private int message;
+  private int targetId;
+
+  @Column(name = "message", nullable = false)
+  @Id
+  public int getMessage() {
+    return message;
+  }
+
+  public void setMessage(int message) {
+    this.message = message;
+  }
+
+  @Column(name = "target", nullable = false)
+  @Id
+  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;
+    }
+
+    PostTargetPK that = (PostTargetPK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/Role.java b/src/main/java/eu/mulk/mulkcms2/benki/Role.java
new file mode 100644
index 0000000..ea1c388
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/Role.java
@@ -0,0 +1,126 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.util.Collection;
+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 = "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;
+
+  @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;
+  }
+
+  @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;
+  }
+
+  @OneToMany(mappedBy = "target")
+  public Collection<PostTarget> getTargetedPosts() {
+    return targetedPosts;
+  }
+
+  public void setTargetedPosts(Collection<PostTarget> targetedPosts) {
+    this.targetedPosts = targetedPosts;
+  }
+
+  @OneToMany(mappedBy = "superrole")
+  public Collection<RoleSubrole> getSubroles() {
+    return subroles;
+  }
+
+  public void setSubroles(Collection<RoleSubrole> subroles) {
+    this.subroles = subroles;
+  }
+
+  @OneToMany(mappedBy = "subrole")
+  public Collection<RoleSubrole> getSuperroles() {
+    return superroles;
+  }
+
+  public void setSuperroles(Collection<RoleSubrole> superroles) {
+    this.superroles = superroles;
+  }
+
+  @OneToMany(mappedBy = "target")
+  public Collection<UserDefaultTarget> getUsersUsedByAsDefaultTarget() {
+    return usersUsedByAsDefaultTarget;
+  }
+
+  public void setUsersUsedByAsDefaultTarget(
+      Collection<UserDefaultTarget> usersUsedByAsDefaultTarget) {
+    this.usersUsedByAsDefaultTarget = usersUsedByAsDefaultTarget;
+  }
+
+  @OneToMany(mappedBy = "role")
+  public Collection<UserRole> getUsers() {
+    return users;
+  }
+
+  public void setUsers(Collection<UserRole> users) {
+    this.users = users;
+  }
+
+  @OneToMany(mappedBy = "ownedRole")
+  public Collection<User> getOwningUsers() {
+    return owningUsers;
+  }
+
+  public void setOwningUsers(Collection<User> owningUsers) {
+    this.owningUsers = owningUsers;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java
new file mode 100644
index 0000000..12c68ca
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrole.java
@@ -0,0 +1,88 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "role_subroles", schema = "public", catalog = "benki")
+@IdClass(RoleSubrolePK.class)
+public class RoleSubrole {
+
+  private int superroleId;
+  private int subroleId;
+  private Role superrole;
+  private Role subrole;
+
+  @Id
+  @Column(name = "superrole", nullable = false)
+  public int getSuperroleId() {
+    return superroleId;
+  }
+
+  public void setSuperroleId(int superroleId) {
+    this.superroleId = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "superrole", referencedColumnName = "id", nullable = false)
+  public Role getSuperrole() {
+    return superrole;
+  }
+
+  public void setSuperrole(Role superrole) {
+    this.superrole = superrole;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "subrole", referencedColumnName = "id", nullable = false)
+  public Role getSubrole() {
+    return subrole;
+  }
+
+  public void setSubrole(Role subrole) {
+    this.subrole = subrole;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrolePK.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrolePK.java
new file mode 100644
index 0000000..cf36115
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleSubrolePK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class RoleSubrolePK implements Serializable {
+
+  private int superroleId;
+  private int subroleId;
+
+  @Column(name = "superrole", nullable = false)
+  @Id
+  public int getSuperroleId() {
+    return superroleId;
+  }
+
+  public void setSuperroleId(int superroleId) {
+    this.superroleId = superroleId;
+  }
+
+  @Column(name = "subrole", nullable = false)
+  @Id
+  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;
+    }
+
+    RoleSubrolePK that = (RoleSubrolePK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java
new file mode 100644
index 0000000..a51bf9c
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleTag.java
@@ -0,0 +1,64 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "role_tags", schema = "public", catalog = "benki")
+@IdClass(RoleTagPK.class)
+public class RoleTag {
+
+  private int roleId;
+  private String tag;
+
+  @Id
+  @Column(name = "role", nullable = false)
+  public int getRoleId() {
+    return roleId;
+  }
+
+  public void setRoleId(int roleId) {
+    this.roleId = 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RoleTagPK.java b/src/main/java/eu/mulk/mulkcms2/benki/RoleTagPK.java
new file mode 100644
index 0000000..e406e10
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RoleTagPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class RoleTagPK implements Serializable {
+
+  private int roleId;
+  private String tag;
+
+  @Column(name = "role", nullable = false)
+  @Id
+  public int getRoleId() {
+    return roleId;
+  }
+
+  public void setRoleId(int roleId) {
+    this.roleId = roleId;
+  }
+
+  @Column(name = "tag", nullable = false, length = -1)
+  @Id
+  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;
+    }
+
+    RoleTagPK roleTagPK = (RoleTagPK) o;
+
+    if (roleId != roleTagPK.roleId) {
+      return false;
+    }
+    if (tag != null ? !tag.equals(roleTagPK.tag) : roleTagPK.tag != null) {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = roleId;
+    result = 31 * result + (tag != null ? tag.hashCode() : 0);
+    return result;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java b/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java
new file mode 100644
index 0000000..f2bbb8a
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RsaKey.java
@@ -0,0 +1,77 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.math.BigInteger;
+import java.util.Collection;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@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;
+
+  @Id
+  @Column(name = "modulus", nullable = false, precision = 0)
+  public BigInteger getModulus() {
+    return modulus;
+  }
+
+  public void setModulus(BigInteger modulus) {
+    this.modulus = 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;
+  }
+
+  @OneToMany(mappedBy = "rsaKey")
+  public Collection<UserRsaKey> getUsers() {
+    return users;
+  }
+
+  public void setUsers(Collection<UserRsaKey> users) {
+    this.users = users;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/RsaKeyPK.java b/src/main/java/eu/mulk/mulkcms2/benki/RsaKeyPK.java
new file mode 100644
index 0000000..41a332d
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/RsaKeyPK.java
@@ -0,0 +1,60 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class RsaKeyPK implements Serializable {
+
+  private BigInteger modulus;
+  private BigInteger exponent;
+
+  @Column(name = "modulus", nullable = false, precision = 0)
+  @Id
+  public BigInteger getModulus() {
+    return modulus;
+  }
+
+  public void setModulus(BigInteger modulus) {
+    this.modulus = modulus;
+  }
+
+  @Column(name = "exponent", nullable = false, precision = 0)
+  @Id
+  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;
+    }
+
+    RsaKeyPK rsaKeyPK = (RsaKeyPK) o;
+
+    if (modulus != null ? !modulus.equals(rsaKeyPK.modulus) : rsaKeyPK.modulus != null) {
+      return false;
+    }
+    if (exponent != null ? !exponent.equals(rsaKeyPK.exponent) : rsaKeyPK.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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/User.java b/src/main/java/eu/mulk/mulkcms2/benki/User.java
new file mode 100644
index 0000000..c1160f5
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/User.java
@@ -0,0 +1,287 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.util.Collection;
+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 = "users", schema = "public", catalog = "benki")
+public class User {
+
+  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;
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int getId() {
+    return id;
+  }
+
+  public void setId(int id) {
+    this.id = id;
+  }
+
+  @Basic
+  @Column(name = "first_name", nullable = true, length = -1)
+  public String getFirstName() {
+    return firstName;
+  }
+
+  public void setFirstName(String firstName) {
+    this.firstName = firstName;
+  }
+
+  @Basic
+  @Column(name = "middle_names", nullable = true, length = -1)
+  public String getMiddleNames() {
+    return middleNames;
+  }
+
+  public void setMiddleNames(String middleNames) {
+    this.middleNames = middleNames;
+  }
+
+  @Basic
+  @Column(name = "last_name", nullable = true, length = -1)
+  public String getLastName() {
+    return lastName;
+  }
+
+  public void setLastName(String lastName) {
+    this.lastName = lastName;
+  }
+
+  @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 = "status", nullable = true, length = -1)
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+
+    User user = (User) o;
+
+    if (id != user.id) {
+      return false;
+    }
+    if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) {
+      return false;
+    }
+    if (middleNames != null ? !middleNames.equals(user.middleNames) : user.middleNames != null) {
+      return false;
+    }
+    if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) {
+      return false;
+    }
+    if (email != null ? !email.equals(user.email) : user.email != null) {
+      return false;
+    }
+    if (website != null ? !website.equals(user.website) : user.website != null) {
+      return false;
+    }
+    if (status != null ? !status.equals(user.status) : user.status != null) {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = id;
+    result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
+    result = 31 * result + (middleNames != null ? middleNames.hashCode() : 0);
+    result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
+    result = 31 * result + (email != null ? email.hashCode() : 0);
+    result = 31 * result + (website != null ? website.hashCode() : 0);
+    result = 31 * result + (status != null ? status.hashCode() : 0);
+    return result;
+  }
+
+  @OneToMany(mappedBy = "owner")
+  public Collection<Bookmark> getBookmarks() {
+    return bookmarks;
+  }
+
+  public void setBookmarks(Collection<Bookmark> bookmarks) {
+    this.bookmarks = bookmarks;
+  }
+
+  @OneToMany(mappedBy = "owner")
+  public Collection<LazychatMessage> getLazychatMessages() {
+    return lazychatMessages;
+  }
+
+  public void setLazychatMessages(
+      Collection<LazychatMessage> lazychatMessages) {
+    this.lazychatMessages = lazychatMessages;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<Openids> getOpenids() {
+    return openids;
+  }
+
+  public void setOpenids(Collection<Openids> openids) {
+    this.openids = openids;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<PageKey> getPageKeys() {
+    return pageKeys;
+  }
+
+  public void setPageKeys(Collection<PageKey> pageKeys) {
+    this.pageKeys = pageKeys;
+  }
+
+  @OneToMany(mappedBy = "owner")
+  public Collection<Post> getPosts() {
+    return posts;
+  }
+
+  public void setPosts(Collection<Post> posts) {
+    this.posts = posts;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserDefaultTarget> getDefaultTargets() {
+    return defaultTargets;
+  }
+
+  public void setDefaultTargets(
+      Collection<UserDefaultTarget> defaultTargets) {
+    this.defaultTargets = defaultTargets;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserEmailAddress> getEmailAddresses() {
+    return emailAddresses;
+  }
+
+  public void setEmailAddresses(
+      Collection<UserEmailAddress> emailAddresses) {
+    this.emailAddresses = emailAddresses;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserJid> getJids() {
+    return jids;
+  }
+
+  public void setJids(Collection<UserJid> jids) {
+    this.jids = jids;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserNickname> getNicknames() {
+    return nicknames;
+  }
+
+  public void setNicknames(Collection<UserNickname> nicknames) {
+    this.nicknames = nicknames;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserRole> getRoles() {
+    return roles;
+  }
+
+  public void setRoles(Collection<UserRole> roles) {
+    this.roles = roles;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<UserRsaKey> getRsaKeys() {
+    return rsaKeys;
+  }
+
+  public void setRsaKeys(Collection<UserRsaKey> rsaKeys) {
+    this.rsaKeys = rsaKeys;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
+  public Role getOwnedRole() {
+    return ownedRole;
+  }
+
+  public void setOwnedRole(Role ownedRole) {
+    this.ownedRole = ownedRole;
+  }
+
+  @OneToMany(mappedBy = "user")
+  public Collection<WebId> getWebids() {
+    return webids;
+  }
+
+  public void setWebids(Collection<WebId> webids) {
+    this.webids = webids;
+  }
+
+  @OneToMany(mappedBy = "author")
+  public Collection<WikiPageRevision> getWikiPageRevisions() {
+    return 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
new file mode 100644
index 0000000..40c0082
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTarget.java
@@ -0,0 +1,88 @@
+package eu.mulk.mulkcms2.benki;
+
+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_default_target", schema = "public", catalog = "benki")
+@IdClass(UserDefaultTargetPK.class)
+public class UserDefaultTarget {
+
+  private int userId;
+  private int targetId;
+  private User user;
+  private Role target;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "target", referencedColumnName = "id", nullable = false)
+  public Role getTarget() {
+    return target;
+  }
+
+  public void setTarget(Role target) {
+    this.target = target;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTargetPK.java b/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTargetPK.java
new file mode 100644
index 0000000..e7e080f
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserDefaultTargetPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserDefaultTargetPK implements Serializable {
+
+  private int userId;
+  private int targetId;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "target", nullable = false)
+  @Id
+  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;
+    }
+
+    UserDefaultTargetPK that = (UserDefaultTargetPK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java b/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java
new file mode 100644
index 0000000..03f2a0f
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserEmailAddress.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "user_email_addresses", schema = "public", catalog = "benki")
+public class UserEmailAddress {
+
+  private String email;
+  private User user;
+
+  @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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java b/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java
new file mode 100644
index 0000000..468b95a
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserJid.java
@@ -0,0 +1,77 @@
+package eu.mulk.mulkcms2.benki;
+
+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_jids", schema = "public", catalog = "benki")
+@IdClass(UserJidPK.class)
+public class UserJid {
+
+  private int userId;
+  private String jid;
+  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 = "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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserJidPK.java b/src/main/java/eu/mulk/mulkcms2/benki/UserJidPK.java
new file mode 100644
index 0000000..f033723
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserJidPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserJidPK implements Serializable {
+
+  private int userId;
+  private String jid;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "jid", nullable = false, length = -1)
+  @Id
+  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;
+    }
+
+    UserJidPK userJidPK = (UserJidPK) o;
+
+    if (userId != userJidPK.userId) {
+      return false;
+    }
+    if (jid != null ? !jid.equals(userJidPK.jid) : userJidPK.jid != null) {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = userId;
+    result = 31 * result + (jid != null ? jid.hashCode() : 0);
+    return result;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java b/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java
new file mode 100644
index 0000000..a6161cc
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserNickname.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "user_nicknames", schema = "public", catalog = "benki")
+public class UserNickname {
+
+  private String nickname;
+  private User user;
+
+  @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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java
new file mode 100644
index 0000000..f87b9e4
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRole.java
@@ -0,0 +1,88 @@
+package eu.mulk.mulkcms2.benki;
+
+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_roles", schema = "public", catalog = "benki")
+@IdClass(UserRolePK.class)
+public class UserRole {
+
+  private int userId;
+  private int roleId;
+  private User user;
+  private Role role;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
+  public Role getRole() {
+    return role;
+  }
+
+  public void setRole(Role role) {
+    this.role = role;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRolePK.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRolePK.java
new file mode 100644
index 0000000..6181b8b
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRolePK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserRolePK implements Serializable {
+
+  private int userId;
+  private int roleId;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "role", nullable = false)
+  @Id
+  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;
+    }
+
+    UserRolePK that = (UserRolePK) o;
+
+    if (userId != that.userId) {
+      return false;
+    }
+    if (roleId != that.roleId) {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = userId;
+    result = 31 * result + roleId;
+    return result;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java
new file mode 100644
index 0000000..24aff81
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKey.java
@@ -0,0 +1,107 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.math.BigInteger;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@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;
+
+  @Id
+  @Column(name = "user", nullable = false)
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Id
+  @Column(name = "modulus", nullable = false, precision = 0)
+  public BigInteger getModulus() {
+    return modulus;
+  }
+
+  public void setModulus(BigInteger modulus) {
+    this.modulus = 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKeyPK.java b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKeyPK.java
new file mode 100644
index 0000000..4c146ae
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserRsaKeyPK.java
@@ -0,0 +1,75 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class UserRsaKeyPK implements Serializable {
+
+  private int userId;
+  private BigInteger modulus;
+  private BigInteger exponent;
+
+  @Column(name = "user", nullable = false)
+  @Id
+  public int getUserId() {
+    return userId;
+  }
+
+  public void setUserId(int userId) {
+    this.userId = userId;
+  }
+
+  @Column(name = "modulus", nullable = false, precision = 0)
+  @Id
+  public BigInteger getModulus() {
+    return modulus;
+  }
+
+  public void setModulus(BigInteger modulus) {
+    this.modulus = modulus;
+  }
+
+  @Column(name = "exponent", nullable = false, precision = 0)
+  @Id
+  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;
+    }
+
+    UserRsaKeyPK that = (UserRsaKeyPK) 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java
new file mode 100644
index 0000000..5d5cada
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleBookmark.java
@@ -0,0 +1,62 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Basic;
+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 {
+
+  private Integer userId;
+  private Integer messageId;
+
+  @Basic
+  @Column(name = "user", nullable = true)
+  public Integer getUserId() {
+    return 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java
new file mode 100644
index 0000000..8f5f2ac
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisibleLazychatMessage.java
@@ -0,0 +1,62 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Basic;
+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 {
+
+  private Integer userId;
+  private Integer messageId;
+
+  @Basic
+  @Column(name = "user", nullable = true)
+  public Integer getUserId() {
+    return 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java b/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java
new file mode 100644
index 0000000..06862c5
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/UserVisiblePost.java
@@ -0,0 +1,62 @@
+package eu.mulk.mulkcms2.benki;
+
+import javax.persistence.Basic;
+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 {
+
+  private Integer userId;
+  private Integer messageId;
+
+  @Basic
+  @Column(name = "user", nullable = true)
+  public Integer getUserId() {
+    return 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;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WebId.java b/src/main/java/eu/mulk/mulkcms2/benki/WebId.java
new file mode 100644
index 0000000..a1a1cf2
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WebId.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "webids", schema = "public", catalog = "benki")
+public class WebId {
+
+  private String webid;
+  private User user;
+
+  @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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "user", referencedColumnName = "id", nullable = false)
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java b/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java
new file mode 100644
index 0000000..4b8c3ad
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WikiPage.java
@@ -0,0 +1,58 @@
+package eu.mulk.mulkcms2.benki;
+
+import java.util.Collection;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "wiki_pages", schema = "public", catalog = "benki")
+public class WikiPage {
+
+  private int id;
+  private Collection<WikiPageRevision> revisions;
+
+  @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;
+  }
+
+  @OneToMany(mappedBy = "page")
+  public Collection<WikiPageRevision> getRevisions() {
+    return revisions;
+  }
+
+  public void setRevisions(Collection<WikiPageRevision> revisions) {
+    this.revisions = revisions;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java b/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java
new file mode 100644
index 0000000..58bf520
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/WikiPageRevision.java
@@ -0,0 +1,132 @@
+package eu.mulk.mulkcms2.benki;
+
+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 = "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;
+
+  @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 Object getDate() {
+    return date;
+  }
+
+  public void setDate(Object date) {
+    this.date = date;
+  }
+
+  @Basic
+  @Column(name = "title", nullable = true, length = -1)
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  @Basic
+  @Column(name = "content", nullable = true, length = -1)
+  public String getContent() {
+    return 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;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "page", referencedColumnName = "id", nullable = false)
+  public WikiPage getPage() {
+    return page;
+  }
+
+  public void setPage(WikiPage page) {
+    this.page = page;
+  }
+
+  @ManyToOne
+  @JoinColumn(name = "author", referencedColumnName = "id")
+  public User getAuthor() {
+    return author;
+  }
+
+  public void setAuthor(User author) {
+    this.author = author;
+  }
+}
