diff --git a/aleksis/core/assets/components/person/PersonOverview.vue b/aleksis/core/assets/components/person/PersonOverview.vue
index 416ebbf5b1c5c9909e043db167702e304ecc085b..bcffce11948dc15f2dc16ab8545a096b9a93bf2a 100644
--- a/aleksis/core/assets/components/person/PersonOverview.vue
+++ b/aleksis/core/assets/components/person/PersonOverview.vue
@@ -1,5 +1,144 @@
 <template>
+  <ApolloQuery
+      :query="require('./personOverview.graphql')"
+      :variables="{'id': id}"
+  >
+    <template #default="{ result: { error, data, loading } }">
+      <template v-if="loading">
+        <v-skeleton-loader type="article"/>
 
+        <v-row>
+          <v-col
+              cols="12"
+              lg="4"
+              v-for="_ in 3">
+            <v-skeleton-loader type="card"/>
+          </v-col>
+        </v-row>
+      </template>
+      <template v-else-if="data && data.person">
+        <h1>{{ data.person.firstName }} {{ data.person.lastName }}
+          <span v-if="data.person.username" class="text-h5 grey--text text--darken-2">
+            {{ data.person.username }}
+          </span>
+        </h1>
+
+        <v-row>
+          <v-col
+              cols="12"
+              lg="4"
+          >
+            <v-card>
+              <v-card-title>{{ $t("person.details") }}</v-card-title>
+
+              <v-list two-line>
+                <v-list-item>
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-account-outline
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>
+                      {{ data.person.firstName }} {{ data.person.additionalName }} {{ data.person.lastName }}
+                    </v-list-item-title>
+                  </v-list-item-content>
+                </v-list-item>
+                <v-divider inset/>
+
+                <v-list-item>
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-human-non-binary
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>
+                      {{ data.person.sex }}
+                    </v-list-item-title>
+                  </v-list-item-content>
+                </v-list-item>
+                <v-divider inset/>
+
+                <v-list-item>
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-map-marker-outline
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>{{ data.person.street }} {{ data.person.housenumber }}</v-list-item-title>
+                    <v-list-item-subtitle>{{ data.person.postalCode }} {{ data.person.place }}</v-list-item-subtitle>
+                  </v-list-item-content>
+                </v-list-item>
+                <v-divider inset/>
+
+                <v-list-item
+                    :href="'tel:' + data.person.phoneNumber"
+                >
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-phone-outline
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>{{ data.person.phoneNumber }}</v-list-item-title>
+                    <v-list-item-subtitle>{{ $t("person.home")}}</v-list-item-subtitle>
+                  </v-list-item-content>
+                </v-list-item>
+
+                <v-list-item
+                    :href="'tel:' + data.person.mobileNumber"
+                >
+                  <v-list-item-action></v-list-item-action>
+
+                  <v-list-item-content>
+                    <v-list-item-title>{{ data.person.mobileNumber }}</v-list-item-title>
+                    <v-list-item-subtitle>{{ $t("person.mobile")}}</v-list-item-subtitle>
+                  </v-list-item-content>
+                </v-list-item>
+                <v-divider inset/>
+
+                <v-list-item
+                    :href="'mailto:' + data.person.email"
+                >
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-email-outline
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>
+                      {{ data.person.email }}
+                    </v-list-item-title>
+                  </v-list-item-content>
+                </v-list-item>
+                <v-divider inset/>
+
+                <v-list-item>
+                  <v-list-item-icon>
+                    <v-icon>
+                      mdi-cake-variant-outline
+                    </v-icon>
+                  </v-list-item-icon>
+
+                  <v-list-item-content>
+                    <v-list-item-title>{{ $d(new Date(data.person.dateOfBirth), "short") }}</v-list-item-title>
+                    <v-list-item-subtitle>{{ data.person.placeOfBirth }}</v-list-item-subtitle>
+                  </v-list-item-content>
+                </v-list-item>
+              </v-list>
+            </v-card>
+          </v-col>
+        </v-row>
+      </template>
+    </template>
+  </ApolloQuery>
 </template>
 
 <script>
diff --git a/aleksis/core/assets/components/person/personOverview.graphql b/aleksis/core/assets/components/person/personOverview.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..94eab6cd46bc75557ab90974997fbe9c778070d7
--- /dev/null
+++ b/aleksis/core/assets/components/person/personOverview.graphql
@@ -0,0 +1,31 @@
+query person($id: ID) {
+  person: personByIdOrMe(id:$id) {
+    id
+    username
+    firstName
+    additionalName
+    lastName
+    sex
+    street
+    housenumber
+    postalCode
+    place
+    phoneNumber
+    mobileNumber
+    email
+    dateOfBirth
+    placeOfBirth
+
+    photo {
+      url
+    }
+    avatar {
+      url
+    }
+
+    guardians {
+      id
+      fullName
+    }
+  }
+}
diff --git a/aleksis/core/assets/messages.json b/aleksis/core/assets/messages.json
index 312ce282bc27fbf7e46857a29dca39315607f675..2033d76d70703970eacbeb4b33d99d76554d179c 100644
--- a/aleksis/core/assets/messages.json
+++ b/aleksis/core/assets/messages.json
@@ -196,7 +196,10 @@
       "logged_in_as": "Logged in as",
       "menu_title": "Persons",
       "title": "Person",
-      "title_plural": "Persons"
+      "title_plural": "Persons",
+      "mobile": "mobile phone",
+      "home": "home phone",
+      "details": "Contact details"
     },
     "preferences": {
       "person": {
diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py
index 55a217ea986dcbe451c537dfb1e9ad569fa8d05c..f74db7e43383c857f06d3afe73e75b92270d3aec 100644
--- a/aleksis/core/schema/__init__.py
+++ b/aleksis/core/schema/__init__.py
@@ -34,6 +34,7 @@ class Query(graphene.ObjectType):
 
     persons = graphene.List(PersonType)
     person_by_id = graphene.Field(PersonType, id=graphene.ID())
+    person_by_id_or_me = graphene.Field(PersonType, id=graphene.ID())
     who_am_i = graphene.Field(PersonType)
 
     system_properties = graphene.Field(SystemPropertiesType)
@@ -73,6 +74,16 @@ class Query(graphene.ObjectType):
             raise PermissionDenied()
         return person
 
+    def resolve_person_by_id_or_me(root, info, id): # noqa
+        # Returns current user if id is None, else the person with the id
+        if id is None:
+            return info.context.user.person if has_person(info.context.user) else None
+
+        person = Person.objects.get(pk=id)
+        if not info.context.user.has_perm("core.view_person_rule", person):
+            raise PermissionDenied()
+        return person
+
     def resolve_who_am_i(root, info, **kwargs):
         if has_person(info.context.user):
             return info.context.user.person
diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py
index 48f468e348b5efed9084319fc26c9802aefc95ed..d8ca1c474f36e444f7901e6d5b216af259903216 100644
--- a/aleksis/core/schema/person.py
+++ b/aleksis/core/schema/person.py
@@ -30,6 +30,7 @@ class PersonType(DjangoObjectType):
         model = Person
 
     full_name = graphene.String()
+    username = graphene.String()
     unread_notifications_count = graphene.Int()
     photo = graphene.Field(FieldFileType)
     avatar = graphene.Field(FieldFileType)
@@ -38,6 +39,9 @@ class PersonType(DjangoObjectType):
     is_dummy = graphene.Boolean()
     preferences = graphene.Field(PersonPreferencesType)
 
+    def resolve_username(root, info, **kwargs): # noqa
+        return root.user.username if root.user else None
+
     def resolve_photo(root, info, **kwargs):
         if info.context.user.has_perm("core.view_photo_rule", root):
             return root.photo