diff --git a/.gitignore b/.gitignore
index 8cd3008..57c8351 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/microdnf-3.0.1.tar.gz
+SOURCES/microdnf-3.4.0.tar.gz
diff --git a/.microdnf.metadata b/.microdnf.metadata
index 73985d4..39c4f11 100644
--- a/.microdnf.metadata
+++ b/.microdnf.metadata
@@ -1 +1 @@
-8894269d9f26cdb20b54a989ce659ff3165f4c5f SOURCES/microdnf-3.0.1.tar.gz
+aff8076a31c3d7a7e7b204f03d8a522415a657a1 SOURCES/microdnf-3.4.0.tar.gz
diff --git a/SOURCES/0001-Add-support-for-releasever.patch b/SOURCES/0001-Add-support-for-releasever.patch
deleted file mode 100644
index d1250cf..0000000
--- a/SOURCES/0001-Add-support-for-releasever.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From 95ff60a5f0042ca587d0dad92b8a58f6a56be461 Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Wed, 10 Apr 2019 16:03:48 +0200
-Subject: [PATCH 1/2] Parse global arguments before context setup
-
-This is a preparation for support more program arguments.
-
-Some settings (eg. dnf_context_set_release_ver(), dnf_context_set_repo_dir())
-must be done before dnf_context_setup() function is called.
-So global arguments must be parsed before dnf_context_setup() is called.
-
-On the other hand there are functions which must be called after
-context setup. -> List of enabled and disabled repositories is stored
-to GSList and used later.
----
- dnf/dnf-main.c | 41 ++++++++++++++++++++++++++++-------------
- 1 file changed, 28 insertions(+), 13 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index ef5a04e..ebf429f 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -30,6 +30,7 @@ static gboolean opt_yes = TRUE;
- static gboolean opt_nodocs = FALSE;
- static gboolean show_help = FALSE;
- static gboolean dl_pkgs_printed = FALSE;
-+static GSList *enable_disable_repos = NULL;
- 
- static gboolean
- process_global_option (const gchar  *option_name,
-@@ -40,21 +41,20 @@ process_global_option (const gchar  *option_name,
-   g_autoptr(GError) local_error = NULL;
-   DnfContext *ctx = DNF_CONTEXT (data);
- 
--  gboolean ret;
-+  gboolean ret = TRUE;
-   if (g_strcmp0 (option_name, "--disablerepo") == 0)
-     {
--      ret = show_help ? TRUE : dnf_context_repo_disable (ctx, value, &local_error);
-+      enable_disable_repos = g_slist_append (enable_disable_repos, g_strconcat("d", value, NULL));
-     }
-   else if (g_strcmp0 (option_name, "--enablerepo") == 0)
-     {
--      ret = show_help ? TRUE : dnf_context_repo_enable (ctx, value, &local_error);
-+      enable_disable_repos = g_slist_append (enable_disable_repos, g_strconcat("e", value, NULL));
-     }
-   else if (g_strcmp0 (option_name, "--setopt") == 0)
-     {
-       if (g_strcmp0 (value, "tsflags=nodocs") == 0)
-         {
-           opt_nodocs = TRUE;
--          ret = TRUE;
-         }
-       else
-         {
-@@ -235,6 +235,11 @@ main (int   argc,
- 
-   /*
-    * Parse the global options.
-+   */
-+  if (!g_option_context_parse (opt_ctx, &argc, &argv, &error))
-+    goto out;
-+
-+  /*
-    * Initialize dnf context only if help is not requested.
-    */
-   if (!show_help)
-@@ -246,14 +251,24 @@ main (int   argc,
-                         G_CALLBACK (state_action_changed_cb),
-                         NULL);
- 
--    }
--  if (!g_option_context_parse (opt_ctx, &argc, &argv, &error))
--    goto out;
--  if (!show_help && opt_nodocs)
--    {
--      DnfTransaction *txn = dnf_context_get_transaction (ctx);
--      dnf_transaction_set_flags (txn,
--                                 dnf_transaction_get_flags (txn) | DNF_TRANSACTION_FLAG_NODOCS);
-+      for (GSList * item = enable_disable_repos; item; item = item->next)
-+        {
-+          gchar * item_data = item->data;
-+          int ret;
-+          if (item_data[0] == 'd')
-+            ret = dnf_context_repo_disable (ctx, item_data+1, &error);
-+          else
-+            ret = dnf_context_repo_enable (ctx, item_data+1, &error);
-+          if (!ret)
-+            goto out;
-+        }
-+
-+      if (opt_nodocs)
-+        {
-+          DnfTransaction *txn = dnf_context_get_transaction (ctx);
-+          dnf_transaction_set_flags (txn,
-+                                     dnf_transaction_get_flags (txn) | DNF_TRANSACTION_FLAG_NODOCS);
-+        }
-     }
- 
-   /*
-@@ -271,7 +286,7 @@ main (int   argc,
-   if (cmd_name != NULL) --argc;
- 
-   g_option_context_set_help_enabled (opt_ctx, TRUE);
--  
-+
-   if (cmd_name == NULL && show_help)
-     {
-       g_set_prgname (argv[0]);
-
-From 594f4ae5fdd60215a5010526406a34536472bb30 Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Thu, 11 Apr 2019 09:56:11 +0200
-Subject: [PATCH 2/2] Add support for --releasever (RhBug:1591627)
-
----
- dnf/dnf-main.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index ebf429f..2381f20 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -50,6 +50,10 @@ process_global_option (const gchar  *option_name,
-     {
-       enable_disable_repos = g_slist_append (enable_disable_repos, g_strconcat("e", value, NULL));
-     }
-+  else if (g_strcmp0 (option_name, "--releasever") == 0)
-+    {
-+      dnf_context_set_release_ver (ctx, value);
-+    }
-   else if (g_strcmp0 (option_name, "--setopt") == 0)
-     {
-       if (g_strcmp0 (value, "tsflags=nodocs") == 0)
-@@ -81,6 +85,7 @@ static const GOptionEntry global_opts[] = {
-   { "disablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Disable repository by an id", "ID" },
-   { "enablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Enable repository by an id", "ID" },
-   { "nodocs", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_nodocs, "Install packages without docs", NULL },
-+  { "releasever", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Override the value of $releasever in config and repo files", "RELEASEVER" },
-   { "setopt", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Set transaction flag, like tsflags=nodocs", "FLAG" },
-   { NULL }
- };
diff --git a/SOURCES/0002-Fix-minor-memory-leaks-RhBug1702283.patch b/SOURCES/0002-Fix-minor-memory-leaks-RhBug1702283.patch
deleted file mode 100644
index dad7377..0000000
--- a/SOURCES/0002-Fix-minor-memory-leaks-RhBug1702283.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 854119bb3cd790333cd7ed135fdc5c9cdca1d551 Mon Sep 17 00:00:00 2001
-From: Aleš Matěj <amatej@redhat.com>
-Date: Tue, 28 May 2019 15:07:11 +0200
-Subject: [PATCH] Fix minor memory leaks, RhBug:1702283
-
----
- dnf/dnf-utils.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/dnf-utils.c b/dnf/dnf-utils.c
-index ea067ad..14f1667 100644
---- a/dnf/dnf-utils.c
-+++ b/dnf/dnf-utils.c
-@@ -48,7 +48,9 @@ dnf_utils_add_transaction_packages (struct libscols_table *tb,
-       struct libscols_line *ln = scols_table_new_line (tb, parent);
-       scols_line_set_data (ln, COL_NEVRA, dnf_package_get_nevra (pkg));
-       scols_line_set_data (ln, COL_REPO, dnf_package_get_reponame (pkg));
--      scols_line_set_data (ln, COL_SIZE, g_format_size (dnf_package_get_size (pkg)));
-+      char *formatted_pkg_size = g_format_size (dnf_package_get_size (pkg));
-+      scols_line_set_data (ln, COL_SIZE, formatted_pkg_size);
-+      g_free(formatted_pkg_size);
-     }
- }
- 
-@@ -135,6 +137,7 @@ dnf_utils_print_transaction (DnfContext *ctx)
-     }
- 
-   scols_print_table (tb);
-+  scols_unref_symbols (sb);
-   scols_unref_table (tb);
- 
-   g_print ("Transaction Summary:\n");
---
-libgit2 0.27.8
-
diff --git a/SOURCES/0003-use-help2man-to-generate-a-man-page.patch b/SOURCES/0003-use-help2man-to-generate-a-man-page.patch
deleted file mode 100644
index 4ef2af5..0000000
--- a/SOURCES/0003-use-help2man-to-generate-a-man-page.patch
+++ /dev/null
@@ -1,192 +0,0 @@
-From a8d57daa4b7a98176a98af29e52c1df1295659cb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Wed, 20 Feb 2019 17:18:00 +0100
-Subject: [PATCH 1/4] Reformat the commands listing in --help
-
-Use just spaces as a separator to be consistent with dnf, at least two
-spaces are needed so that help2man formats the commands correctly in the
-man page.
----
- dnf/dnf-main.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index 2381f20..fd6406d 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -215,7 +215,11 @@ main (int   argc,
-       if (!peas_engine_load_plugin (engine, info))
-         continue;
-       if (peas_engine_provides_extension (engine, info, DNF_TYPE_COMMAND))
--        g_string_append_printf (cmd_summary, "\n  %s - %s", peas_plugin_info_get_name (info), peas_plugin_info_get_description (info));
-+        /*
-+         * At least 2 spaces between the command and its description are needed
-+         * so that help2man formats it correctly.
-+         */
-+        g_string_append_printf (cmd_summary, "\n  %-16s     %s", peas_plugin_info_get_name (info), peas_plugin_info_get_description (info));
-     }
-   g_option_context_set_summary (opt_ctx, cmd_summary->str);
-   g_string_free (cmd_summary, TRUE);
--- 
-2.24.0
-
-
-From 838a235bba14d48f65ba760f35f32f9d090043fe Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Mon, 17 Jun 2019 12:48:13 +0200
-Subject: [PATCH 2/4] Print only the binary name instead of the full path in
- --help
-
-Removes the directory path from argv[0] for the program name in --help.
-This is required for generating the man page with help2man, as the
-build directory would appear in the man page.
----
- dnf/dnf-main.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index fd6406d..e35ace0 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -298,7 +298,10 @@ main (int   argc,
- 
-   if (cmd_name == NULL && show_help)
-     {
--      g_set_prgname (argv[0]);
-+      const char *prg_name = strrchr(argv[0], '/') + 1;
-+      prg_name = prg_name ? prg_name : argv[0];
-+
-+      g_set_prgname (prg_name);
-       g_autofree gchar *help = g_option_context_get_help (opt_ctx, TRUE, NULL);
-       g_print ("%s", help);
-       goto out;
--- 
-2.24.0
-
-
-From b00e2adb2520f11442f3a7cf3710e64f5f60dab2 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lukkash@email.cz>
-Date: Wed, 20 Feb 2019 15:17:33 +0100
-Subject: [PATCH 3/4] Add generating a manpage using help2man to meson.build
-
-Generates a man page using help2man. Note:
-
-- The version in meson.build now needs to be updated on every release,
-  it is used in the man page.
-
-- help2man is a new build dependency.
-
-- Packagers should add the generated man page to packages.
----
- dnf/meson.build |  2 +-
- meson.build     | 21 ++++++++++++++++++++-
- 2 files changed, 21 insertions(+), 2 deletions(-)
-
-diff --git a/dnf/meson.build b/dnf/meson.build
-index fe37998..f8f1bf3 100644
---- a/dnf/meson.build
-+++ b/dnf/meson.build
-@@ -40,7 +40,7 @@ microdnf_srcs = [
-   'plugins/clean/dnf-command-clean.c',
- ]
- 
--executable(
-+microdnf = executable(
-   'microdnf',
-   sources : microdnf_srcs,
-   dependencies : [
-diff --git a/meson.build b/meson.build
-index 1f01ae0..a3601aa 100644
---- a/meson.build
-+++ b/meson.build
-@@ -1,5 +1,5 @@
- project('microdnf', 'c',
--        version : '1',
-+        version : '3.0.1',
-         license : 'GPL-3.0+',
-         default_options : [
-           'b_asneeded=True',
-@@ -44,3 +44,22 @@ add_project_arguments(
- )
- 
- subdir('dnf')
-+
-+help2man = find_program('help2man', required: true)
-+if help2man.found()
-+  help2man_opts = [
-+    '--version-string=' + meson.project_version(),
-+    '--no-info',
-+    '--section=8',
-+    '--name=Micro DNF',
-+  ]
-+
-+  custom_target('microdnf.8',
-+                output: 'microdnf.8',
-+                command: [
-+                  help2man, help2man_opts, '--output=@OUTPUT@', microdnf
-+                ],
-+                install: true,
-+                install_dir: get_option('mandir') + '/man8',
-+  )
-+endif
--- 
-2.24.0
-
-
-From a1c777a4383ccc5f35396e86e6f3b0a1af92bc7c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Mon, 17 Jun 2019 15:10:33 +0200
-Subject: [PATCH 4/4] Add generating a manpage using help2man to CMakeLists.txt
-
-Generates a man page using help2man. Note:
-
-- The version in CMakeLists.txt now needs to be updated on every
-  release, it is used in the man page.
-
-- help2man is a new build dependency.
-
-- Packagers should add the generated man page to packages.
----
- CMakeLists.txt | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 435d7e8..dcf8e2f 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,5 +1,6 @@
- cmake_minimum_required (VERSION 2.8.5)
- project (microdnf C)
-+set (PROJECT_VERSION 3.0.1)
- 
- list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
- 
-@@ -25,6 +26,25 @@ set (PKG_DATADIR ${CMAKE_INSTALL_FULL_DATADIR}/dnf)
- add_definitions (-DPACKAGE_LIBDIR="${PKG_LIBDIR}")
- add_definitions (-DPACKAGE_DATADIR="${PKG_DATADIR}")
- 
-+find_file (HELP2MAN_EXECUTABLE help2man)
-+if (NOT HELP2MAN_EXECUTABLE)
-+  message (FATAL_ERROR "unable to find help2man")
-+endif ()
-+
-+set (MANPAGE ${CMAKE_CURRENT_BINARY_DIR}/microdnf.8)
-+add_custom_command (
-+  DEPENDS microdnf
-+  OUTPUT ${MANPAGE}
-+  COMMAND ${HELP2MAN_EXECUTABLE} $<TARGET_FILE:microdnf>
-+  --version-string=${PROJECT_VERSION}
-+  --no-info
-+  --section=8
-+  --name="Micro DNF"
-+  --output=${MANPAGE}
-+)
-+add_custom_target (manpage ALL DEPENDS ${MANPAGE})
-+install (FILES ${MANPAGE} DESTINATION ${CMAKE_INSTALL_FULL_MANDIR}/man8)
-+
- include_directories (${GLIB_INCLUDE_DIRS})
- include_directories (${GOBJECT_INCLUDE_DIRS})
- include_directories (${PEAS_INCLUDE_DIRS})
--- 
-2.24.0
-
diff --git a/SOURCES/0004-Fix-microdnf---help-coredump.patch b/SOURCES/0004-Fix-microdnf---help-coredump.patch
deleted file mode 100644
index 845eac4..0000000
--- a/SOURCES/0004-Fix-microdnf---help-coredump.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 1701ad8ccccae6f8867a862e074ca30f6583e69f Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Fri, 23 Aug 2019 12:42:42 +0200
-Subject: [PATCH] Fix "microdnf --help" coredump
-
-There was a bug that causes coredump during comand "microdnf --help".
-The bug was in the code that removes the directory path from argv[0]
-(in case argv[0] does not contain '/' character).
----
- dnf/dnf-main.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index e35ace0..7c71bd0 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -298,8 +298,8 @@ main (int   argc,
- 
-   if (cmd_name == NULL && show_help)
-     {
--      const char *prg_name = strrchr(argv[0], '/') + 1;
--      prg_name = prg_name ? prg_name : argv[0];
-+      const char *prg_name = strrchr(argv[0], '/');
-+      prg_name = prg_name ? prg_name + 1 : argv[0];
- 
-       g_set_prgname (prg_name);
-       g_autofree gchar *help = g_option_context_get_help (opt_ctx, TRUE, NULL);
--- 
-2.24.0
-
diff --git a/SOURCES/0005-Allow-downgrade-for-all-transactions-microdnf-does-RhBug1725863.patch b/SOURCES/0005-Allow-downgrade-for-all-transactions-microdnf-does-RhBug1725863.patch
deleted file mode 100644
index 1c22ec6..0000000
--- a/SOURCES/0005-Allow-downgrade-for-all-transactions-microdnf-does-RhBug1725863.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From a22e544907364467c9206fc196a9e43b684465a2 Mon Sep 17 00:00:00 2001
-From: Aleš Matěj <amatej@redhat.com>
-Date: Tue, 27 Aug 2019 10:54:14 +0200
-Subject: [PATCH] Allow downgrade for all transactions microdnf does (RhBug:1725863)
-
-It can sometimes be necessary to satisfy dependencies or if the user
-wants to specifically downgrade some package.
----
- dnf/dnf-main.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index 7c71bd0..693ad7f 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -272,12 +272,16 @@ main (int   argc,
-             goto out;
-         }
- 
-+      /* allow downgrades for all transaction types */
-+      DnfTransaction *txn = dnf_context_get_transaction (ctx);
-+      int flags = dnf_transaction_get_flags (txn) | DNF_TRANSACTION_FLAG_ALLOW_DOWNGRADE;
-+
-       if (opt_nodocs)
-         {
--          DnfTransaction *txn = dnf_context_get_transaction (ctx);
--          dnf_transaction_set_flags (txn,
--                                     dnf_transaction_get_flags (txn) | DNF_TRANSACTION_FLAG_NODOCS);
-+          flags |= DNF_TRANSACTION_FLAG_NODOCS;
-         }
-+
-+      dnf_transaction_set_flags (txn, flags);
-     }
- 
-   /*
---
-libgit2 0.28.2
-
diff --git a/SOURCES/0006-Add-support-of-best-behavior.patch b/SOURCES/0006-Add-support-of-best-behavior.patch
deleted file mode 100644
index 6136eac..0000000
--- a/SOURCES/0006-Add-support-of-best-behavior.patch
+++ /dev/null
@@ -1,186 +0,0 @@
-From 88602163094d654451a9586121aa8ff6fd7c96b0 Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 23 Oct 2019 13:14:45 +0200
-Subject: [PATCH 1/3] Add option best for transactions (RhBug:1679476)
-
-It adds option `--best` plus default is handled from libdnf.conf and
-dnf.conf
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1679476
----
- dnf/dnf-main.c                            | 7 ++++++-
- dnf/plugins/install/dnf-command-install.c | 7 ++++++-
- dnf/plugins/update/dnf-command-update.c   | 8 ++++++--
- 3 files changed, 18 insertions(+), 4 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index 693ad7f..0dce9b2 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -28,6 +28,7 @@
- 
- static gboolean opt_yes = TRUE;
- static gboolean opt_nodocs = FALSE;
-+static gboolean opt_best = FALSE;
- static gboolean show_help = FALSE;
- static gboolean dl_pkgs_printed = FALSE;
- static GSList *enable_disable_repos = NULL;
-@@ -82,6 +83,7 @@ process_global_option (const gchar  *option_name,
- 
- static const GOptionEntry global_opts[] = {
-   { "assumeyes", 'y', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &opt_yes, "Does nothing, we always assume yes", NULL },
-+  { "best", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_best, "Try the best available package versions in transactions", NULL },
-   { "disablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Disable repository by an id", "ID" },
-   { "enablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Enable repository by an id", "ID" },
-   { "nodocs", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_nodocs, "Install packages without docs", NULL },
-@@ -283,7 +285,10 @@ main (int   argc,
- 
-       dnf_transaction_set_flags (txn, flags);
-     }
--
-+  if (!show_help && opt_best)
-+    {
-+        dnf_context_set_best(opt_best);
-+    }
-   /*
-    * The first non-option is the command.
-    * Get it and remove it from arguments.
-diff --git a/dnf/plugins/install/dnf-command-install.c b/dnf/plugins/install/dnf-command-install.c
-index ea549da..0b2f5e5 100644
---- a/dnf/plugins/install/dnf-command-install.c
-+++ b/dnf/plugins/install/dnf-command-install.c
-@@ -73,7 +73,12 @@ dnf_command_install_run (DnfCommand      *cmd,
-       if (!dnf_context_install (ctx, *pkg, error))
-         return FALSE;
-     }
--  if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), DNF_INSTALL, error))
-+  DnfGoalActions flags = DNF_INSTALL;
-+  if (dnf_context_get_best())
-+    {
-+      flags |= DNF_FORCE_BEST;
-+    }
-+  if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), flags, error))
-     return FALSE;
-   if (!dnf_utils_print_transaction (ctx))
-     return TRUE;
-diff --git a/dnf/plugins/update/dnf-command-update.c b/dnf/plugins/update/dnf-command-update.c
-index 652d902..7bf1334 100644
---- a/dnf/plugins/update/dnf-command-update.c
-+++ b/dnf/plugins/update/dnf-command-update.c
-@@ -70,8 +70,12 @@ dnf_command_update_run (DnfCommand      *cmd,
-             return FALSE;
-         }
-     }
--
--  if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), 0, error))
-+  DnfGoalActions flags = 0;
-+  if (dnf_context_get_best())
-+    {
-+      flags |= DNF_FORCE_BEST;
-+    }
-+  if (!dnf_goal_depsolve (dnf_context_get_goal (ctx), flags, error))
-     return FALSE;
-   if (!dnf_utils_print_transaction (ctx))
-     return TRUE;
--- 
-2.21.0
-
-
-From 6a4a490d368fc7982264f8ab898e4bd195576b30 Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 23 Oct 2019 13:15:17 +0200
-Subject: [PATCH 2/3] Initialized to use tito.
-
----
- .tito/packages/.readme | 3 +++
- .tito/tito.props       | 5 +++++
- 2 files changed, 8 insertions(+)
- create mode 100644 .tito/packages/.readme
- create mode 100644 .tito/tito.props
-
-diff --git a/.tito/packages/.readme b/.tito/packages/.readme
-new file mode 100644
-index 0000000..b9411e2
---- /dev/null
-+++ b/.tito/packages/.readme
-@@ -0,0 +1,3 @@
-+the .tito/packages directory contains metadata files
-+named after their packages. Each file has the latest tagged
-+version and the project's relative directory.
-diff --git a/.tito/tito.props b/.tito/tito.props
-new file mode 100644
-index 0000000..eab3f19
---- /dev/null
-+++ b/.tito/tito.props
-@@ -0,0 +1,5 @@
-+[buildconfig]
-+builder = tito.builder.Builder
-+tagger = tito.tagger.VersionTagger
-+changelog_do_not_remove_cherrypick = 0
-+changelog_format = %s (%ae)
--- 
-2.21.0
-
-
-From 4af6a4c76e7bce0ce06188319b0b4c21a235266c Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 23 Oct 2019 15:07:55 +0200
-Subject: [PATCH 3/3] Add option --nobest
-
-It is used to overwrite configuration of best option. It is useful when
-best=True is default.
----
- dnf/dnf-main.c | 22 ++++++++++++++++++----
- 1 file changed, 18 insertions(+), 4 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index 0dce9b2..4f19489 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -29,6 +29,7 @@
- static gboolean opt_yes = TRUE;
- static gboolean opt_nodocs = FALSE;
- static gboolean opt_best = FALSE;
-+static gboolean opt_nobest = FALSE;
- static gboolean show_help = FALSE;
- static gboolean dl_pkgs_printed = FALSE;
- static GSList *enable_disable_repos = NULL;
-@@ -86,6 +87,7 @@ static const GOptionEntry global_opts[] = {
-   { "best", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_best, "Try the best available package versions in transactions", NULL },
-   { "disablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Disable repository by an id", "ID" },
-   { "enablerepo", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Enable repository by an id", "ID" },
-+  { "nobest", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_nobest, "Do not limit the transaction to the best candidates", NULL },
-   { "nodocs", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_nodocs, "Install packages without docs", NULL },
-   { "releasever", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Override the value of $releasever in config and repo files", "RELEASEVER" },
-   { "setopt", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, process_global_option, "Set transaction flag, like tsflags=nodocs", "FLAG" },
-@@ -284,11 +286,23 @@ main (int   argc,
-         }
- 
-       dnf_transaction_set_flags (txn, flags);
-+      if (opt_best && opt_nobest)
-+        {
-+          error = g_error_new_literal(G_OPTION_ERROR,
-+                                      G_OPTION_ERROR_BAD_VALUE,
-+                                      "Argument --nobest is not allowed with argument --best");
-+          goto out;
-+        }
-+      if (opt_best)
-+        {
-+          dnf_context_set_best(TRUE);
-+        }
-+      else if (opt_nobest)
-+        {
-+          dnf_context_set_best(FALSE);
-+        }
-     }
--  if (!show_help && opt_best)
--    {
--        dnf_context_set_best(opt_best);
--    }
-+
-   /*
-    * The first non-option is the command.
-    * Get it and remove it from arguments.
--- 
-2.21.0
-
diff --git a/SOURCES/0007-Add-repolist-command-RhBug1584952.patch b/SOURCES/0007-Add-repolist-command-RhBug1584952.patch
deleted file mode 100644
index a74ff5f..0000000
--- a/SOURCES/0007-Add-repolist-command-RhBug1584952.patch
+++ /dev/null
@@ -1,312 +0,0 @@
-From 83f282853e22fe3146b86b33bdaebb7a22b0a580 Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Thu, 7 Nov 2019 21:34:38 +0100
-Subject: [PATCH] Add repolist command (RhBug:1584952)
-
-The command lists repositories.
-
-Command options:
-  --all        show all repositories
-  --disabled   show disabled repositories
-  --enabled    show enabled repositories (default)
-
-Signed-off-by: Jaroslav Rohel <jrohel@redhat.com>
----
- dnf/CMakeLists.txt                                      |   6 ++++++
- dnf/meson.build                                         |   9 +++++++++
- dnf/plugins/repolist/dnf-command-repolist.c             | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- dnf/plugins/repolist/dnf-command-repolist.gresource.xml |   6 ++++++
- dnf/plugins/repolist/dnf-command-repolist.h             |  33 +++++++++++++++++++++++++++++++++
- dnf/plugins/repolist/repolist.plugin                    |   9 +++++++++
- 6 files changed, 230 insertions(+)
- create mode 100644 dnf/plugins/repolist/dnf-command-repolist.c
- create mode 100644 dnf/plugins/repolist/dnf-command-repolist.gresource.xml
- create mode 100644 dnf/plugins/repolist/dnf-command-repolist.h
- create mode 100644 dnf/plugins/repolist/repolist.plugin
-
-diff --git a/dnf/CMakeLists.txt b/dnf/CMakeLists.txt
-index 04d5b17..eb73c11 100644
---- a/dnf/CMakeLists.txt
-+++ b/dnf/CMakeLists.txt
-@@ -15,6 +15,11 @@ glib_compile_resources (DNF_COMMAND_UPDATE plugins/update/dnf-command-update.gre
-                         INTERNAL)
- list (APPEND DNF_COMMAND_UPDATE "plugins/update/dnf-command-update.c")
- 
-+glib_compile_resources (DNF_COMMAND_REPOLIST plugins/repolist/dnf-command-repolist.gresource.xml
-+                        C_PREFIX dnf_command_repolist
-+                        INTERNAL)
-+list (APPEND DNF_COMMAND_REPOLIST "plugins/repolist/dnf-command-repolist.c")
-+
- glib_compile_resources (DNF_COMMAND_CLEAN plugins/clean/dnf-command-clean.gresource.xml
-                         C_PREFIX dnf_command_clean
-                         INTERNAL)
-@@ -25,6 +30,7 @@ add_executable (microdnf dnf-main.c ${DNF_SRCS}
-                 ${DNF_COMMAND_INSTALL}
-                 ${DNF_COMMAND_REMOVE}
-                 ${DNF_COMMAND_UPDATE}
-+                ${DNF_COMMAND_REPOLIST}
-                 ${DNF_COMMAND_CLEAN})
- 
- target_link_libraries (microdnf
-diff --git a/dnf/meson.build b/dnf/meson.build
-index f8f1bf3..d368180 100644
---- a/dnf/meson.build
-+++ b/dnf/meson.build
-@@ -30,6 +30,15 @@ microdnf_srcs = [
-   ),
-   'plugins/update/dnf-command-update.c',
- 
-+  # repolist
-+  gnome.compile_resources(
-+    'dnf-repolist',
-+    'plugins/repolist/dnf-command-repolist.gresource.xml',
-+    c_name : 'dnf_command_repolist',
-+    source_dir : 'plugins/repolist',
-+  ),
-+  'plugins/repolist/dnf-command-repolist.c',
-+
-   # clean
-   gnome.compile_resources(
-     'dnf-clean',
-diff --git a/dnf/plugins/repolist/dnf-command-repolist.c b/dnf/plugins/repolist/dnf-command-repolist.c
-new file mode 100644
-index 0000000..f69917e
---- /dev/null
-+++ b/dnf/plugins/repolist/dnf-command-repolist.c
-@@ -0,0 +1,167 @@
-+/*
-+ * Copyright (C) 2019 Red Hat, Inc.
-+ *
-+ * Licensed under the GNU Lesser General Public License Version 2.1
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include "dnf-command-repolist.h"
-+
-+#include <libsmartcols.h>
-+#include <unistd.h>
-+
-+struct _DnfCommandRepolist
-+{
-+  PeasExtensionBase parent_instance;
-+};
-+
-+static void dnf_command_repolist_iface_init (DnfCommandInterface *iface);
-+
-+G_DEFINE_DYNAMIC_TYPE_EXTENDED (DnfCommandRepolist,
-+                                dnf_command_repolist,
-+                                PEAS_TYPE_EXTENSION_BASE,
-+                                0,
-+                                G_IMPLEMENT_INTERFACE (DNF_TYPE_COMMAND,
-+                                                       dnf_command_repolist_iface_init))
-+
-+static void
-+dnf_command_repolist_init (DnfCommandRepolist *self)
-+{
-+}
-+
-+// repository list table columns
-+enum { COL_REPO_ID, COL_REPO_NAME, COL_REPO_STATUS };
-+
-+static struct libscols_table *
-+create_repolist_table (gboolean with_status)
-+{
-+  struct libscols_table *table = scols_new_table ();
-+  if (isatty (1))
-+    scols_table_enable_colors (table, 1);
-+  scols_table_enable_maxout (table, 1);
-+  struct libscols_column *cl = scols_table_new_column (table, "repo id", 0.4, 0);
-+  scols_column_set_cmpfunc(cl, scols_cmpstr_cells, NULL);
-+  scols_table_new_column (table, "repo name", 0.5, SCOLS_FL_TRUNC);
-+  if (with_status)
-+    scols_table_new_column (table, "status", 0.1, SCOLS_FL_RIGHT);
-+  return table;
-+}
-+
-+static void
-+add_line_into_table (struct libscols_table *table,
-+                     gboolean               with_status,
-+                     const char            *id,
-+                     const char            *descr,
-+                     gboolean               enabled)
-+{
-+  struct libscols_line *ln = scols_table_new_line (table, NULL);
-+  scols_line_set_data (ln, COL_REPO_ID, id);
-+  scols_line_set_data (ln, COL_REPO_NAME, descr);
-+  if (with_status)
-+    {
-+      scols_line_set_data (ln, COL_REPO_STATUS, enabled ? "enabled" : "disabled");
-+      struct libscols_cell * cl = scols_line_get_cell (ln, COL_REPO_STATUS);
-+      scols_cell_set_color (cl, enabled ? "green" : "red");
-+    }
-+}
-+
-+static gboolean
-+dnf_command_repolist_run (DnfCommand      *cmd,
-+                          int              argc,
-+                          char            *argv[],
-+                          GOptionContext  *opt_ctx,
-+                          DnfContext      *ctx,
-+                          GError         **error)
-+{
-+  gboolean opt_all = FALSE;
-+  gboolean opt_enabled = FALSE;
-+  gboolean opt_disabled = FALSE;
-+  g_auto(GStrv) opt_repos = NULL;
-+  const GOptionEntry opts[] = {
-+    { "all", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_all, "show all repos", NULL },
-+    { "disabled", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_disabled, "show disabled repos", NULL },
-+    { "enabled", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_enabled, "show enabled repos (default)", NULL },
-+    { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_repos, NULL, NULL },
-+    { NULL }
-+  };
-+  g_option_context_add_main_entries (opt_ctx, opts, NULL);
-+
-+  if (!g_option_context_parse (opt_ctx, &argc, &argv, error))
-+    return FALSE;
-+
-+  if (opt_repos && opt_repos[0])
-+    {
-+      g_set_error (error,
-+                   G_OPTION_ERROR,
-+                   G_OPTION_ERROR_UNKNOWN_OPTION,
-+                   "Unknown argument %s", opt_repos[0]);
-+      return FALSE;
-+    }
-+
-+  if (!opt_disabled)
-+    opt_enabled = TRUE;
-+
-+  if (opt_enabled && opt_disabled)
-+    opt_all = TRUE;
-+
-+  struct libscols_table *table = create_repolist_table (opt_all);
-+
-+  GPtrArray *repos = dnf_context_get_repos (ctx);
-+  for (guint i = 0; i < repos->len; ++i)
-+    {
-+      DnfRepo * repo = g_ptr_array_index (repos, i);
-+      gboolean enabled = dnf_repo_get_enabled (repo) & DNF_REPO_ENABLED_PACKAGES;
-+      if (opt_all || (opt_enabled && enabled) || (opt_disabled && !enabled))
-+        {
-+          const gchar * id = dnf_repo_get_id (repo);
-+          g_autofree gchar * descr = dnf_repo_get_description (repo);
-+          add_line_into_table (table, opt_all, id, descr, enabled);
-+        }
-+    }
-+
-+  struct libscols_column *cl = scols_table_get_column (table, COL_REPO_ID);
-+  scols_sort_table (table, cl);
-+  scols_print_table (table);
-+  scols_unref_table (table);
-+
-+  return TRUE;
-+}
-+
-+static void
-+dnf_command_repolist_class_init (DnfCommandRepolistClass *klass)
-+{
-+}
-+
-+static void
-+dnf_command_repolist_iface_init (DnfCommandInterface *iface)
-+{
-+  iface->run = dnf_command_repolist_run;
-+}
-+
-+static void
-+dnf_command_repolist_class_finalize (DnfCommandRepolistClass *klass)
-+{
-+}
-+
-+G_MODULE_EXPORT void
-+dnf_command_repolist_register_types (PeasObjectModule *module)
-+{
-+  dnf_command_repolist_register_type (G_TYPE_MODULE (module));
-+
-+  peas_object_module_register_extension_type (module,
-+                                              DNF_TYPE_COMMAND,
-+                                              DNF_TYPE_COMMAND_REPOLIST);
-+}
-diff --git a/dnf/plugins/repolist/dnf-command-repolist.gresource.xml b/dnf/plugins/repolist/dnf-command-repolist.gresource.xml
-new file mode 100644
-index 0000000..0d12b8b
---- /dev/null
-+++ b/dnf/plugins/repolist/dnf-command-repolist.gresource.xml
-@@ -0,0 +1,6 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<gresources>
-+  <gresource prefix="/org/fedoraproject/dnf/plugins/repolist">
-+    <file>repolist.plugin</file>
-+  </gresource>
-+</gresources>
-diff --git a/dnf/plugins/repolist/dnf-command-repolist.h b/dnf/plugins/repolist/dnf-command-repolist.h
-new file mode 100644
-index 0000000..5edaf1c
---- /dev/null
-+++ b/dnf/plugins/repolist/dnf-command-repolist.h
-@@ -0,0 +1,33 @@
-+/*
-+ * Copyright (C) 2019 Red Hat, Inc.
-+ *
-+ * Licensed under the GNU Lesser General Public License Version 2.1
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#pragma once
-+
-+#include "dnf-command.h"
-+#include <libpeas/peas.h>
-+
-+G_BEGIN_DECLS
-+
-+#define DNF_TYPE_COMMAND_REPOLIST dnf_command_repolist_get_type ()
-+G_DECLARE_FINAL_TYPE (DnfCommandRepolist, dnf_command_repolist, DNF, COMMAND_REPOLIST, PeasExtensionBase)
-+
-+G_MODULE_EXPORT void dnf_command_repolist_register_types (PeasObjectModule *module);
-+
-+G_END_DECLS
-diff --git a/dnf/plugins/repolist/repolist.plugin b/dnf/plugins/repolist/repolist.plugin
-new file mode 100644
-index 0000000..c659a1e
---- /dev/null
-+++ b/dnf/plugins/repolist/repolist.plugin
-@@ -0,0 +1,9 @@
-+[Plugin]
-+Module = command_repolist
-+Embedded = dnf_command_repolist_register_types
-+Name = repolist
-+Description = List repositories
-+Authors = Jaroslav Rohel <jrohel@redhat.com>
-+License = GPL-3.0+
-+Copyright = Copyright (C) 2019 Red Hat, Inc.
-+X-Command-Syntax = repolist [--all] [--disabled] [--enabled]
---
-libgit2 0.28.2
-
diff --git a/SOURCES/0008-Add-repoquery-command.patch b/SOURCES/0008-Add-repoquery-command.patch
deleted file mode 100644
index 1e71e10..0000000
--- a/SOURCES/0008-Add-repoquery-command.patch
+++ /dev/null
@@ -1,431 +0,0 @@
-From 1ded5d5babfe620488aa8965c7fb922361fa6eaa Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Fri, 8 Nov 2019 13:27:17 +0100
-Subject: [PATCH 1/2] Add repoquery command (RhBug:1769245)
-
-Searches for selected packages and displays the requested information
-about them.
-
-Command options:
-  --available   display available packages (default)
-  --installed   display installed packages
-
-Signed-off-by: Jaroslav Rohel <jrohel@redhat.com>
----
- dnf/CMakeLists.txt                            |   6 +
- dnf/meson.build                               |   9 +
- dnf/plugins/repoquery/dnf-command-repoquery.c | 158 ++++++++++++++++++
- .../dnf-command-repoquery.gresource.xml       |   6 +
- dnf/plugins/repoquery/dnf-command-repoquery.h |  33 ++++
- dnf/plugins/repoquery/repoquery.plugin        |   9 +
- 6 files changed, 221 insertions(+)
- create mode 100644 dnf/plugins/repoquery/dnf-command-repoquery.c
- create mode 100644 dnf/plugins/repoquery/dnf-command-repoquery.gresource.xml
- create mode 100644 dnf/plugins/repoquery/dnf-command-repoquery.h
- create mode 100644 dnf/plugins/repoquery/repoquery.plugin
-
-diff --git a/dnf/CMakeLists.txt b/dnf/CMakeLists.txt
-index eb73c11..2585c06 100644
---- a/dnf/CMakeLists.txt
-+++ b/dnf/CMakeLists.txt
-@@ -20,6 +20,11 @@ glib_compile_resources (DNF_COMMAND_REPOLIST plugins/repolist/dnf-command-repoli
-                         INTERNAL)
- list (APPEND DNF_COMMAND_REPOLIST "plugins/repolist/dnf-command-repolist.c")
- 
-+glib_compile_resources (DNF_COMMAND_REPOQUERY plugins/repoquery/dnf-command-repoquery.gresource.xml
-+                        C_PREFIX dnf_command_repoquery
-+                        INTERNAL)
-+list (APPEND DNF_COMMAND_REPOQUERY "plugins/repoquery/dnf-command-repoquery.c")
-+
- glib_compile_resources (DNF_COMMAND_CLEAN plugins/clean/dnf-command-clean.gresource.xml
-                         C_PREFIX dnf_command_clean
-                         INTERNAL)
-@@ -31,6 +36,7 @@ add_executable (microdnf dnf-main.c ${DNF_SRCS}
-                 ${DNF_COMMAND_REMOVE}
-                 ${DNF_COMMAND_UPDATE}
-                 ${DNF_COMMAND_REPOLIST}
-+                ${DNF_COMMAND_REPOQUERY}
-                 ${DNF_COMMAND_CLEAN})
- 
- target_link_libraries (microdnf
-diff --git a/dnf/meson.build b/dnf/meson.build
-index d368180..d71a533 100644
---- a/dnf/meson.build
-+++ b/dnf/meson.build
-@@ -39,6 +39,15 @@ microdnf_srcs = [
-   ),
-   'plugins/repolist/dnf-command-repolist.c',
- 
-+  # repoquery
-+  gnome.compile_resources(
-+    'dnf-repoquery',
-+    'plugins/repoquery/dnf-command-repoquery.gresource.xml',
-+    c_name : 'dnf_command_repoquery',
-+    source_dir : 'plugins/repoquery',
-+  ),
-+  'plugins/repoquery/dnf-command-repoquery.c',
-+
-   # clean
-   gnome.compile_resources(
-     'dnf-clean',
-diff --git a/dnf/plugins/repoquery/dnf-command-repoquery.c b/dnf/plugins/repoquery/dnf-command-repoquery.c
-new file mode 100644
-index 0000000..7db1a8f
---- /dev/null
-+++ b/dnf/plugins/repoquery/dnf-command-repoquery.c
-@@ -0,0 +1,158 @@
-+/*
-+ * Copyright (C) 2019 Red Hat, Inc.
-+ *
-+ * Licensed under the GNU Lesser General Public License Version 2.1
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include "dnf-command-repoquery.h"
-+
-+struct _DnfCommandRepoquery
-+{
-+  PeasExtensionBase parent_instance;
-+};
-+
-+static void dnf_command_repoquery_iface_init (DnfCommandInterface *iface);
-+
-+G_DEFINE_DYNAMIC_TYPE_EXTENDED (DnfCommandRepoquery,
-+                                dnf_command_repoquery,
-+                                PEAS_TYPE_EXTENSION_BASE,
-+                                0,
-+                                G_IMPLEMENT_INTERFACE (DNF_TYPE_COMMAND,
-+                                                       dnf_command_repoquery_iface_init))
-+
-+static void
-+dnf_command_repoquery_init (DnfCommandRepoquery *self)
-+{
-+}
-+
-+static void
-+disable_available_repos (DnfContext *ctx)
-+{
-+  GPtrArray *repos = dnf_context_get_repos (ctx);
-+  for (guint i = 0; i < repos->len; ++i)
-+    {
-+      DnfRepo * repo = g_ptr_array_index (repos, i);
-+      dnf_repo_set_enabled (repo, DNF_REPO_ENABLED_NONE);
-+    }
-+}
-+
-+static gint
-+gptrarr_dnf_package_cmp (gconstpointer a, gconstpointer b)
-+{
-+  return dnf_package_cmp(*(DnfPackage**)a, *(DnfPackage**)b);
-+}
-+
-+static gboolean
-+dnf_command_repoquery_run (DnfCommand     *cmd,
-+                          int              argc,
-+                          char            *argv[],
-+                          GOptionContext  *opt_ctx,
-+                          DnfContext      *ctx,
-+                          GError         **error)
-+{
-+  gboolean opt_available = FALSE;
-+  gboolean opt_installed = FALSE;
-+  g_auto(GStrv) opt_key = NULL;
-+  const GOptionEntry opts[] = {
-+    { "available", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_available, "display available packages (default)", NULL },
-+    { "installed", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_installed, "display installed packages", NULL },
-+    { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_key, NULL, NULL },
-+    { NULL }
-+  };
-+  g_option_context_add_main_entries (opt_ctx, opts, NULL);
-+
-+  if (!g_option_context_parse (opt_ctx, &argc, &argv, error))
-+    return FALSE;
-+
-+  // --available is default (compatibility with YUM/DNF)
-+  if (!opt_available && !opt_installed)
-+    opt_available = TRUE;
-+
-+  if (opt_available && opt_installed)
-+    opt_available = opt_installed = FALSE;
-+
-+  if (opt_installed)
-+    disable_available_repos (ctx);
-+
-+  DnfState * state = dnf_context_get_state (ctx);
-+  DnfContextSetupSackFlags sack_flags = opt_available ? DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_RPMDB
-+                                                      : DNF_CONTEXT_SETUP_SACK_FLAG_NONE;
-+  dnf_context_setup_sack_with_flags (ctx, state, sack_flags, error);
-+  DnfSack *sack = dnf_context_get_sack (ctx);
-+
-+  hy_autoquery HyQuery query = hy_query_create (sack);
-+
-+  if (opt_key)
-+    {
-+      hy_query_filter_empty (query);
-+      for (char **pkey = opt_key; *pkey; ++pkey)
-+        {
-+          g_auto(HySubject) subject = hy_subject_create (*pkey);
-+          HyNevra out_nevra;
-+          hy_autoquery HyQuery key_query = hy_subject_get_best_solution (subject, sack, NULL,
-+            &out_nevra, TRUE, TRUE, FALSE, TRUE, TRUE);
-+          if (out_nevra)
-+            hy_nevra_free(out_nevra);
-+          hy_query_union (query, key_query);
-+        }
-+    }
-+
-+  g_autoptr(GPtrArray) pkgs = hy_query_run (query);
-+
-+  g_ptr_array_sort (pkgs, gptrarr_dnf_package_cmp);
-+
-+  // print packages without duplicated lines
-+  const char *prev_line = "";
-+  for (guint i = 0; i < pkgs->len; ++i)
-+    {
-+      DnfPackage *package = g_ptr_array_index (pkgs, i);
-+      const char * line = dnf_package_get_nevra (package);
-+      if (strcmp (line, prev_line) != 0)
-+        {
-+          g_print ("%s\n", line);
-+          prev_line = line;
-+        }
-+    }
-+
-+  return TRUE;
-+}
-+
-+static void
-+dnf_command_repoquery_class_init (DnfCommandRepoqueryClass *klass)
-+{
-+}
-+
-+static void
-+dnf_command_repoquery_iface_init (DnfCommandInterface *iface)
-+{
-+  iface->run = dnf_command_repoquery_run;
-+}
-+
-+static void
-+dnf_command_repoquery_class_finalize (DnfCommandRepoqueryClass *klass)
-+{
-+}
-+
-+G_MODULE_EXPORT void
-+dnf_command_repoquery_register_types (PeasObjectModule *module)
-+{
-+  dnf_command_repoquery_register_type (G_TYPE_MODULE (module));
-+
-+  peas_object_module_register_extension_type (module,
-+                                              DNF_TYPE_COMMAND,
-+                                              DNF_TYPE_COMMAND_REPOQUERY);
-+}
-diff --git a/dnf/plugins/repoquery/dnf-command-repoquery.gresource.xml b/dnf/plugins/repoquery/dnf-command-repoquery.gresource.xml
-new file mode 100644
-index 0000000..6765af2
---- /dev/null
-+++ b/dnf/plugins/repoquery/dnf-command-repoquery.gresource.xml
-@@ -0,0 +1,6 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<gresources>
-+  <gresource prefix="/org/fedoraproject/dnf/plugins/repoquery">
-+    <file>repoquery.plugin</file>
-+  </gresource>
-+</gresources>
-diff --git a/dnf/plugins/repoquery/dnf-command-repoquery.h b/dnf/plugins/repoquery/dnf-command-repoquery.h
-new file mode 100644
-index 0000000..80fae53
---- /dev/null
-+++ b/dnf/plugins/repoquery/dnf-command-repoquery.h
-@@ -0,0 +1,33 @@
-+/*
-+ * Copyright (C) 2019 Red Hat, Inc.
-+ *
-+ * Licensed under the GNU Lesser General Public License Version 2.1
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#pragma once
-+
-+#include "dnf-command.h"
-+#include <libpeas/peas.h>
-+
-+G_BEGIN_DECLS
-+
-+#define DNF_TYPE_COMMAND_REPOQUERY dnf_command_repoquery_get_type ()
-+G_DECLARE_FINAL_TYPE (DnfCommandRepoquery, dnf_command_repoquery, DNF, COMMAND_REPOQUERY, PeasExtensionBase)
-+
-+G_MODULE_EXPORT void dnf_command_repoquery_register_types (PeasObjectModule *module);
-+
-+G_END_DECLS
-diff --git a/dnf/plugins/repoquery/repoquery.plugin b/dnf/plugins/repoquery/repoquery.plugin
-new file mode 100644
-index 0000000..a107720
---- /dev/null
-+++ b/dnf/plugins/repoquery/repoquery.plugin
-@@ -0,0 +1,9 @@
-+[Plugin]
-+Module = command_repoquery
-+Embedded = dnf_command_repoquery_register_types
-+Name = repoquery
-+Description = Search for packages matching keyword
-+Authors = Jaroslav Rohel <jrohel@redhat.com>
-+License = GPL-3.0+
-+Copyright = Copyright (C) 2019 Red Hat, Inc.
-+X-Command-Syntax = repoquery [OPTION…] [KEY…]
--- 
-2.21.0
-
-
-From 99831d883f2a95f3540a844fe8455f896b9b097d Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Sun, 10 Nov 2019 15:32:31 +0100
-Subject: [PATCH 2/2] [repoquery] add "--info" and "--nevra" options
-
---info   show detailed information about the packages
---nevra  use name-epoch:version-release.architecture format
-         for displaying packages (default)
-
-Signed-off-by: Jaroslav Rohel <jrohel@redhat.com>
----
- dnf/plugins/repoquery/dnf-command-repoquery.c | 68 +++++++++++++++++--
- 1 file changed, 63 insertions(+), 5 deletions(-)
-
-diff --git a/dnf/plugins/repoquery/dnf-command-repoquery.c b/dnf/plugins/repoquery/dnf-command-repoquery.c
-index 7db1a8f..721c990 100644
---- a/dnf/plugins/repoquery/dnf-command-repoquery.c
-+++ b/dnf/plugins/repoquery/dnf-command-repoquery.c
-@@ -20,6 +20,8 @@
- 
- #include "dnf-command-repoquery.h"
- 
-+#include <libsmartcols.h>
-+
- struct _DnfCommandRepoquery
- {
-   PeasExtensionBase parent_instance;
-@@ -56,6 +58,49 @@ gptrarr_dnf_package_cmp (gconstpointer a, gconstpointer b)
-   return dnf_package_cmp(*(DnfPackage**)a, *(DnfPackage**)b);
- }
- 
-+static void
-+package_info_add_line (struct libscols_table *table, const char *key, const char *value)
-+{
-+  struct libscols_line *ln = scols_table_new_line (table, NULL);
-+  scols_line_set_data (ln, 0, key);
-+  scols_line_set_data (ln, 1, value);
-+}
-+
-+static void
-+print_package_info (DnfPackage *package)
-+{
-+  struct libscols_table *table = scols_new_table ();
-+  scols_table_enable_noheadings (table, 1);
-+  scols_table_set_column_separator (table, " : ");
-+  scols_table_new_column (table, "key", 5, 0);
-+  struct libscols_column *cl = scols_table_new_column (table, "value", 10, SCOLS_FL_WRAP);
-+  scols_column_set_safechars (cl, "\n");
-+  scols_column_set_wrapfunc (cl, scols_wrapnl_chunksize, scols_wrapnl_nextchunk, NULL);
-+
-+  package_info_add_line (table, "Name", dnf_package_get_name (package));
-+  guint64 epoch = dnf_package_get_epoch (package);
-+  if (epoch != 0)
-+    {
-+      g_autofree gchar *str_epoch = g_strdup_printf ("%ld", epoch);
-+      package_info_add_line (table, "Epoch", str_epoch);
-+    }
-+  package_info_add_line (table, "Version", dnf_package_get_version (package));
-+  package_info_add_line (table, "Release", dnf_package_get_release (package));
-+  package_info_add_line (table, "Architecture", dnf_package_get_arch (package));
-+  g_autofree gchar *size = g_format_size_full (dnf_package_get_size (package),
-+                                               G_FORMAT_SIZE_LONG_FORMAT | G_FORMAT_SIZE_IEC_UNITS);
-+  package_info_add_line (table, "Size", size);
-+  package_info_add_line (table, "Source", dnf_package_get_sourcerpm (package));
-+  package_info_add_line (table, "Repository", dnf_package_get_reponame (package));
-+  package_info_add_line (table, "Summanry", dnf_package_get_summary (package));
-+  package_info_add_line (table, "URL", dnf_package_get_url (package));
-+  package_info_add_line (table, "License", dnf_package_get_license (package));
-+  package_info_add_line (table, "Description", dnf_package_get_description (package));
-+
-+  scols_print_table (table);
-+  scols_unref_table (table);
-+}
-+
- static gboolean
- dnf_command_repoquery_run (DnfCommand     *cmd,
-                           int              argc,
-@@ -65,11 +110,16 @@ dnf_command_repoquery_run (DnfCommand     *cmd,
-                           GError         **error)
- {
-   gboolean opt_available = FALSE;
-+  gboolean opt_info = FALSE;
-   gboolean opt_installed = FALSE;
-+  gboolean opt_nevra = FALSE;
-   g_auto(GStrv) opt_key = NULL;
-   const GOptionEntry opts[] = {
-     { "available", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_available, "display available packages (default)", NULL },
-+    { "info", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_info, "show detailed information about the packages", NULL },
-     { "installed", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_installed, "display installed packages", NULL },
-+    { "nevra", '\0', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &opt_nevra,
-+      "use name-epoch:version-release.architecture format for displaying packages (default)", NULL },
-     { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_key, NULL, NULL },
-     { NULL }
-   };
-@@ -115,16 +165,24 @@ dnf_command_repoquery_run (DnfCommand     *cmd,
- 
-   g_ptr_array_sort (pkgs, gptrarr_dnf_package_cmp);
- 
--  // print packages without duplicated lines
-   const char *prev_line = "";
-   for (guint i = 0; i < pkgs->len; ++i)
-     {
-       DnfPackage *package = g_ptr_array_index (pkgs, i);
--      const char * line = dnf_package_get_nevra (package);
--      if (strcmp (line, prev_line) != 0)
-+      if (opt_nevra || !opt_info)
-+        {
-+          const char * line = dnf_package_get_nevra (package);
-+          // print nevras without duplicated lines
-+          if (opt_info || strcmp (line, prev_line) != 0)
-+            {
-+              g_print ("%s\n", line);
-+              prev_line = line;
-+            }
-+        }
-+      if (opt_info)
-         {
--          g_print ("%s\n", line);
--          prev_line = line;
-+          print_package_info (package);
-+          g_print ("\n");
-         }
-     }
- 
--- 
-2.21.0
-
diff --git a/SOURCES/0009-Fix-Dont-print-lines-with-null-in-transaction-report-RhBug-1691353.patch b/SOURCES/0009-Fix-Dont-print-lines-with-null-in-transaction-report-RhBug-1691353.patch
deleted file mode 100644
index 09debba..0000000
--- a/SOURCES/0009-Fix-Dont-print-lines-with-null-in-transaction-report-RhBug-1691353.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 1642cf9d6a59b0784daba701a5a66a8fbe8a5125 Mon Sep 17 00:00:00 2001
-From: Jaroslav Rohel <jrohel@redhat.com>
-Date: Mon, 2 Dec 2019 08:16:47 +0100
-Subject: [PATCH] Fix: Don't print lines with (null) in transaction report
- (RhBug:1691353)
-
-Example:
-Installing: binutils;2.30-49.el8;x86_64;beaker-BaseOS
-Installing: (null)
-Installing: isl;0.16.1-6.el8;x86_64;beaker-AppStream
-Installing: (null)
-
-The lines with (null) will not be printed with this patch.
----
- dnf/dnf-main.c | 27 +++++++++++++++++----------
- 1 file changed, 17 insertions(+), 10 deletions(-)
-
-diff --git a/dnf/dnf-main.c b/dnf/dnf-main.c
-index 4f19489..542ef61 100644
---- a/dnf/dnf-main.c
-+++ b/dnf/dnf-main.c
-@@ -121,38 +121,45 @@ state_action_changed_cb (DnfState       *state,
-   switch (action)
-     {
-       case DNF_STATE_ACTION_DOWNLOAD_METADATA:
--        g_print("Downloading metadata...\n");
-+        g_print ("Downloading metadata...\n");
-         break;
-       case DNF_STATE_ACTION_DOWNLOAD_PACKAGES:
-         if (!dl_pkgs_printed)
-           {
--            g_print("Downloading packages...\n");
-+            g_print ("Downloading packages...\n");
-             dl_pkgs_printed = TRUE;
-           }
-         break;
-       case DNF_STATE_ACTION_TEST_COMMIT:
--        g_print("Running transaction test...\n");
-+        g_print ("Running transaction test...\n");
-         break;
-       case DNF_STATE_ACTION_INSTALL:
--        g_print("Installing: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Installing: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_REMOVE:
--        g_print("Removing: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Removing: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_UPDATE:
--        g_print("Updating: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Updating: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_OBSOLETE:
--        g_print("Obsoleting: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Obsoleting: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_REINSTALL:
--        g_print("Reinstalling: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Reinstalling: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_DOWNGRADE:
--        g_print("Downgrading: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Downgrading: %s\n", action_hint);
-         break;
-       case DNF_STATE_ACTION_CLEANUP:
--        g_print("Cleanup: %s\n", action_hint);
-+        if (action_hint)
-+          g_print ("Cleanup: %s\n", action_hint);
-         break;
-       default:
-         break;
diff --git a/SPECS/microdnf.spec b/SPECS/microdnf.spec
index 26c2e18..fde7f12 100644
--- a/SPECS/microdnf.spec
+++ b/SPECS/microdnf.spec
@@ -1,22 +1,13 @@
-%global libdnf_version 0.38.0
+%global libdnf_version 0.43.1
 
 Name:           microdnf
-Version:        3.0.1
-Release:        8%{?dist}
-Summary:        Micro DNF
+Version:        3.4.0
+Release:        1%{?dist}
+Summary:        Minimal C implementation of DNF
 
 License:        GPLv3+
 URL:            https://github.com/rpm-software-management/microdnf
 Source0:        %{url}/archive/v%{version}/%{name}-%{version}.tar.gz
-Patch1:         0001-Add-support-for-releasever.patch
-Patch2:         0002-Fix-minor-memory-leaks-RhBug1702283.patch
-Patch3:         0003-use-help2man-to-generate-a-man-page.patch
-Patch4:         0004-Fix-microdnf---help-coredump.patch
-Patch5:         0005-Allow-downgrade-for-all-transactions-microdnf-does-RhBug1725863.patch
-Patch6:         0006-Add-support-of-best-behavior.patch
-Patch7:         0007-Add-repolist-command-RhBug1584952.patch
-Patch8:         0008-Add-repoquery-command.patch
-Patch9:         0009-Fix-Dont-print-lines-with-null-in-transaction-report-RhBug-1691353.patch
 
 BuildRequires:  gcc
 BuildRequires:  meson >= 0.36.0
@@ -30,7 +21,17 @@ BuildRequires:  help2man
 Requires:       libdnf%{?_isa} >= %{libdnf_version}
 
 %description
-%{summary}.
+Micro DNF is a very minimal C implementation of DNF's install, upgrade,
+remove, repolist, and clean commands, designed to be used for doing simple
+packaging actions in containers when you don't need full-blown DNF and
+you want the tiniest useful containers possible.
+
+That is, you don't want any interpreter stack and you want the most
+minimal environment possible so you can build up to exactly what you need.
+
+This is not a substitute for DNF for real systems, and many of DNF's
+capabilities are intentionally not implemented in Micro DNF.
+
 
 %prep
 %autosetup -p1
@@ -48,10 +49,27 @@ Requires:       libdnf%{?_isa} >= %{libdnf_version}
 %files
 %license COPYING
 %doc README.md
+%{_mandir}/man8/microdnf.8*
 %{_bindir}/%{name}
-%{_mandir}/man8/%{name}.8*
 
 %changelog
+* Mon Apr 06 2020 Ales Matej <amatej@redhat.com> - 3.4.0-1
+- Update to 3.4.0
+- Fix: do not download metadata in remove command
+- Add reinstall command
+- Add "--setopt=tsflags=test" support
+- Add "--setopt=reposdir=<path>" and "--setopt=varsdir=<path1>,<path2>,..." support
+- Add "--config=<path_to_config_file>" support
+- Add "--disableplugin", "--enableplugin" support (RhBug:1781126)
+- Add "--noplugins" support
+- Add "--setopt=cachedir=<path_to_cache_directory>" support
+- Add "--installroot=<path_to_installroot_directory>" support
+- Add "--refresh" support
+- Support "install_weak_deps" conf option and "--setopt=install_weak_deps=0/1"
+- Respect reposdir from conf file
+- Respect "metadata_expire" conf file opton (RhBug:1771147)
+- [repolist] Print padding spaces only if output is terminal
+
 * Mon Jan 13 2020 Ales Matej <amatej@redhat.com> - 3.0.1-8
 - Fix: Don't print lines with (null) in transaction report (RhBug:1691353)