diff --git a/src/db.c b/src/db.c
new file mode 100644
index 0000000..904281a
--- /dev/null
+++ b/src/db.c
@@ -0,0 +1,198 @@
+#include "db.h"
+
+#include <stdio.h>
+#include <dbi/dbi.h>
+
+dbi_conn conn;
+
+void db__error_func(dbi_conn conn, void* data) {
+    const char* msg;
+    dbi_conn_error(conn, &msg);
+    printf("DBI: %s\n", msg);
+}
+
+int db_init() {
+    dbi_initialize(NULL);
+    conn = dbi_conn_new("sqlite3");
+    
+    dbi_conn_error_handler( conn, db__error_func, NULL );
+
+    /* MySQL
+    dbi_conn_set_option(conn, "host", "localhost");
+    dbi_conn_set_option(conn, "username", "your_name");
+    dbi_conn_set_option(conn, "password", "your_password");
+    dbi_conn_set_option(conn, "dbname", "your_dbname");
+    dbi_conn_set_option(conn, "encoding", "UTF-8");
+    */
+
+    /* SqLite 3 */
+    dbi_conn_set_option(conn, "sqlite3_dbdir", "/tmp");
+    dbi_conn_set_option(conn, "dbname", "hlr.sqlite3");
+
+    if (dbi_conn_connect(conn) < 0) {
+        return 1;
+    }
+
+    return 0;
+}
+
+int db_prepare() {
+    dbi_result result;
+    result = dbi_conn_query(conn,
+        "CREATE TABLE IF NOT EXISTS Subscriber ("
+        "id INTEGER PRIMARY KEY AUTOINCREMENT, "
+        "imsi INTEGER UNIQUE NOT NULL, "
+        "tmsi INTEGER UNIQUE, "
+        "extension TEXT UNIQUE, "
+        "lac INTEGER"
+        ")"
+    );
+    if (result==NULL) {
+        printf("DB: Failed to create Subscriber table.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    result = dbi_conn_query(conn,
+        "CREATE TABLE IF NOT EXISTS Equipment ("
+        "id INTEGER PRIMARY KEY AUTOINCREMENT, "
+        "imei INTEGER UNIQUE NOT NULL"
+        ")"
+    );
+    if (result==NULL) {
+        printf("DB: Failed to create Equipment table.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db_fini() {
+    dbi_conn_close(conn);
+    dbi_shutdown();
+}
+
+int db_insert_imei(uint64_t imei) {
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "INSERT OR IGNORE INTO Equipment "
+        "(imei) "
+        "VALUES "
+        "(%llu) ",
+        imei
+    );
+    if (result==NULL) {
+        printf("DB: Failed to create Equipment by IMEI.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db_insert_imsi(uint64_t imsi) {
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "INSERT OR IGNORE INTO Subscriber "
+        "(imsi) "
+        "VALUES "
+        "(%llu) ",
+        imsi
+    );
+    if (result==NULL) {
+        printf("DB: Failed to create Subscriber by IMSI.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db_imsi_set_tmsi(uint64_t imsi, uint64_t tmsi) {
+    if (db_insert_imsi(imsi)) {
+        return 1;
+    }
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "UPDATE Subscriber "
+        "SET tmsi = %llu "
+        "WHERE imsi = %llu ",
+        tmsi, imsi
+    );
+    if (result==NULL) {
+        printf("DB: Failed to update Subscriber with TMSI by IMSI.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db_imsi_set_lac(uint64_t imsi, uint16_t lac) {
+    if (db_insert_imsi(imsi)) {
+        return 1;
+    }
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "UPDATE Subscriber "
+        "SET lac = %u "
+        "WHERE imsi = %llu ",
+        lac, imsi
+    );
+    if (result==NULL) {
+        printf("DB: Failed to update Subscriber with LAC by IMSI.\n");
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db__parse_subscriber(dbi_result result, db_subscriber* subscriber) {
+    if (!dbi_result_first_row(result)) {
+        printf("DB: Failed to find Subscriber.\n");
+        return 1;
+    }
+    subscriber->imsi = dbi_result_get_ulonglong(result, "imsi");
+    subscriber->tmsi = dbi_result_get_ulonglong(result, "tmsi");
+    // FIXME handle extension
+    subscriber->lac = dbi_result_get_uint(result, "lac");
+    printf("DB: Subscriber: IMSI %llu, TMSI %llu, LAC %hu\n", subscriber->imsi, subscriber->tmsi, subscriber->lac);
+    return 0;
+}
+
+int db_imsi_get_subscriber(uint64_t imsi, db_subscriber* subscriber) {
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "SELECT * FROM Subscriber "
+        "WHERE imsi = %llu ",
+        imsi
+    );
+    if (result==NULL) {
+        printf("DB: Failed to find Subscriber by IMSI.\n");
+        return 1;
+    }
+    if (db__parse_subscriber(result, subscriber)) {
+        printf("DB: Failed to parse Subscriber.\n");
+        dbi_result_free(result);
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
+int db_tmsi_get_subscriber(uint64_t tmsi, db_subscriber* subscriber) {
+    dbi_result result;
+    result = dbi_conn_queryf(conn,
+        "SELECT * FROM Subscriber "
+        "WHERE tmsi = %llu ",
+        tmsi
+    );
+    if (result==NULL) {
+        printf("DB: Failed to find Subscriber by TMSI.\n");
+        return 1;
+    }
+    if (db__parse_subscriber(result, subscriber)) {
+        printf("DB: Failed to parse Subscriber.\n");
+        dbi_result_free(result);
+        return 1;
+    }
+    dbi_result_free(result);
+    return 0;
+}
+
