diff --git a/src/app/handlers/xdgurl.cpp b/src/app/handlers/xdgurl.cpp
index fa2c92d128e72025be250bee436bc42c080447fc..449c466392ca1732de8ad414ebb329e23c1adcba 100644
--- a/src/app/handlers/xdgurl.cpp
+++ b/src/app/handlers/xdgurl.cpp
@@ -3,14 +3,14 @@
 #include <QUrlQuery>
 #include <QDesktopServices>
 
-#include "qtlibs/file.h"
-#include "qtlibs/dir.h"
-#include "qtlibs/networkresource.h"
-#include "qtlibs/package.h"
+#include "qtlib_file.h"
+#include "qtlib_dir.h"
+#include "qtlib_networkresource.h"
+#include "qtlib_package.h"
 
 namespace handlers {
 
-XdgUrl::XdgUrl(const QString &xdgUrl, const qtlibs::Config &config, QObject *parent)
+XdgUrl::XdgUrl(const QString &xdgUrl, const qtlib::Config &config, QObject *parent)
     : QObject(parent), xdgUrl_(xdgUrl), config_(config)
 {
     parse();
@@ -41,9 +41,9 @@ void XdgUrl::process()
     }
 
     QString url = metadata_["url"].toString();
-    qtlibs::NetworkResource *resource = new qtlibs::NetworkResource(url, QUrl(url), true, this);
-    connect(resource, &qtlibs::NetworkResource::downloadProgress, this, &XdgUrl::downloadProgress);
-    connect(resource, &qtlibs::NetworkResource::finished, this, &XdgUrl::networkResourceFinished);
+    qtlib::NetworkResource *resource = new qtlib::NetworkResource(url, QUrl(url), true, this);
+    connect(resource, &qtlib::NetworkResource::downloadProgress, this, &XdgUrl::downloadProgress);
+    connect(resource, &qtlib::NetworkResource::finished, this, &XdgUrl::networkResourceFinished);
     resource->get();
     emit started();
 }
@@ -73,7 +73,7 @@ void XdgUrl::openDestination()
     }
 }
 
-void XdgUrl::networkResourceFinished(qtlibs::NetworkResource *resource)
+void XdgUrl::networkResourceFinished(qtlib::NetworkResource *resource)
 {
     if (!resource->isFinishedWithNoError()) {
         QJsonObject result;
@@ -150,19 +150,19 @@ QString XdgUrl::convertPathString(const QString &path)
     QString newPath = path;
 
     if (newPath.contains("$HOME")) {
-        newPath.replace("$HOME", qtlibs::Dir::homePath());
+        newPath.replace("$HOME", qtlib::Dir::homePath());
     }
     else if (newPath.contains("$XDG_DATA_HOME")) {
-        newPath.replace("$XDG_DATA_HOME", qtlibs::Dir::genericDataPath());
+        newPath.replace("$XDG_DATA_HOME", qtlib::Dir::genericDataPath());
     }
     else if (newPath.contains("$KDEHOME")) {
-        newPath.replace("$KDEHOME", qtlibs::Dir::kdehomePath());
+        newPath.replace("$KDEHOME", qtlib::Dir::kdehomePath());
     }
 
     return newPath;
 }
 
-void XdgUrl::saveDownloadedFile(qtlibs::NetworkResource *resource)
+void XdgUrl::saveDownloadedFile(qtlib::NetworkResource *resource)
 {
     QJsonObject result;
 
@@ -170,7 +170,7 @@ void XdgUrl::saveDownloadedFile(qtlibs::NetworkResource *resource)
     QString destination = destinations_[type].toString();
     QString path = destination + "/" + metadata_["filename"].toString();
 
-    qtlibs::Dir(destination).make();
+    qtlib::Dir(destination).make();
 
     if (!resource->saveData(path)) {
         result["status"] = QString("error_save");
@@ -189,11 +189,11 @@ void XdgUrl::saveDownloadedFile(qtlibs::NetworkResource *resource)
     emit finishedWithSuccess(result);
 }
 
-void XdgUrl::installDownloadedFile(qtlibs::NetworkResource *resource)
+void XdgUrl::installDownloadedFile(qtlib::NetworkResource *resource)
 {
     QJsonObject result;
 
-    QString tempPath = qtlibs::Dir::tempPath() + "/" + metadata_["filename"].toString();
+    QString tempPath = qtlib::Dir::tempPath() + "/" + metadata_["filename"].toString();
 
     if (!resource->saveData(tempPath)) {
         result["status"] = QString("error_save");
@@ -205,14 +205,14 @@ void XdgUrl::installDownloadedFile(qtlibs::NetworkResource *resource)
 
     resource->deleteLater();
 
-    qtlibs::Package package(tempPath);
-    qtlibs::File tempFile(tempPath);
+    qtlib::Package package(tempPath);
+    qtlib::File tempFile(tempPath);
 
     QString type = metadata_["type"].toString();
     QString destination = destinations_[type].toString();
     QString path = destination + "/" + metadata_["filename"].toString();
 
-    qtlibs::Dir(destination).make();
+    qtlib::Dir(destination).make();
 
     if (type == "bin"
             && package.installAsProgram(path)) {
diff --git a/src/app/handlers/xdgurl.h b/src/app/handlers/xdgurl.h
index 8abfa5e814c9d3298dd3e65f20246f1f1b519ff8..1ac7baa00073627119be7ae5fe16d3d7b289d512 100644
--- a/src/app/handlers/xdgurl.h
+++ b/src/app/handlers/xdgurl.h
@@ -3,9 +3,9 @@
 #include <QObject>
 #include <QJsonObject>
 
-#include "qtlibs/config.h"
+#include "qtlib_config.h"
 
-namespace qtlibs {
+namespace qtlib {
 class NetworkResource;
 }
 
@@ -16,7 +16,7 @@ class XdgUrl : public QObject
     Q_OBJECT
 
 public:
-    explicit XdgUrl(const QString &xdgUrl, const qtlibs::Config &config, QObject *parent = 0);
+    explicit XdgUrl(const QString &xdgUrl, const qtlib::Config &config, QObject *parent = 0);
 
 signals:
     void started();
@@ -33,17 +33,17 @@ public slots:
     void openDestination();
 
 private slots:
-    void networkResourceFinished(qtlibs::NetworkResource *resource);
+    void networkResourceFinished(qtlib::NetworkResource *resource);
 
 private:
     void parse();
     void loadDestinations();
     QString convertPathString(const QString &path);
-    void saveDownloadedFile(qtlibs::NetworkResource *resource);
-    void installDownloadedFile(qtlibs::NetworkResource *resource);
+    void saveDownloadedFile(qtlib::NetworkResource *resource);
+    void installDownloadedFile(qtlib::NetworkResource *resource);
 
     QString xdgUrl_;
-    qtlibs::Config config_;
+    qtlib::Config config_;
     QJsonObject metadata_;
     QJsonObject destinations_;
     QString destination_;
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 6ed32e68340e71f0f326ef0986cce24eb6a7655c..ea7888269569e7a7e817632826513887d85ce827 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -10,7 +10,7 @@
 #include <QQmlApplicationEngine>
 #include <QQmlContext>
 
-#include "qtlibs/config.h"
+#include "qtlib_config.h"
 
 #include "handlers/xdgurl.h"
 
@@ -22,7 +22,7 @@ int main(int argc, char *argv[])
 #endif
     QGuiApplication app(argc, argv);
 
-    qtlibs::Config config(":/configs");
+    qtlib::Config config(":/configs");
     QJsonObject configApplication = config.get("application");
 
     app.setApplicationName(configApplication["name"].toString());
diff --git a/src/lib/qtlib/qtlib.pri b/src/lib/qtlib/qtlib.pri
new file mode 100644
index 0000000000000000000000000000000000000000..2cc38b2c8b9fb68afee226262dff130009ef5104
--- /dev/null
+++ b/src/lib/qtlib/qtlib.pri
@@ -0,0 +1,31 @@
+QT += \
+    core \
+    network
+
+HEADERS += \
+    $${PWD}/qtlib_file.h \
+    $${PWD}/qtlib_dir.h \
+    $${PWD}/qtlib_json.h \
+    $${PWD}/qtlib_config.h \
+    $${PWD}/qtlib_networkresource.h \
+    $${PWD}/qtlib_ocsapi.h \
+    $${PWD}/qtlib_package.h
+
+SOURCES += \
+    $${PWD}/qtlib_file.cpp \
+    $${PWD}/qtlib_dir.cpp \
+    $${PWD}/qtlib_json.cpp \
+    $${PWD}/qtlib_config.cpp \
+    $${PWD}/qtlib_networkresource.cpp \
+    $${PWD}/qtlib_ocsapi.cpp \
+    $${PWD}/qtlib_package.cpp
+
+INCLUDEPATH += $${PWD}
+
+unix:!ios:!android {
+    DEFINES += QTLIB_UNIX
+}
+
+android {
+    QT += androidextras
+}
diff --git a/src/libs/qtlibs/config.cpp b/src/lib/qtlib/qtlib_config.cpp
similarity index 73%
rename from src/libs/qtlibs/config.cpp
rename to src/lib/qtlib/qtlib_config.cpp
index 11e0de575c9050a752bdb5fc9266fbccfc602fc6..6a06a5dc9c7f4848aec005c4b8cbfe5630cb3a4f 100644
--- a/src/libs/qtlibs/config.cpp
+++ b/src/lib/qtlib/qtlib_config.cpp
@@ -6,16 +6,16 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "config.h"
+#include "qtlib_config.h"
 
-#include "file.h"
-#include "dir.h"
-#include "json.h"
+#include "qtlib_file.h"
+#include "qtlib_dir.h"
+#include "qtlib_json.h"
 
-namespace qtlibs {
+namespace qtlib {
 
 Config::Config(const QString &configDirPath, QObject *parent)
     : QObject(parent), configDirPath_(configDirPath)
@@ -46,22 +46,22 @@ void Config::setConfigDirPath(const QString &configDirPath)
 QJsonObject Config::get(const QString &name)
 {
     QString configFilePath = configDirPath() + "/" + name + ".json";
-    QByteArray json = qtlibs::File(configFilePath).readData();
+    QByteArray json = qtlib::File(configFilePath).readData();
     if (json.isEmpty()) {
         json = QString("{}").toUtf8(); // Blank JSON data as default
     }
-    return qtlibs::Json(json).toObject();
+    return qtlib::Json(json).toObject();
 }
 
 bool Config::set(const QString &name, const QJsonObject &object)
 {
     QString configFilePath = configDirPath() + "/" + name + ".json";
-    QByteArray json = qtlibs::Json(object).toJson();
-    qtlibs::Dir(configDirPath()).make();
-    if (qtlibs::File(configFilePath).writeData(json)) {
+    QByteArray json = qtlib::Json(object).toJson();
+    qtlib::Dir(configDirPath()).make();
+    if (qtlib::File(configFilePath).writeData(json)) {
         return true;
     }
     return false;
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/config.h b/src/lib/qtlib/qtlib_config.h
similarity index 89%
rename from src/libs/qtlibs/config.h
rename to src/lib/qtlib/qtlib_config.h
index 190c2c7d41d6fe2fa1e1b72e0f42a9d313dc3eeb..87b9d5f9f9af77d397f61e186c7d7000730724b4 100644
--- a/src/libs/qtlibs/config.h
+++ b/src/lib/qtlib/qtlib_config.h
@@ -6,7 +6,7 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
@@ -14,7 +14,7 @@
 #include <QObject>
 #include <QJsonObject>
 
-namespace qtlibs {
+namespace qtlib {
 
 class Config : public QObject
 {
@@ -36,4 +36,4 @@ private:
     QString configDirPath_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/dir.cpp b/src/lib/qtlib/qtlib_dir.cpp
similarity index 96%
rename from src/libs/qtlibs/dir.cpp
rename to src/lib/qtlib/qtlib_dir.cpp
index c444ae6c02651e72d2ba6056417de56bec151e94..57e3768cf2d36e2ff35d5817b54b85376844706a 100644
--- a/src/libs/qtlibs/dir.cpp
+++ b/src/lib/qtlib/qtlib_dir.cpp
@@ -6,17 +6,17 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "dir.h"
+#include "qtlib_dir.h"
 
 #include <QDir>
 #include <QFile>
 #include <QFileInfo>
 #include <QStandardPaths>
 
-namespace qtlibs {
+namespace qtlib {
 
 Dir::Dir(const QString &path, QObject *parent)
     : QObject(parent), path_(path)
@@ -158,4 +158,4 @@ bool Dir::copyRecursively(const QString &srcPath, const QString &newPath)
     return false;
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/dir.h b/src/lib/qtlib/qtlib_dir.h
similarity index 92%
rename from src/libs/qtlibs/dir.h
rename to src/lib/qtlib/qtlib_dir.h
index aa3dfe15369a49bf5bfd49e87a92ddaaa54a6554..000c0e687915a8f44b6b5181058e4f56f92bdf5e 100644
--- a/src/libs/qtlibs/dir.h
+++ b/src/lib/qtlib/qtlib_dir.h
@@ -6,7 +6,7 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
@@ -14,7 +14,7 @@
 #include <QObject>
 #include <QFileInfoList>
 
-namespace qtlibs {
+namespace qtlib {
 
 class Dir : public QObject
 {
@@ -50,4 +50,4 @@ private:
     QString path_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/file.cpp b/src/lib/qtlib/qtlib_file.cpp
similarity index 94%
rename from src/libs/qtlibs/file.cpp
rename to src/lib/qtlib/qtlib_file.cpp
index 39d9542826fb3f92a6ed853e23dfe3326f20f169..ad074fbbd90191fbd893fc36f8ed32d3b3f17d01 100644
--- a/src/libs/qtlibs/file.cpp
+++ b/src/lib/qtlib/qtlib_file.cpp
@@ -6,16 +6,16 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "file.h"
+#include "qtlib_file.h"
 
 #include <QIODevice>
 #include <QTextStream>
 #include <QFile>
 
-namespace qtlibs {
+namespace qtlib {
 
 File::File(const QString &path, QObject *parent)
     : QObject(parent), path_(path)
@@ -115,4 +115,4 @@ bool File::remove()
     return file.remove();
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/file.h b/src/lib/qtlib/qtlib_file.h
similarity index 90%
rename from src/libs/qtlibs/file.h
rename to src/lib/qtlib/qtlib_file.h
index d9a77830189e8d51fc4595eb0ee07450e31ff2d0..23a83fcec7644e3252ef6f3ac57c9e26aeb95635 100644
--- a/src/libs/qtlibs/file.h
+++ b/src/lib/qtlib/qtlib_file.h
@@ -6,14 +6,14 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
 
 #include <QObject>
 
-namespace qtlibs {
+namespace qtlib {
 
 class File : public QObject
 {
@@ -41,4 +41,4 @@ private:
     QString path_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/json.cpp b/src/lib/qtlib/qtlib_json.cpp
similarity index 94%
rename from src/libs/qtlibs/json.cpp
rename to src/lib/qtlib/qtlib_json.cpp
index 09d992231a8aa3dc577b0304fd6b787493f9bfb1..8a3c771eafb3c356c9bf54bdec878156c616fbf4 100644
--- a/src/libs/qtlibs/json.cpp
+++ b/src/lib/qtlib/qtlib_json.cpp
@@ -6,15 +6,15 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "json.h"
+#include "qtlib_json.h"
 
 #include <QJsonDocument>
 #include <QJsonParseError>
 
-namespace qtlibs {
+namespace qtlib {
 
 Json::Json(const QByteArray &json, QObject *parent)
     : QObject(parent), json_(json)
@@ -106,4 +106,4 @@ bool Json::isArray()
     return doc.isArray();
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/json.h b/src/lib/qtlib/qtlib_json.h
similarity index 91%
rename from src/libs/qtlibs/json.h
rename to src/lib/qtlib/qtlib_json.h
index 1c60a145c6c75f831670f0e274d1e97b6e33d6c0..7072bd231693cc7f50537dfea197afc70b119df6 100644
--- a/src/libs/qtlibs/json.h
+++ b/src/lib/qtlib/qtlib_json.h
@@ -6,7 +6,7 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
@@ -15,7 +15,7 @@
 #include <QJsonObject>
 #include <QJsonArray>
 
-namespace qtlibs {
+namespace qtlib {
 
 class Json : public QObject
 {
@@ -45,4 +45,4 @@ private:
     QByteArray json_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/networkresource.cpp b/src/lib/qtlib/qtlib_networkresource.cpp
similarity index 96%
rename from src/libs/qtlibs/networkresource.cpp
rename to src/lib/qtlib/qtlib_networkresource.cpp
index 9452d2cf2484bc3fa1de3d9229a76ffba7c9e9d6..e2ac963fb2f740c4a2816e0b7e4dbaa2ccb2a38c 100644
--- a/src/libs/qtlibs/networkresource.cpp
+++ b/src/lib/qtlib/qtlib_networkresource.cpp
@@ -6,16 +6,16 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "networkresource.h"
+#include "qtlib_networkresource.h"
 
 #include <QEventLoop>
 
-#include "file.h"
+#include "qtlib_file.h"
 
-namespace qtlibs {
+namespace qtlib {
 
 NetworkResource::NetworkResource(const QString &id, const QUrl &url, bool async, QObject *parent)
     : QObject(parent), id_(id), url_(url), async_(async)
@@ -182,7 +182,7 @@ QByteArray NetworkResource::readData()
 bool NetworkResource::saveData(const QString &path)
 {
     if (isFinishedWithNoError()) {
-        return qtlibs::File(path).writeData(reply()->readAll());
+        return qtlib::File(path).writeData(reply()->readAll());
     }
     return false;
 }
@@ -278,4 +278,4 @@ NetworkResource *NetworkResource::send(const QUrl &url, bool async)
     return this;
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/networkresource.h b/src/lib/qtlib/qtlib_networkresource.h
similarity index 96%
rename from src/libs/qtlibs/networkresource.h
rename to src/lib/qtlib/qtlib_networkresource.h
index 4d9e041d979938676b4ddf24cb0469170a36e7b9..1e5c01955dddcf14729d3cee68cc77df1086795b 100644
--- a/src/libs/qtlibs/networkresource.h
+++ b/src/lib/qtlib/qtlib_networkresource.h
@@ -6,7 +6,7 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
@@ -18,7 +18,7 @@
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
 
-namespace qtlibs {
+namespace qtlib {
 
 class NetworkResource : public QObject
 {
@@ -87,4 +87,4 @@ private:
     QByteArray contentData_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/ocsapi.cpp b/src/lib/qtlib/qtlib_ocsapi.cpp
similarity index 75%
rename from src/libs/qtlibs/ocsapi.cpp
rename to src/lib/qtlib/qtlib_ocsapi.cpp
index 389c2bfd4147c9381b3f3860655550badb69b9e9..77c217aec7b845863a84519ba2f72da4f749b4b2 100644
--- a/src/libs/qtlibs/ocsapi.cpp
+++ b/src/lib/qtlib/qtlib_ocsapi.cpp
@@ -6,17 +6,17 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "ocsapi.h"
+#include "qtlib_ocsapi.h"
 
 #include <QXmlStreamReader>
 
-#include "json.h"
-#include "networkresource.h"
+#include "qtlib_json.h"
+#include "qtlib_networkresource.h"
 
-namespace qtlibs {
+namespace qtlib {
 
 // OCS-API Specification
 // https://www.freedesktop.org/wiki/Specifications/open-collaboration-services/
@@ -87,8 +87,8 @@ QJsonObject OcsApi::getConfig()
 {
     QUrl url = baseUrl().resolved(QUrl("config"));
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::checkPerson()
@@ -98,8 +98,8 @@ QJsonObject OcsApi::checkPerson()
     formData.addQueryItem("login", userName());
     formData.addQueryItem("password", password());
     formData.addQueryItem("format", "json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.post(formData)->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.post(formData)->readData()).toObject();
 }
 
 QJsonObject OcsApi::getPersonDataSet(const QUrlQuery &query)
@@ -111,8 +111,8 @@ QJsonObject OcsApi::getPersonDataSet(const QUrlQuery &query)
     newQuery.removeQueryItem("format");
     newQuery.addQueryItem("format", "json");
     url.setQuery(newQuery);
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getPersonData(const QString &personId)
@@ -121,8 +121,8 @@ QJsonObject OcsApi::getPersonData(const QString &personId)
     url.setUserName(userName());
     url.setPassword(password());
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getPersonSelf()
@@ -131,16 +131,16 @@ QJsonObject OcsApi::getPersonSelf()
     url.setUserName(userName());
     url.setPassword(password());
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getContentCategories()
 {
     QUrl url = baseUrl().resolved(QUrl("content/categories"));
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getContentDataSet(const QUrlQuery &query)
@@ -150,30 +150,30 @@ QJsonObject OcsApi::getContentDataSet(const QUrlQuery &query)
     newQuery.removeQueryItem("format");
     newQuery.addQueryItem("format", "json");
     url.setQuery(newQuery);
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getContentData(const QString &contentId)
 {
     QUrl url = baseUrl().resolved(QUrl("content/data/" + contentId));
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonObject OcsApi::getContentDownload(const QString &contentId, const QString &itemId)
 {
     QUrl url = baseUrl().resolved(QUrl("content/download/" + contentId + "/" + itemId));
     url.setQuery("format=json");
-    qtlibs::NetworkResource resource(url.toString(), url, false);
-    return qtlibs::Json(resource.get()->readData()).toObject();
+    qtlib::NetworkResource resource(url.toString(), url, false);
+    return qtlib::Json(resource.get()->readData()).toObject();
 }
 
 QJsonArray OcsApi::getProviderFile(const QUrl &url)
 {
     QJsonArray providers;
-    qtlibs::NetworkResource resource(url.toString(), url, false);
+    qtlib::NetworkResource resource(url.toString(), url, false);
     QXmlStreamReader reader(resource.get()->readData());
     QStringList whitelist;
     whitelist << "id" << "location" << "name" << "icon" << "termsofuse" << "register";
@@ -196,4 +196,4 @@ QJsonArray OcsApi::getProviderFile(const QUrl &url)
     return providers;
 }
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/ocsapi.h b/src/lib/qtlib/qtlib_ocsapi.h
similarity index 94%
rename from src/libs/qtlibs/ocsapi.h
rename to src/lib/qtlib/qtlib_ocsapi.h
index 3e43748d57fba6566547c48737d60793395adbc0..0ab08eb2d3a65a4770f4f3f31184705d89c5f15d 100644
--- a/src/libs/qtlibs/ocsapi.h
+++ b/src/lib/qtlib/qtlib_ocsapi.h
@@ -6,7 +6,7 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
@@ -17,7 +17,7 @@
 #include <QJsonObject>
 #include <QJsonArray>
 
-namespace qtlibs {
+namespace qtlib {
 
 class OcsApi : public QObject
 {
@@ -57,4 +57,4 @@ private:
     QString password_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/package.cpp b/src/lib/qtlib/qtlib_package.cpp
similarity index 96%
rename from src/libs/qtlibs/package.cpp
rename to src/lib/qtlib/qtlib_package.cpp
index 9db1ae9ab9c872e4733834780e5e9b656b5edd92..c3541c42e5b08bb9719b9850f4808a548cb3b639 100644
--- a/src/libs/qtlibs/package.cpp
+++ b/src/lib/qtlib/qtlib_package.cpp
@@ -6,12 +6,12 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
-#include "package.h"
+#include "qtlib_package.h"
 
-#ifdef QTLIBS_UNIX
+#ifdef QTLIB_UNIX
 #include <QJsonObject>
 #include <QMimeDatabase>
 #include <QProcess>
@@ -21,7 +21,7 @@
 #include <QAndroidJniObject>
 #endif
 
-namespace qtlibs {
+namespace qtlib {
 
 Package::Package(const QString &path, QObject *parent)
     : QObject(parent), path_(path)
@@ -49,7 +49,7 @@ void Package::setPath(const QString &path)
     path_ = path;
 }
 
-#ifdef QTLIBS_UNIX
+#ifdef QTLIB_UNIX
 bool Package::installAsProgram(const QString &newPath)
 {
     QStringList arguments;
@@ -148,7 +148,7 @@ bool Package::installAsApk()
 }
 #endif
 
-#ifdef QTLIBS_UNIX
+#ifdef QTLIB_UNIX
 bool Package::execute(const QString &program, const QStringList &arguments)
 {
     QProcess process;
@@ -161,4 +161,4 @@ bool Package::execute(const QString &program, const QStringList &arguments)
 }
 #endif
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/package.h b/src/lib/qtlib/qtlib_package.h
similarity index 89%
rename from src/libs/qtlibs/package.h
rename to src/lib/qtlib/qtlib_package.h
index 077a8cdddbba17acd4e4f40bc83526bcc4ab7969..321082331106cc15cff233f79f884d9e693c0713 100644
--- a/src/libs/qtlibs/package.h
+++ b/src/lib/qtlib/qtlib_package.h
@@ -6,14 +6,14 @@
  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
  * @copyright   Akira Ohgaki
  * @license     https://opensource.org/licenses/LGPL-3.0  The GNU Lesser General Public License, version 3.0
- * @link        https://github.com/akiraohgaki/qtlibs
+ * @link        https://github.com/akiraohgaki/qtlib
  */
 
 #pragma once
 
 #include <QObject>
 
-namespace qtlibs {
+namespace qtlib {
 
 class Package : public QObject
 {
@@ -28,7 +28,7 @@ public:
     QString path() const;
     void setPath(const QString &path);
 
-#ifdef QTLIBS_UNIX
+#ifdef QTLIB_UNIX
     bool installAsProgram(const QString &newPath);
     bool installAsFile(const QString &newPath);
     bool installAsArchive(const QString &destinationDirPath);
@@ -41,11 +41,11 @@ public:
 #endif
 
 private:
-#ifdef QTLIBS_UNIX
+#ifdef QTLIB_UNIX
     bool execute(const QString &program, const QStringList &arguments);
 #endif
 
     QString path_;
 };
 
-} // namespace qtlibs
+} // namespace qtlib
diff --git a/src/libs/qtlibs/qtlibs.pri b/src/libs/qtlibs/qtlibs.pri
deleted file mode 100644
index 09fce3e06b7d23b4122a31145295e7f5da1a7cde..0000000000000000000000000000000000000000
--- a/src/libs/qtlibs/qtlibs.pri
+++ /dev/null
@@ -1,29 +0,0 @@
-QT += \
-    core \
-    network
-
-HEADERS += \
-    $${PWD}/file.h \
-    $${PWD}/dir.h \
-    $${PWD}/json.h \
-    $${PWD}/config.h \
-    $${PWD}/networkresource.h \
-    $${PWD}/ocsapi.h \
-    $${PWD}/package.h
-
-SOURCES += \
-    $${PWD}/file.cpp \
-    $${PWD}/dir.cpp \
-    $${PWD}/json.cpp \
-    $${PWD}/config.cpp \
-    $${PWD}/networkresource.cpp \
-    $${PWD}/ocsapi.cpp \
-    $${PWD}/package.cpp
-
-unix:!ios:!android {
-    DEFINES += QTLIBS_UNIX
-}
-
-android {
-    QT += androidextras
-}
diff --git a/xdgurl.pro b/xdgurl.pro
index ef0d7d99b58cff15dad44833239417660a004dcd..7e008d5a1016896ae32b8bc08ef6bb82109323e9 100644
--- a/xdgurl.pro
+++ b/xdgurl.pro
@@ -1,13 +1,13 @@
+include(src/lib/qtlib/qtlib.pri)
+
+include(src/app/app.pri)
+
 TARGET = xdgurl
 
 TEMPLATE = app
 
 CONFIG += c++11
 
-INCLUDEPATH += \
-    src/app \
-    src/libs
-
 RESOURCES += src/desktop/desktop.qrc
 
 DISTFILES += \
@@ -24,8 +24,4 @@ DISTFILES += \
     pkg/fedora/xdgurl.spec \
     pkg/arch/PKGBUILD
 
-include(src/libs/qtlibs/qtlibs.pri)
-
-include(src/app/app.pri)
-
 include(deployment.pri)