diff --git a/SOURCES/0001-queue_init_clone-const_cast.patch b/SOURCES/0001-queue_init_clone-const_cast.patch
new file mode 100644
index 0000000..92de8ec
--- /dev/null
+++ b/SOURCES/0001-queue_init_clone-const_cast.patch
@@ -0,0 +1,49 @@
+diff -Naur a/libdnf/goal/IdQueue.hpp b/libdnf/goal/IdQueue.hpp
+--- a/libdnf/goal/IdQueue.hpp	2019-01-04 14:12:04.000000000 +0100
++++ b/libdnf/goal/IdQueue.hpp	2019-01-08 09:54:45.858216988 +0100
+@@ -51,13 +51,13 @@
+ };
+ 
+ inline IdQueue::IdQueue() { queue_init(&queue); }
+-inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, &src.queue); }
++inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, const_cast<Queue *>(&src.queue)); }
+ inline IdQueue::IdQueue(IdQueue && src)
+ {
+     queue_init(&queue);
+     std::swap(queue, src.queue);
+ }
+-inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, &src); }
++inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, const_cast<Queue *>(&src)); }
+ 
+ inline IdQueue::~IdQueue() { queue_free(&queue); }
+ 
+diff -Naur a/libdnf/repo/solvable/DependencyContainer.cpp b/libdnf/repo/solvable/DependencyContainer.cpp
+--- a/libdnf/repo/solvable/DependencyContainer.cpp	2019-01-04 14:12:04.000000000 +0100
++++ b/libdnf/repo/solvable/DependencyContainer.cpp	2019-01-08 09:54:19.623031878 +0100
+@@ -32,7 +32,7 @@
+ DependencyContainer::DependencyContainer(const DependencyContainer &src)
+         : sack(src.sack)
+ {
+-    queue_init_clone(&this->queue, &queue);
++    queue_init_clone(&this->queue, const_cast<Queue *>(&queue));
+ }
+ 
+ 
+@@ -45,7 +45,7 @@
+ DependencyContainer::DependencyContainer(DnfSack *sack, Queue queue)
+         : sack(sack)
+ {
+-    queue_init_clone(&this->queue, &queue);
++    queue_init_clone(&this->queue, const_cast<Queue *>(&queue));
+ }
+ 
+ DependencyContainer::~DependencyContainer()
+@@ -56,7 +56,7 @@
+ DependencyContainer &DependencyContainer::operator=(DependencyContainer &&src) noexcept
+ {
+     sack = src.sack;
+-    queue_init_clone(&queue, &src.queue);
++    queue_init_clone(&queue, const_cast<Queue *>(&src.queue));
+     return *this;
+ }
+ 
diff --git a/SOURCES/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch b/SOURCES/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch
new file mode 100644
index 0000000..6449819
--- /dev/null
+++ b/SOURCES/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch
@@ -0,0 +1,115 @@
+From 0c39ba49a21b8861d9ffb4bee546bd9927cf0b3c 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, 7 Oct 2019 16:33:48 +0200
+Subject: [PATCH] Fix leaking log handlers in Sack (RhBug:1758737)
+
+Stores the log handler ids in the sack and uses g_log_remove_handler()
+in the sack destructor to remove the handlers.
+
+The mechanism is a bit complex and is explained in a code comment.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1758737
+---
+ python/hawkey/sack-py.cpp | 47 +++++++++++++++++++++++++++++++++------
+ python/hawkey/sack-py.hpp |  1 -
+ 2 files changed, 40 insertions(+), 8 deletions(-)
+
+diff --git a/python/hawkey/sack-py.cpp b/python/hawkey/sack-py.cpp
+index e9253463..66479309 100644
+--- a/python/hawkey/sack-py.cpp
++++ b/python/hawkey/sack-py.cpp
+@@ -47,6 +47,22 @@ typedef struct {
+     DnfSack *sack;
+     PyObject *custom_package_class;
+     PyObject *custom_package_val;
++
++    // g_log handler IDs
++    // Multiple sacks can be created during a run of an application and each
++    // sack opens a log file and registers two g_log handlers. To avoid dangling
++    // handlers with invalid FILE pointers (we close them when destroying the
++    // sack), we need to keep track of the handlers so that we can also remove
++    // them.
++    //
++    // g_log is clever about adding log handlers. It does store all handlers
++    // registered for a given domain, but only the one that was registered last
++    // is used. If you remove the last registered one, the next in line will be
++    // used. That means stacking sacks is ok, the handler from the last
++    // undeleted sack will be the one that is used.
++    guint default_log_handler_id;
++    guint libdnf_log_handler_id;
++
+     FILE *log_out;
+ } _SackObject;
+ 
+@@ -121,8 +137,13 @@ sack_dealloc(_SackObject *o)
+     Py_XDECREF(o->custom_package_val);
+     if (o->sack)
+         g_object_unref(o->sack);
+-    if (o->log_out)
++
++    if (o->log_out) {
++        g_log_remove_handler(nullptr, o->default_log_handler_id);
++        g_log_remove_handler("libdnf", o->libdnf_log_handler_id);
+         fclose(o->log_out);
++    }
++
+     Py_TYPE(o)->tp_free(o);
+ }
+ 
+@@ -177,15 +198,27 @@ log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *mess
+     g_free(msg);
+ }
+ 
+-gboolean
+-set_logfile(const gchar *path, FILE *log_out)
++static void
++log_handler_noop(const gchar *, GLogLevelFlags, const gchar *, gpointer)
+ {
+-    log_out = fopen(path, "a");
++}
++
++static gboolean
++sack_set_logfile(_SackObject *self, const gchar *path)
++{
++    self->log_out = fopen(path, "a");
+ 
+-    if (!log_out)
++    if (!self->log_out)
+         return FALSE;
+ 
+-    g_log_set_default_handler(log_handler, log_out);
++    // The default log handler prints messages that weren't handled by any
++    // other logger to stderr/stdout, we do not want that
++    g_log_set_default_handler(log_handler_noop, nullptr);
++
++    // set the handler for the default domain as well as "libdnf"
++    self->default_log_handler_id = g_log_set_handler(nullptr, G_LOG_LEVEL_MASK, log_handler, self->log_out);
++    self->libdnf_log_handler_id = g_log_set_handler("libdnf", G_LOG_LEVEL_MASK, log_handler, self->log_out);
++
+     g_info("=== Started libdnf-%d.%d.%d ===", LIBDNF_MAJOR_VERSION,
+             LIBDNF_MINOR_VERSION, LIBDNF_MICRO_VERSION);
+     return TRUE;
+@@ -237,7 +270,7 @@ sack_init(_SackObject *self, PyObject *args, PyObject *kwds)
+         PycompString logfile(logfile_py);
+         if (!logfile.getCString())
+             return -1;
+-        if (!set_logfile(logfile.getCString(), self->log_out)) {
++        if (!sack_set_logfile(self, logfile.getCString())) {
+             PyErr_Format(PyExc_IOError, "Failed to open log file: %s", logfile.getCString());
+             return -1;
+         }
+diff --git a/python/hawkey/sack-py.hpp b/python/hawkey/sack-py.hpp
+index cba8accb..4ae77380 100644
+--- a/python/hawkey/sack-py.hpp
++++ b/python/hawkey/sack-py.hpp
+@@ -35,7 +35,6 @@ DnfSack *sackFromPyObject(PyObject *o);
+ int sack_converter(PyObject *o, DnfSack **sack_ptr);
+ 
+ PyObject *new_package(PyObject *sack, Id id);
+-gboolean set_logfile(const gchar *path, FILE *log_out);
+ const char *log_level_name(int level);
+ 
+ #endif // SACK_PY_H
+-- 
+2.25.2
+
diff --git a/SOURCES/queue_init_clone-const_cast.patch b/SOURCES/queue_init_clone-const_cast.patch
deleted file mode 100644
index 92de8ec..0000000
--- a/SOURCES/queue_init_clone-const_cast.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-diff -Naur a/libdnf/goal/IdQueue.hpp b/libdnf/goal/IdQueue.hpp
---- a/libdnf/goal/IdQueue.hpp	2019-01-04 14:12:04.000000000 +0100
-+++ b/libdnf/goal/IdQueue.hpp	2019-01-08 09:54:45.858216988 +0100
-@@ -51,13 +51,13 @@
- };
- 
- inline IdQueue::IdQueue() { queue_init(&queue); }
--inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, &src.queue); }
-+inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, const_cast<Queue *>(&src.queue)); }
- inline IdQueue::IdQueue(IdQueue && src)
- {
-     queue_init(&queue);
-     std::swap(queue, src.queue);
- }
--inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, &src); }
-+inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, const_cast<Queue *>(&src)); }
- 
- inline IdQueue::~IdQueue() { queue_free(&queue); }
- 
-diff -Naur a/libdnf/repo/solvable/DependencyContainer.cpp b/libdnf/repo/solvable/DependencyContainer.cpp
---- a/libdnf/repo/solvable/DependencyContainer.cpp	2019-01-04 14:12:04.000000000 +0100
-+++ b/libdnf/repo/solvable/DependencyContainer.cpp	2019-01-08 09:54:19.623031878 +0100
-@@ -32,7 +32,7 @@
- DependencyContainer::DependencyContainer(const DependencyContainer &src)
-         : sack(src.sack)
- {
--    queue_init_clone(&this->queue, &queue);
-+    queue_init_clone(&this->queue, const_cast<Queue *>(&queue));
- }
- 
- 
-@@ -45,7 +45,7 @@
- DependencyContainer::DependencyContainer(DnfSack *sack, Queue queue)
-         : sack(sack)
- {
--    queue_init_clone(&this->queue, &queue);
-+    queue_init_clone(&this->queue, const_cast<Queue *>(&queue));
- }
- 
- DependencyContainer::~DependencyContainer()
-@@ -56,7 +56,7 @@
- DependencyContainer &DependencyContainer::operator=(DependencyContainer &&src) noexcept
- {
-     sack = src.sack;
--    queue_init_clone(&queue, &src.queue);
-+    queue_init_clone(&queue, const_cast<Queue *>(&src.queue));
-     return *this;
- }
- 
diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec
index 497d542..902f5c0 100644
--- a/SPECS/libdnf.spec
+++ b/SPECS/libdnf.spec
@@ -31,12 +31,13 @@
 
 Name:           libdnf
 Version:        0.22.5
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        Library providing simplified C and Python API to libsolv
 License:        LGPLv2+
 URL:            https://github.com/rpm-software-management/libdnf
 Source0:        %{url}/archive/%{version}/%{name}-%{version}.tar.gz
-Patch0:         queue_init_clone-const_cast.patch
+Patch0:         0001-queue_init_clone-const_cast.patch
+Patch1:         0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch
 
 BuildRequires:  cmake
 BuildRequires:  gcc
@@ -246,21 +247,95 @@ popd
 %endif
 
 %changelog
+* Mon Apr 06 2020 Marek Blaha <mblaha@redhat.com> - 0.22.5-2
+- Backport patch for BZ#1781364
+
 * Tue Jan 08 2019 Daniel Mach <dmach@redhat.com> - 0.22.5-1
 - Update to 0.22.5
 - queue_init_clone src argument const_cast for libsolv 0.6.34 compatibility
 
-* Wed Jun 13 2018 Marek Blaha <mblaha@redhat.com> - 0.11.1-1
-- Update to 0.11.1
+* Thu Nov 08 2018 Jaroslav Mracek <jmracek@redhat.com> - 0.11.1-4
+- Backport patch for RHBZ#1542307 from upstream libdnf-0.11.1
+
+* Tue Nov 07 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 0.11.1-3
+- Use better Obsoletes for platform-python
+
+* Fri Nov 03 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.11.1-2
+- Remove platform-python subpackage
+
+* Mon Oct 16 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.11.1-1
+- Rerelease of 0.11.1-1
+- Improvement query performance
+- Run file query in hy_subject_get_best_solution only for files (arguments that start with ``/`` or
+  ``*/``)
+- Resolves: rhbz#1498207 - DNF crash during upgrade installation F26 -> F27
+
+* Tue Oct 10 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.11.0-1
+- Update to 0.11.0
+
+* Mon Oct 02 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.10.1-2
+- Rerelease of 0.10.1-1
+
+* Wed Sep 27 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.10.1-1
+- Update to 0.10.1
+- It improves query performance with name and arch filters. Also nevra filter will now
+  handle string with or without epoch.
+- Additionally for python bindings it renames NEVRA._has_just_name() to NEVRA.has_just_name() due
+  to movement of code into c part of library.
+- Resolves: rhbz#1260242 - --exclude does not affect dnf remove's removal of requirements
+- Resolves: rhbz#1485881 - DNF claims it cannot install package, which have been already installed
+- Resolves: rhbz#1361187 - [abrt] python-ipython-console: filter_updown(): python3.5 killed by SIGABRT
+
+* Fri Sep 15 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.9.3-8
+- Disable platform python on old releases
+
+* Tue Aug 15 2017 Lumír Balhar <lbalhar@redhat.com> - 0.9.3-7
+- Add platform-python subpackage
+
+* Fri Aug 11 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.9.3-6
+- Rebuilt after RPM update (№ 3)
+
+* Thu Aug 10 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.9.3-5
+- Rebuilt for RPM soname bump
+
+* Thu Aug 10 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.9.3-4
+- Rebuilt for RPM soname bump
+
+* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.9.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.9.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Mon Jul 24 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.9.3-1
+- Update to 0.9.3
+
+* Sat Jul 01 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.9.2-1
+- Update to 0.9.2
+
+* Mon Jun 12 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.9.1-1
+- Update to 0.9.1
+
+* Mon May 22 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.9.0-1
+- Update to 0.9.0
+
+* Tue May 02 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.8.2-1
+- Update to 0.8.2
+
+* Fri Mar 24 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.8.1-1
+- Update to 0.8.1
+
+* Tue Mar 21 2017 Jaroslav Mracek <jmracek@redhat.com> - 0.8.0-1
+- Update to 0.8.0
 
-* Fri May 18 2018 Daniel Mach <dmach@redhat.com> - 0.7.4-4
-- Rebuild on additional architectures
+* Mon Feb 20 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.7.4-1
+- Update to 0.7.4
 
-* Thu Mar 23 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.7.4-3
-- Backport patch to find releasever in RPMDB
+* Fri Feb 10 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.7.3-1
+- Update to 0.7.3
 
-* Mon Feb 20 2017 Jan Silhan <jsilhan@redhat.com> - 0.7.4-2
-- 0.7.4
+* Wed Feb 08 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.7.2-1
+- 0.7.2
 
 * Fri Jan 06 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.7.1-1
 - 0.7.1