diff --git a/src/Queue.h b/src/Queue.h
deleted file mode 100644
index 30fbbda..0000000
--- a/src/Queue.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-// Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com
-// Subject to the BSD 2-Clause License
-// - see < http://opensource.org/licenses/BSD-2-Clause>
-//
-
-#ifndef CONCURRENT_QUEUE_
-#define CONCURRENT_QUEUE_
-
-#include <queue>
-#include <thread>
-#include <mutex>
-#include <condition_variable>
-#include <chrono>
-
-template <typename T>
-class Queue
-{
- public:
-
-  std::pair<T, bool> pop(int timeout)
-  {
-    std::cv_status status = std::cv_status::no_timeout;
-    std::unique_lock<std::mutex> mlock(mutex_);
-    static int duration = 0;
-    while (queue_.empty())
-    {
-      status = cond_.wait_for(mlock, std::chrono::seconds(1));
-      if (status == std::cv_status::timeout)
-      {
-        duration++;
-        if (duration > timeout)
-        {
-          duration = 0;
-          return std::pair<T, bool>({}, false);
-        }
-      }
-    }
-    auto val = queue_.front();
-    queue_.pop();
-    return std::pair<T, bool>(val, true);
-  }
-
-  void pop(T& item)
-  {
-    std::unique_lock<std::mutex> mlock(mutex_);
-    while (queue_.empty())
-    {
-      cond_.wait(mlock);
-    }
-    item = queue_.front();
-    queue_.pop();
-  }
-
-  void push(const T& item)
-  {
-    std::unique_lock<std::mutex> mlock(mutex_);
-    queue_.push(item);
-    mlock.unlock();
-    cond_.notify_one();
-  }
-  Queue()=default;
-  Queue(const Queue&) = delete;            // disable copying
-  Queue& operator=(const Queue&) = delete; // disable assignment
-  
- private:
-  std::queue<T> queue_;
-  std::mutex mutex_;
-  std::condition_variable cond_;
-};
-
-#endif
diff --git a/src/core.cc b/src/core.cc
index ae54c56..9bdb72d 100644
--- a/src/core.cc
+++ b/src/core.cc
@@ -38,12 +38,34 @@
 
 State state;
 
-Status Enable_() {
+static Status SchedAdd_(int intf_id, int onu_id, int agg_port_id);
+static Status SchedRemove_(int intf_id, int onu_id, int agg_port_id);
+
+static inline int mk_sched_id(int onu_id) {
+    return 1023 + onu_id;
+}
+
+static inline int mk_agg_port_id(int onu_id) {
+    return 1023 + onu_id;
+}
+
+Status Enable_(int argc, char *argv[]) {
     bcmbal_access_terminal_cfg acc_term_obj;
     bcmbal_access_terminal_key key = { };
 
     if (!state.is_activated()) {
         std::cout << "Enable OLT" << std::endl;
+
+        bcmbal_init(argc, argv, NULL);
+
+        Status status = SubscribeIndication();
+        if (!status.ok()) {
+            std::cout << "ERROR: SubscribeIndication failed - "
+                      << status.error_code() << ": " << status.error_message()
+                      << std::endl;
+            return status;
+        }
+
         key.access_term_id = DEFAULT_ATERM_ID;
         BCMBAL_CFG_INIT(&acc_term_obj, access_terminal, key);
         BCMBAL_CFG_PROP_SET(&acc_term_obj, access_terminal, admin_state, BCMBAL_STATE_UP);
diff --git a/src/core.h b/src/core.h
deleted file mode 100644
index b0c3b5f..0000000
--- a/src/core.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-    Copyright (C) 2018 Open Networking Foundation
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef OPENOLT_CORE_H_
-#define OPENOLT_CORE_H_
-
-#include <grpc++/grpc++.h>
-using grpc::Status;
-#include <openolt.grpc.pb.h>
-
-#include "state.h"
-
-extern State state;
-
-Status Enable_();
-Status ActivateOnu_(uint32_t intf_id, uint32_t onu_id,
-    const char *vendor_id, const char *vendor_specific, uint32_t pir);
-Status DeactivateOnu_(uint32_t intf_id, uint32_t onu_id,
-    const char *vendor_id, const char *vendor_specific);
-Status DeleteOnu_(uint32_t intf_id, uint32_t onu_id,
-    const char *vendor_id, const char *vendor_specific);
-Status EnablePonIf_(uint32_t intf_id);
-Status DisablePonIf_(uint32_t intf_id);
-Status EnableUplinkIf_(uint32_t intf_id);
-Status DisableUplinkIf_(uint32_t intf_id);
-Status OmciMsgOut_(uint32_t intf_id, uint32_t onu_id, const std::string pkt);
-Status OnuPacketOut_(uint32_t intf_id, uint32_t onu_id, const std::string pkt);
-Status UplinkPacketOut_(uint32_t intf_id, const std::string pkt);
-Status FlowAdd_(uint32_t onu_id,
-                uint32_t flow_id, const std::string flow_type,
-                uint32_t access_intf_id, uint32_t network_intf_id,
-                uint32_t gemport_id, uint32_t priority,
-                const ::openolt::Classifier& classifier,
-                const ::openolt::Action& action);
-Status FlowRemove_(uint32_t flow_id, const std::string flow_type);
-Status Disable_();
-Status Reenable_();
-
-
-static Status SchedAdd_(int intf_id, int onu_id, int agg_port_id);
-static Status SchedRemove_(int intf_id, int onu_id, int agg_port_id);
-
-static inline int mk_sched_id(int onu_id) {
-    return 1023 + onu_id;
-}
-
-static inline int mk_agg_port_id(int onu_id) {
-    return 1023 + onu_id;
-}
-
-#endif
diff --git a/src/indications.cc b/src/indications.cc
index 4d7a393..203b675 100644
--- a/src/indications.cc
+++ b/src/indications.cc
@@ -32,7 +32,7 @@
 
 using grpc::Status;
 
-Queue<openolt::Indication> oltIndQ;
+extern Queue<openolt::Indication> oltIndQ;
 //Queue<openolt::Indication*> oltIndQ;
 
 
diff --git a/src/main.cc b/src/main.cc
deleted file mode 100644
index 3c05489..0000000
--- a/src/main.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-    Copyright (C) 2018 Open Networking Foundation 
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#include <iostream>
-
-#include "indications.h"
-#include "server.h"
-#include "core.h"
-
-extern "C"
-{
-#include <bal_api.h>
-#include <bal_api_end.h>
-}
-
-int main(int argc, char** argv) {
-
-/*
-    if (argc < 5) {
-        std::cout << "Missing arguments" << std::endl;
-        exit(1);
-    }
-*/
-
-    bcmbal_init(argc, argv, NULL);
-
-    Status status = SubscribeIndication();
-    if (!status.ok()) {
-        std::cout << "ERROR: SubscribeIndication failed - "
-                  << status.error_code() << ": " << status.error_message()
-                  << std::endl;
-        return 1;
-    }
-
-    status = Enable_();
-    if (!status.ok()) {
-        std::cout << "ERROR: Enable_ failed - "
-                  << status.error_code() << ": " << status.error_message()
-                  << std::endl;
-        return 1;
-    }
-
-    RunServer();
-
-  return 0;
-}
diff --git a/src/server.cc b/src/server.cc
deleted file mode 100644
index 8cd83ff..0000000
--- a/src/server.cc
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
-    Copyright (C) 2018 Open Networking Foundation
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <iostream>
-#include <memory>
-#include <string>
-#include <time.h>
-#include <pthread.h>
-
-#include "Queue.h"
-#include <iostream>
-#include <sstream>
-
-#include "server.h"
-#include "core.h"
-#include "indications.h"
-#include "stats_collection.h"
-#include "state.h"
-
-#include <grpc++/grpc++.h>
-#include <openolt.grpc.pb.h>
-
-using grpc::Server;
-using grpc::ServerBuilder;
-using grpc::ServerContext;
-using grpc::ServerWriter;
-using grpc::Status;
-
-const char *serverPort = "0.0.0.0:9191";
-int signature;
-
-class OpenoltService final : public openolt::Openolt::Service {
-
-    Status DisableOlt(
-            ServerContext* context,
-            const openolt::Empty* request,
-            openolt::Empty* response) override {
-        return Disable_();
-    }
-
-    Status ReenableOlt(
-            ServerContext* context,
-            const openolt::Empty* request,
-            openolt::Empty* response) override {
-        return Reenable_();
-    }
-
-    Status ActivateOnu(
-            ServerContext* context,
-            const openolt::Onu* request,
-            openolt::Empty* response) override {
-        return ActivateOnu_(
-            request->intf_id(),
-            request->onu_id(),
-            ((request->serial_number()).vendor_id()).c_str(),
-            ((request->serial_number()).vendor_specific()).c_str(),
-            request->pir());
-    }
-
-    Status DeactivateOnu(
-            ServerContext* context,
-            const openolt::Onu* request,
-            openolt::Empty* response) override {
-        return DeactivateOnu_(
-            request->intf_id(),
-            request->onu_id(),
-            ((request->serial_number()).vendor_id()).c_str(),
-            ((request->serial_number()).vendor_specific()).c_str());
-    }
-
-    Status DeleteOnu(
-            ServerContext* context,
-            const openolt::Onu* request,
-            openolt::Empty* response) override {
-        return DeleteOnu_(
-            request->intf_id(),
-            request->onu_id(),
-            ((request->serial_number()).vendor_id()).c_str(),
-            ((request->serial_number()).vendor_specific()).c_str());
-    }
-
-    Status OmciMsgOut(
-            ServerContext* context,
-            const openolt::OmciMsg* request,
-            openolt::Empty* response) override {
-        return OmciMsgOut_(
-            request->intf_id(),
-            request->onu_id(),
-            request->pkt());
-    }
-
-    Status OnuPacketOut(
-            ServerContext* context,
-            const openolt::OnuPacket* request,
-            openolt::Empty* response) override {
-        return OnuPacketOut_(
-            request->intf_id(),
-            request->onu_id(),
-            request->pkt());
-    }
-
-    Status UplinkPacketOut(
-            ServerContext* context,
-            const openolt::UplinkPacket* request,
-            openolt::Empty* response) override {
-        return UplinkPacketOut_(
-            request->intf_id(),
-            request->pkt());
-    }
-
-    Status FlowAdd(
-            ServerContext* context,
-            const openolt::Flow* request,
-            openolt::Empty* response) override {
-        return FlowAdd_(
-            request->onu_id(),
-            request->flow_id(),
-            request->flow_type(),
-            request->access_intf_id(),
-            request->network_intf_id(),
-            request->gemport_id(),
-            request->priority(),
-            request->classifier(),
-            request->action());
-    }
-
-    Status FlowRemove(
-            ServerContext* context,
-            const openolt::Flow* request,
-            openolt::Empty* response) override {
-        return FlowRemove_(
-            request->flow_id(),
-            request->flow_type());
-    }
-
-    Status EnableIndication(
-            ServerContext* context,
-            const ::openolt::Empty* request,
-            ServerWriter<openolt::Indication>* writer) override {
-
-        std::cout << "Connection to Voltha established. Indications enabled"
-        << std::endl;
-
-        state.connect();
-
-        while (state.is_connected()) {
-            std::pair<openolt::Indication, bool> ind = oltIndQ.pop(COLLECTION_PERIOD);
-            if (ind.second == false) {
-                /* timeout - do lower priority periodic stuff like stats */
-                stats_collection();
-                continue;
-            }
-            openolt::Indication oltInd = ind.first;
-            bool isConnected = writer->Write(oltInd);
-            if (!isConnected) {
-                //Lost connectivity to this Voltha instance
-                //Put the indication back in the queue for next connecting instance
-                oltIndQ.push(oltInd);
-                state.disconnect();
-            }
-            //oltInd.release_olt_ind()
-        }
-
-        return Status::OK;
-    }
-
-    Status HeartbeatCheck(
-            ServerContext* context,
-            const openolt::Empty* request,
-            openolt::Heartbeat* response) override {
-        response->set_heartbeat_signature(signature);
-
-        return Status::OK;
-    }
-
-    Status EnablePonIf(
-            ServerContext* context,
-            const openolt::Interface* request,
-            openolt::Empty* response) override {
-
-        return EnablePonIf_(request->intf_id());
-    }
-
-    Status DisablePonIf(
-            ServerContext* context,
-            const openolt::Interface* request,
-            openolt::Empty* response) override {
-
-        return DisablePonIf_(request->intf_id());
-    }
-
-    Status Reboot(
-            ServerContext* context,
-            const openolt::Empty* request,
-            openolt::Empty* response) override {
-
-        system("shutdown -r now");
-
-        return Status::OK;
-
-    }
-
-
-};
-
-void RunServer() {
-  OpenoltService service;
-  std::string server_address(serverPort);
-  ServerBuilder builder;
-
-  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
-  builder.RegisterService(&service);
-
-  std::unique_ptr<Server> server(builder.BuildAndStart());
-
-  time_t now;
-  time(&now);
-  signature = (int)now;
-
-  std::cout << "Server listening on " << server_address
-  << ", connection signature : " << signature << std::endl;
-
-
-  server->Wait();
-}
diff --git a/src/server.h b/src/server.h
deleted file mode 100644
index 52ef083..0000000
--- a/src/server.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-    Copyright (C) 2018 Open Networking Foundation 
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef OPENOLT_SERVER_H_
-#define OPENOLT_SERVER_H_
-
-void RunServer();
-
-#endif
diff --git a/src/state.h b/src/state.h
deleted file mode 100644
index 331b09d..0000000
--- a/src/state.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef OPENOLT_STATE_H_
-#define OPENOLT_STATE_H_
-
-class State {
-  public:
-
-    bool is_connected() {
-        return connected_to_voltha;
-    }
-
-    bool is_activated() {
-        return activated;
-    }
-
-    void connect() {
-        connected_to_voltha = true;
-    }
-
-    void disconnect() {
-        connected_to_voltha = false;
-    }
-
-    void activate() {
-        activated = true;
-    }
-
-    void deactivate() {
-        activated = false;
-    }
-
-  private:
-    bool connected_to_voltha = false;
-    bool activated = false;
-};
-#endif
diff --git a/src/stats_collection.h b/src/stats_collection.h
index 0437634..fe3c27a 100644
--- a/src/stats_collection.h
+++ b/src/stats_collection.h
@@ -8,8 +8,6 @@
 #include <bal_model_types.h>
 }
 
-#define COLLECTION_PERIOD 15
-
 void init_stats();
 void stop_collecting_statistics();
 openolt::PortStatistics* get_default_port_statistics();
@@ -18,7 +16,6 @@
 openolt::FlowStatistics* get_default_flow_statistics();
 openolt::FlowStatistics* collectFlowStatistics(bcmbal_flow_id flow_id, bcmbal_flow_type flow_type);
 #endif
-void* stats_collection();
 void register_new_flow(bcmbal_flow_key key);
 
 
