diff --git a/CMakeLists.txt b/CMakeLists.txt
index c755f3598acd079f5d7d7964b12a92649e55dcd6..5ee701b04309e644f839bf5362650441b87b9b3c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,7 +8,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
 find_package(Wt REQUIRED)
 find_package(Groove REQUIRED)
 
-add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp)
+add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp src/ui/LoginInterface.cpp)
 target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY})
 
 install(TARGETS arbitrateor RUNTIME DESTINATION bin)
diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp
index aef1540f5349dbe895cca42df3107602d7dea8ab..3f20b1dbd9a3fd4f566a3280245348c98916cba2 100644
--- a/src/GroovePlayer.cpp
+++ b/src/GroovePlayer.cpp
@@ -18,3 +18,8 @@
  */
 
 #include "GroovePlayer.h"
+
+GroovePlayer::GroovePlayer()
+{
+}
+
diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h
index 615066558ad666d90409fbf3bb6787e39d162fb0..35e12333380d3074b54e2d537c7d41e1e740cff2 100644
--- a/src/GroovePlayer.h
+++ b/src/GroovePlayer.h
@@ -22,6 +22,15 @@
 
 class GroovePlayer
 {
+public:
+    static GroovePlayer* getInstance() {
+        static GroovePlayer instance;
+        return &instance;
+    };
+    GroovePlayer(GroovePlayer const&) = delete;
+    void operator=(GroovePlayer const&) = delete;
+private:
+    GroovePlayer();
 };
 
 #endif // GROOVEPLAYER_H
diff --git a/src/WebInterface.cpp b/src/WebInterface.cpp
index 68b2f02045d3b660971973e385f53846325505ed..896ea690319b6e65574bc392c2066c66de6b5c7e 100644
--- a/src/WebInterface.cpp
+++ b/src/WebInterface.cpp
@@ -18,3 +18,25 @@
  */
 
 #include "WebInterface.h"
+#include "ui/LoginInterface.h"
+#include <Wt/WText>
+
+struct WebInterface::internal
+{
+    LoginInterface* loginUI;
+};
+
+WebInterface::WebInterface(const Wt::WEnvironment& env) : Wt::WApplication(env)
+{
+    priv_int = new internal;
+    setTitle("Arbitrateor - Audio Jukebox");
+    priv_int->loginUI = new LoginInterface(this);
+    root()->addWidget(priv_int->loginUI);
+}
+
+void WebInterface::loginCompleted()
+{
+    //Login completed, now bring up main inteface.
+    root()->removeWidget(priv_int->loginUI);
+    root()->addWidget(new Wt::WText("you did it"));
+}
diff --git a/src/WebInterface.h b/src/WebInterface.h
index 3a157e1fee97c5f598eabf2fa87aa3e48e38429f..012b9d4c69a6d60b8ae4a85b1143a1e4cf7eca82 100644
--- a/src/WebInterface.h
+++ b/src/WebInterface.h
@@ -21,9 +21,16 @@
 #define WEBINTERFACE_H
 
 #include <Wt/WApplication>
+#include "GroovePlayer.h"
 
 class WebInterface : public Wt::WApplication
 {
+public:
+    WebInterface(const Wt::WEnvironment& env);
+    void loginCompleted();
+private:
+    struct internal;
+    internal* priv_int = 0;
 };
 
 #endif // WEBINTERFACE_H
diff --git a/src/main.cpp b/src/main.cpp
index 4a1cab38435299bcfea8e0cb33fb3ecd010097cf..2f6bf9dd6556b80de59cf590b987586fb465f565 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,8 +1,30 @@
 #include <iostream>
 #include "WebInterface.h"
+#include <Wt/WServer>
+#include <Wt/WConfig.h>
+#include "GroovePlayer.h"
+
+Wt::WApplication* createApplication(const Wt::WEnvironment& env)
+{
+    return new WebInterface(env);
+}
 
 int main ( int argc, char** argv )
 {
-    std::cout << "Hello, world!" << std::endl;
-    return 0;
+    try {
+        Wt::WServer server(argv[0]);
+        server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);
+        server.addEntryPoint(Wt::Application, createApplication);
+        if(server.start())
+        {
+            int sig = Wt::WServer::waitForShutdown(argv[0]);
+            server.stop();
+        }
+        return 0;
+    }
+    catch (Wt::WServer::Exception& e)
+    {
+        std::cerr << e.what() << "\n";
+        return 1;
+    }
 }