Remove the intermediate Outline type since all items are owned by the document and the top-level items will always be eagerly loaded anyway.
diff --git a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc
index 1b5eb1d..0aa5bed 100644
--- a/qt5/src/poppler-document.cc
+++ b/qt5/src/poppler-document.cc
@@ -586,7 +586,7 @@
     
     QDomDocument *Document::toc() const
     {
-	::Outline * outline = m_doc->doc->getOutline();
+        Outline * outline = m_doc->doc->getOutline();
         if ( !outline )
             return nullptr;
 
@@ -601,13 +601,19 @@
         return toc;
     }
 
-    Outline *Document::outline() const
+    QVector<OutlineItem> Document::outline() const
     {
-      if (auto *outline = m_doc->doc->getOutline()) {
-	return new Outline{new OutlineData{outline, m_doc}};
+      QVector<OutlineItem> result;
+
+      if (::Outline *outline = m_doc->doc->getOutline()) {
+	if (const GooList *items = outline->getItems()) {
+	  for (void *item : *items) {
+	    result.push_back(OutlineItem{new OutlineItemData{static_cast<::OutlineItem *>(item), m_doc}});
+	  }
+	}
       }
 
-      return nullptr;
+      return result;
     }
 
     LinkDestination *Document::linkDestination( const QString &name )
diff --git a/qt5/src/poppler-outline-private.h b/qt5/src/poppler-outline-private.h
index ccc0f8c..6c00c16 100644
--- a/qt5/src/poppler-outline-private.h
+++ b/qt5/src/poppler-outline-private.h
@@ -40,13 +40,6 @@
   mutable QString uri;
 };
 
-struct OutlineData
-{
-  OutlineData(const ::Outline *data, DocumentData *documentData) : data{data}, documentData{documentData} {}
-  const ::Outline *data;
-  DocumentData *documentData;
-};
-
 }
 
 #endif
diff --git a/qt5/src/poppler-outline.cc b/qt5/src/poppler-outline.cc
index a6e4b09..c741929 100644
--- a/qt5/src/poppler-outline.cc
+++ b/qt5/src/poppler-outline.cc
@@ -163,27 +163,4 @@
   return result;
 }
 
-Outline::Outline(OutlineData *data) : m_data{data} {}
-
-Outline::~Outline()
-{
-  delete m_data;
-  m_data = nullptr;
-}
-
-QVector<OutlineItem> Outline::items() const
-{
-  QVector<OutlineItem> result;
-
-  const ::Outline *data = m_data->data;
-
-  if (const GooList *items = data->getItems()) {
-    for (void *item : *items) {
-      result.push_back(OutlineItem{new OutlineItemData{static_cast<::OutlineItem *>(item), m_data->documentData}});
-    }
-  }
-
-  return result;
-}
-
 }
diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
index 6bc96a2..c8d0cb2 100644
--- a/qt5/src/poppler-qt5.h
+++ b/qt5/src/poppler-qt5.h
@@ -71,7 +71,6 @@
     class PSConverter;
 
     struct OutlineItemData;
-    struct OutlineData;
 
     /**
 	Debug/error function.
@@ -982,7 +981,7 @@
     };
 
     class POPPLER_QT5_EXPORT OutlineItem {
-      friend class Outline;
+      friend class Document;
     public:
       OutlineItem();
       ~OutlineItem();
@@ -1012,20 +1011,6 @@
       OutlineItemData *m_data;
     };
 
-    class POPPLER_QT5_EXPORT Outline {
-      friend class Document;
-    public:
-      ~Outline();
-
-      QVector<OutlineItem> items() const;
-
-    private:
-      Q_DISABLE_COPY(Outline)
-
-      Outline(OutlineData *data);
-      OutlineData *m_data;
-    };
-
 /**
    \brief PDF document.
 
@@ -1620,7 +1605,7 @@
 	*/
 	QDomDocument *toc() const;
 
-	Outline *outline() const;
+	QVector<OutlineItem> outline() const;
 	
 	/**
 	   Tries to resolve the named destination \p name.
diff --git a/qt5/tests/check_outline.cpp b/qt5/tests/check_outline.cpp
index c42f5e0..95d780a 100644
--- a/qt5/tests/check_outline.cpp
+++ b/qt5/tests/check_outline.cpp
@@ -20,15 +20,10 @@
   };
   QVERIFY(document.get());
 
-  std::unique_ptr<Poppler::Outline> outline{
-    document->outline()
-  };
-  QVERIFY(outline.get());
+  const auto outline = document->outline();
+  QCOMPARE(outline.size(), 2);
 
-  const auto items = outline->items();
-  QCOMPARE(items.size(), 2);
-
-  const auto &foo = items[0];
+  const auto &foo = outline[0];
   QVERIFY(!foo.isNull());
   QCOMPARE(foo.name(), QStringLiteral("foo"));
   QCOMPARE(foo.isOpen(), false);
@@ -39,7 +34,7 @@
   QVERIFY(foo.uri().isEmpty());
   QVERIFY(foo.children().isEmpty());
 
-  const auto &bar = items[1];
+  const auto &bar = outline[1];
   QVERIFY(!bar.isNull());
   QCOMPARE(bar.name(), QStringLiteral("bar"));
   QCOMPARE(bar.isOpen(), false);