diff --git a/hswaw/lib/flask_spaceauth/spaceauth/__init__.py b/hswaw/lib/flask_spaceauth/spaceauth/__init__.py
new file mode 100644
index 0000000..6452307
--- /dev/null
+++ b/hswaw/lib/flask_spaceauth/spaceauth/__init__.py
@@ -0,0 +1,84 @@
+from flask import Blueprint, request, url_for, session, redirect, abort, flash
+from flask_oauthlib.client import OAuth, OAuthException
+from flask_login import LoginManager, login_user, logout_user, current_user, login_required, UserMixin
+
+from .caps import cap_required
+
+
+class SpaceAuth(LoginManager):
+    def __init__(self, app=None, *args, **kwargs):
+        self.oauth = OAuth()
+        self.remote = self.oauth.remote_app(
+            'spaceauth',
+            base_url='https://sso.hackerspace.pl/api/',
+            access_token_url='https://sso.hackerspace.pl/oauth/token',
+            authorize_url='https://sso.hackerspace.pl/oauth/authorize',
+            request_token_params={'scope': 'profile:read'},
+            app_key='SPACEAUTH')
+        self.remote.tokengetter(self.tokengetter)
+
+        bp = Blueprint('spaceauth', __name__)
+        bp.add_url_rule('/login', 'login', self.login_view_handler)
+        bp.add_url_rule('/logout', 'logout', self.logout_view_handler)
+        bp.add_url_rule('/callback', 'callback', self.callback_view_handler)
+        self.blueprint = bp
+
+        super(SpaceAuth, self).__init__()
+        self.refresh_view = 'spaceauth.login'
+        self.login_view = 'spaceauth.login'
+        self.user_loader(self.user_loader_handler)
+
+        if app:
+            self.init_app(app, *args, **kwargs)
+
+    def init_app(self, app, url_prefix='/oauth'):
+        self.oauth.init_app(app)
+        super(SpaceAuth, self).init_app(app)
+        app.register_blueprint(self.blueprint, url_prefix=url_prefix)
+
+        @app.errorhandler(OAuthException)
+        def errorhandler(err):
+            flash('OAuth error occured', 'error')
+            return redirect('/')
+
+    def login_view_handler(self):
+        session['spaceauth_next'] = request.args.get('next') or request.referrer
+        return self.remote.authorize(
+            callback=url_for('spaceauth.callback', _external=True)
+            )
+
+    def logout_view_handler(self):
+        # TODO revoke token
+        session.pop('spaceauth_token', None)
+        session.pop('spaceauth_next', None)
+        logout_user()
+        return redirect('/')
+
+    def callback_view_handler(self):
+        resp = self.remote.authorized_response()
+        if resp is None:
+            raise OAuthException(
+                'Access denied', type=request.args.get('error'))
+
+        # TODO encrypt token...?
+        session['spaceauth_token'] = resp['access_token']
+        profile = self.remote.get('profile').data
+
+        login_user(self.user_loader_handler(profile['username'], profile))
+        return redirect(session.pop('spaceauth_next', None) or '/')
+
+    def tokengetter(self):
+        return (session.get('spaceauth_token'), '')
+
+    def user_loader_handler(self, uid, profile=None):
+        """
+        Default user loader just to differentiate authenticated user from
+        anonymous.
+        """
+
+        user = UserMixin()
+        user.id = uid
+        return user
+
+    def user_profile(self):
+        return self.remote.get('profile').data
