diff --git a/src/api/schema.py b/src/api/schema.py
new file mode 100644
index 0000000000000000000000000000000000000000..e79e221f1c2268753bdb5134e02497135f561b72
--- /dev/null
+++ b/src/api/schema.py
@@ -0,0 +1,11 @@
+import graphene
+
+import core.schema
+
+
+class Query(core.schema.Query, graphene.ObjectType):
+    # This class will inherit from multiple Queries
+    # as we begin to add more apps to our project
+    pass
+
+schema = graphene.Schema(query=Query)
diff --git a/src/api/urls.py b/src/api/urls.py
index ca9d98c75aacba9d163949e436d44eafabb1ed64..9d34a6342dd00bd3c3e9be48858ab184b4335fb7 100644
--- a/src/api/urls.py
+++ b/src/api/urls.py
@@ -1,5 +1,6 @@
 from django.urls import include, path
 from rest_framework.urlpatterns import format_suffix_patterns
+from graphene_django.views import GraphQLView
 
 from . import views
 
@@ -10,6 +11,8 @@ urlpatterns = [
     path('stickers', views.stickers, name='stickers'),
     path('friends', views.friends, name='friends'),
     path('conferences', views.ConferenceList.as_view(), name='conference-list'),
+    path('graphql', GraphQLView.as_view(graphiql=True)),
+
     path('<slug:conference>', views.ConferenceDetail.as_view(), name='conference-detail'),
     path('<slug:conference>/tracks', views.ConferenceTrackList.as_view(), name='conferencetrack-list'),
     path('<slug:conference>/track/<slug:track>', views.ConferenceTrackDetail.as_view(), name='conferencetrack-detail'),
diff --git a/src/core/schema.py b/src/core/schema.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc20b9088a53eda5a33755c8a35f3ef248be2495
--- /dev/null
+++ b/src/core/schema.py
@@ -0,0 +1,120 @@
+from graphene import relay, ObjectType, List, Field, String
+from graphene_django import DjangoObjectType
+from graphene_django.filter import DjangoFilterConnectionField
+
+from core.models import Conference, ConferenceTrack, Venue, Event, Room, RoomLink, Sticker, UserProfile
+from api import views
+
+# pylint: disable=no-self-argument, no-member
+
+class ConferenceTrackType(DjangoObjectType):
+    class Meta:
+        model = ConferenceTrack
+        filter_fields = ['slug', 'name']
+        interfaces = (relay.Node, )
+
+class RoomType(DjangoObjectType):
+    class Meta:
+        model = Room
+        filter_fields = ['id', 'name', 'room_type']
+        interfaces = (relay.Node, )
+
+class VenueType(DjangoObjectType):
+    class Meta:
+        model = Venue
+        filter_fields = ['id', 'name']
+        interfaces = (relay.Node, )
+
+    #path('<slug:conference>/venue/<slug:venue>/rooms', views.ConferenceVenueRoomList.as_view(), name='venue-rooms'),
+    rooms = List(RoomType)
+    def resolve_rooms(venue, info):
+        return Room.objects.filter(conference__slug=venue.conference.slug, venue__slug=venue.slug).order_by('name')
+
+class LinkType(DjangoObjectType):
+    class Meta:
+        model = RoomLink
+        filter_fields = ['name', 'link_type']
+        interfaces = (relay.Node, )
+
+class ConferenceType(DjangoObjectType):
+    class Meta:
+        model = Conference
+        filter_fields = ['id', 'slug', 'name']
+        interfaces = (relay.Node, )
+
+    tracks = List(ConferenceTrackType)
+    def resolve_tracks(conference, info):
+        #return views.ConferenceTrackList.get_queryset(conference=parent.slug)
+        return ConferenceTrack.objects.filter(conference__slug=conference.slug).order_by('name')
+
+    track = Field(ConferenceTrackType, slug=String(required=True))
+    def resolve_track(conference, info, slug):
+        #return views.ConferenceTrackList.get_queryset(conference=parent.slug)
+        return ConferenceTrack.objects.get(conference__slug=conference.slug, slug=slug)
+
+
+    # path('<slug:conference>/venues', views.ConferenceVenueList.as_view(), name='venue-list'),
+    venues = List(VenueType)
+    def resolve_venues(conference, info):
+        return Venue.objects.filter(conference__slug=conference.slug).order_by('name')
+
+    # path('<slug:conference>/venue/<slug:venue>', views.ConferenceVenueDetail.as_view(), name='venue-detail'),
+    venue = Field(VenueType, slug=String(required=True))
+    def resolve_venue(conference, info, slug):
+        # views.ConferenceVenueDetail.get_object(conference=conference.slug, venue=slug)
+        return Venue.objects.get(conference__slug=conference.slug, slug=slug)
+
+
+    # path('<slug:conference>/rooms', views.ConferenceRoomList.as_view(), name='room-list'),
+    rooms = List(RoomType)
+    def resolve_rooms(conference, info):
+        return Room.objects.filter(conference__slug=conference.slug).order_by('name')
+
+    # path('<slug:conference>/room/<uuid:pk>', views.ConferenceRoomDetail.as_view(), name='room-detail'),
+    room = Field(RoomType, uuid=String(required=True))
+    def resolve_room(conference, info, uuid):
+        return Room.objects.get(conference__slug=conference.slug, pk=uuid)
+
+
+class StickerType(DjangoObjectType):
+    class Meta:
+        model = Sticker
+        filter_fields = ['name']
+        interfaces = (relay.Node, )
+
+class Query(ObjectType):
+    node = relay.Node.Field()
+
+    #sticker = relay.Node.Field(StickerType)
+    sticker = Field(StickerType, name=String(required=True))
+    stickers = List(StickerType)
+    stickersRelay = DjangoFilterConnectionField(StickerType)
+
+    #conference = relay.Node.Field(ConferenceType)
+    conference = Field(ConferenceType, slug=String(required=True))
+    conferences = List(ConferenceType)
+    conferencesRelay = DjangoFilterConnectionField(StickerType)
+
+    def resolve_me(root, info):
+        pass
+
+    def resolve_conference(root, info, slug):
+        try:
+            return Conference.objects.get(slug=slug)
+        except Conference.DoesNotExist:
+            return None
+
+    def resolve_conferences(root, info):
+        return Conference.objects.all()
+
+    def resolve_sticker(root, info, name):
+        try:
+            return Conference.objects.get(name=name)
+        except Conference.DoesNotExist:
+            return None
+
+
+    def resolve_stickers(root, info):
+        return Sticker.objects.all()
+
+# pylint: enable=no-self-argument, no-member
diff --git a/src/rc3platform/settings/base.py b/src/rc3platform/settings/base.py
index f54019c83238fff8797995a7b9a5aaac935e5948..e41adb1c084126814e1bb38e8c4af117f7d913eb 100644
--- a/src/rc3platform/settings/base.py
+++ b/src/rc3platform/settings/base.py
@@ -50,6 +50,7 @@ INSTALLED_APPS = [
 
     # 3rd party extensions
     'rest_framework',
+    'graphene_django',
 
     # our apps
     'core',
@@ -141,3 +142,8 @@ STATIC_ROOT = BASE_DIR.parent / 'static.dist'
 # STATICFILES_DIRS = [
 #     BASE_DIR / "static",
 # ]
+
+
+GRAPHENE = {
+    "SCHEMA": "api.schema.schema"
+}
\ No newline at end of file