diff --git a/CMakeLists.txt b/CMakeLists.txt
index e3b8e8d..9c7c962 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -580,7 +580,6 @@
     ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h
     DESTINATION include/poppler)
   install(FILES
-    goo/GooList.h
     goo/GooTimer.h
     goo/GooString.h
     goo/gmem.h
diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp
index 8b788cb..c8cacb8 100644
--- a/cpp/poppler-font.cpp
+++ b/cpp/poppler-font.cpp
@@ -217,7 +217,7 @@
 
     ++d->current_page;
 
-    GooList<FontInfo*> *items = d->font_info_scanner.scan(1);
+    std::vector<FontInfo*> *items = d->font_info_scanner.scan(1);
     if (!items) {
         return std::vector<font_info>();
     }
diff --git a/cpp/poppler-toc-private.h b/cpp/poppler-toc-private.h
index 8560ca3..8788992 100644
--- a/cpp/poppler-toc-private.h
+++ b/cpp/poppler-toc-private.h
@@ -25,8 +25,6 @@
 
 #include <vector>
 
-#include "goo/GooList.h"
-
 class Outline;
 class OutlineItem;
 
@@ -55,7 +53,7 @@
     toc_item_private& operator=(const toc_item_private &) = delete;
 
     void load(const OutlineItem *item);
-    void load_children(const GooList<OutlineItem*> *items);
+    void load_children(const std::vector<OutlineItem*> *items);
 
     std::vector<toc_item*> children;
     ustring title;
diff --git a/cpp/poppler-toc.cpp b/cpp/poppler-toc.cpp
index 7aacee9..8d0edb8 100644
--- a/cpp/poppler-toc.cpp
+++ b/cpp/poppler-toc.cpp
@@ -25,7 +25,6 @@
 #include "poppler-toc-private.h"
 #include "poppler-private.h"
 
-#include "GooList.h"
 #include "Outline.h"
 
 using namespace poppler;
@@ -44,7 +43,7 @@
         return nullptr;
     }
 
-    const GooList<OutlineItem*> *items = outline->getItems();
+    const std::vector<OutlineItem*> *items = outline->getItems();
     if (!items || items->size() < 1) {
         return nullptr;
     }
@@ -74,7 +73,7 @@
     is_open = item->isOpen();
 }
 
-void toc_item_private::load_children(const GooList<OutlineItem*> *items)
+void toc_item_private::load_children(const std::vector<OutlineItem*> *items)
 {
     const int num_items = items->size();
     children.resize(num_items);
@@ -86,7 +85,7 @@
         children[i] = new_item;
 
         item->open();
-        const GooList<OutlineItem*> *item_children = item->getKids();
+        const std::vector<OutlineItem*> *item_children = item->getKids();
         if (item_children) {
             new_item->d->load_children(item_children);
         }
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index e1d4614..9772c16 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -23,7 +23,6 @@
 #include <string.h>
 
 #ifndef __GI_SCANNER__
-#include <goo/GooList.h>
 #include <splash/SplashBitmap.h>
 #include <DateInfo.h>
 #include <GlobalParams.h>
@@ -2163,7 +2162,7 @@
 struct _PopplerIndexIter
 {
 	PopplerDocument *document;
-	const GooList<OutlineItem*> *items;
+	const std::vector<OutlineItem*> *items;
 	int index;
 };
 
@@ -2238,7 +2237,7 @@
 {
 	PopplerIndexIter *iter;
 	Outline *outline;
-	const GooList<OutlineItem*> *items;
+	const std::vector<OutlineItem*> *items;
 
 	outline = document->doc->getOutline();
 	if (outline == nullptr)
@@ -2401,7 +2400,7 @@
 
 struct _PopplerFontsIter
 {
-	GooList<FontInfo*> *items;
+	std::vector<FontInfo*> *items;
 	int index;
 };
 
@@ -2632,7 +2631,7 @@
 
 	new_iter = g_slice_dup (PopplerFontsIter, iter);
 
-	new_iter->items = new GooList<FontInfo*> ();
+	new_iter->items = new std::vector<FontInfo*> ();
 	for (std::size_t i = 0; i < iter->items->size(); i++) {
 		FontInfo *info = (*iter->items)[i];
 		new_iter->items->push_back (new FontInfo (*info));
@@ -2662,7 +2661,7 @@
 }
 
 static PopplerFontsIter *
-poppler_fonts_iter_new (GooList<FontInfo*> *items)
+poppler_fonts_iter_new (std::vector<FontInfo*> *items)
 {
 	PopplerFontsIter *iter;
 
@@ -2766,7 +2765,7 @@
 			int                n_pages,
 			PopplerFontsIter **iter)
 {
-	GooList<FontInfo*> *items;
+	std::vector<FontInfo*> *items;
 
 	g_return_val_if_fail (iter != nullptr, FALSE);
 
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index b2db640..279ab45 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -20,7 +20,6 @@
 #include <math.h>
 
 #ifndef __GI_SCANNER__
-#include <goo/GooList.h>
 #include <GlobalParams.h>
 #include <PDFDoc.h>
 #include <Outline.h>
diff --git a/goo/GooList.h b/goo/GooList.h
deleted file mode 100644
index c95dbcc..0000000
--- a/goo/GooList.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//========================================================================
-//
-// GooList.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-//========================================================================
-//
-// Modified under the Poppler project - http://poppler.freedesktop.org
-//
-// All changes made under the Poppler project to this file are licensed
-// under GPL version 2 or later
-//
-// Copyright (C) 2012, 2018 Albert Astals Cid <aacid@kde.org>
-// Copyright (C) 2018 Adam Reichold <adam.reichold@t-online.de>
-//
-// To see a description of the changes please see the Changelog file that
-// came with your tarball or type make ChangeLog if you are building from git
-//
-//========================================================================
-
-#ifndef GOO_LIST_H
-#define GOO_LIST_H
-
-#include <algorithm>
-#include <vector>
-
-//------------------------------------------------------------------------
-// GooList
-//------------------------------------------------------------------------
-
-template <typename T>
-class GooList : public std::vector<T> {
-public:
-
-  // Create an empty list.
-  GooList() = default;
-
-  // Movable but not copyable
-  GooList(GooList &&other) = default;
-  GooList& operator=(GooList &&other) = default;
-
-  GooList(const GooList &other) = delete;
-  GooList& operator=(const GooList &other) = delete;
-
-  // Zero cost conversion from std::vector
-  explicit GooList(const std::vector<T>& vec) : std::vector<T>(vec) {}
-  explicit GooList(std::vector<T>&& vec) : std::vector<T>(std::move(vec)) {}
-};
-
-#endif // GOO_LIST_H
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 7f459c1..e6788ac 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -56,7 +56,6 @@
 #include <assert.h>
 #include "goo/gmem.h"
 #include "goo/gstrtod.h"
-#include "GooList.h"
 #include "Error.h"
 #include "Object.h"
 #include "Catalog.h"
@@ -756,7 +755,7 @@
   fontPtSize = -1;
 
   if (da) {
-    GooList<GooString*> * daToks = new GooList<GooString*>();
+    std::vector<GooString*> * daToks = new std::vector<GooString*>();
     int i = FormFieldText::tokenizeDA(da, daToks, "Tf");
 
     if (i >= 1) {
@@ -4031,7 +4030,7 @@
     bool txField, bool forceZapfDingbats,
     XRef *xref, bool *addedDingbatsResource,
     bool password) {
-  GooList<GooString*> *daToks;
+  std::vector<GooString*> *daToks;
   GooString *tok;
   GooString convertedText;
   const GfxFont *font;
@@ -4049,7 +4048,7 @@
   // parse the default appearance string
   tfPos = tmPos = -1;
   if (da) {
-    daToks = new GooList<GooString*>();
+    daToks = new std::vector<GooString*>();
     i = 0;
     while (i < da->getLength()) {
       while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
@@ -4449,7 +4448,7 @@
 // Draw the variable text or caption for a field.
 bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, const AnnotBorder *border, const PDFRectangle *rect,
 			      const GooString *da, const GfxResources *resources, int quadding) {
-  GooList<GooString*> *daToks;
+  std::vector<GooString*> *daToks;
   GooString *tok;
   GooString convertedText;
   const GfxFont *font;
@@ -4463,7 +4462,7 @@
   // parse the default appearance string
   tfPos = tmPos = -1;
   if (da) {
-    daToks = new GooList<GooString*>();
+    daToks = new std::vector<GooString*>();
     i = 0;
     while (i < da->getLength()) {
       while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
index 3549581..6ed7517 100644
--- a/poppler/FontInfo.cc
+++ b/poppler/FontInfo.cc
@@ -51,7 +51,7 @@
 FontInfoScanner::~FontInfoScanner() {
 }
 
-GooList<FontInfo*> *FontInfoScanner::scan(int nPages) {
+std::vector<FontInfo*> *FontInfoScanner::scan(int nPages) {
   Page *page;
   Dict *resDict;
   Annots *annots;
@@ -61,7 +61,7 @@
     return nullptr;
   }
  
-  auto result = new GooList<FontInfo*>();
+  auto result = new std::vector<FontInfo*>();
 
   lastPage = currentPage + nPages;
   if (lastPage > doc->getNumPages() + 1) {
@@ -92,7 +92,7 @@
   return result;
 }
 
-void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, GooList<FontInfo*> *fontsList) {
+void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, std::vector<FontInfo*> *fontsList) {
   GfxFontDict *gfxFontDict;
   GfxFont *font;
 
diff --git a/poppler/FontInfo.h b/poppler/FontInfo.h
index e851288..3a70568 100644
--- a/poppler/FontInfo.h
+++ b/poppler/FontInfo.h
@@ -26,7 +26,6 @@
 #define FONT_INFO_H
 
 #include "Object.h"
-#include "goo/GooList.h"
 
 class GfxFont;
 class PDFDoc;
@@ -89,7 +88,7 @@
   // Destructor.
   ~FontInfoScanner();
 
-  GooList<FontInfo*> *scan(int nPages);
+  std::vector<FontInfo*> *scan(int nPages);
 
 private:
 
@@ -98,7 +97,7 @@
   std::set<int> fonts;
   std::set<int> visitedObjects;
 
-  void scanFonts(XRef *xrefA, Dict *resDict, GooList<FontInfo*> *fontsList);
+  void scanFonts(XRef *xrefA, Dict *resDict, std::vector<FontInfo*> *fontsList);
 };
 
 #endif
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 880c233..691a0d5 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -1213,7 +1213,7 @@
 
 double FormFieldText::getTextFontSize()
 {
-  GooList<GooString*>* daToks = new GooList<GooString*>();
+  std::vector<GooString*>* daToks = new std::vector<GooString*>();
   int idx = parseDA(daToks);
   double fontSize = -1;
   if (idx >= 0) {
@@ -1232,7 +1232,7 @@
 void FormFieldText::setTextFontSize(int fontSize)
 {
   if (fontSize > 0 && obj.isDict()) {
-    GooList<GooString*>* daToks = new GooList<GooString*>();
+    std::vector<GooString*>* daToks = new std::vector<GooString*>();
     int idx = parseDA(daToks);
     if (idx == -1) {
       error(errSyntaxError, -1, "FormFieldText:: invalid DA object\n");
@@ -1264,7 +1264,7 @@
   }
 }
 
-int FormFieldText::tokenizeDA(const GooString* da, GooList<GooString*>* daToks, const char* searchTok)
+int FormFieldText::tokenizeDA(const GooString* da, std::vector<GooString*>* daToks, const char* searchTok)
 {
   int idx = -1;
   if(da && daToks) {
@@ -1288,7 +1288,7 @@
   return idx;
 }
 
-int FormFieldText::parseDA(GooList<GooString*>* daToks)
+int FormFieldText::parseDA(std::vector<GooString*>* daToks)
 {
   int idx = -1;
   if (obj.isDict()) {
diff --git a/poppler/Form.h b/poppler/Form.h
index 496680b..948dfd6 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -24,7 +24,6 @@
 #ifndef FORM_H
 #define FORM_H
 
-#include "goo/GooList.h"
 #include "Object.h"
 #include "Annot.h"
 
@@ -426,10 +425,10 @@
 
   void print(int indent) override;
 
-  static int tokenizeDA(const GooString* daString, GooList<GooString*>* daToks, const char* searchTok);
+  static int tokenizeDA(const GooString* daString, std::vector<GooString*>* daToks, const char* searchTok);
 
 protected:
-  int parseDA(GooList<GooString*>* daToks);
+  int parseDA(std::vector<GooString*>* daToks);
 
   GooString* content;
   bool multiline;
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
index 47ae015..e480ea5 100644
--- a/poppler/Gfx.h
+++ b/poppler/Gfx.h
@@ -34,7 +34,6 @@
 #define GFX_H
 
 #include "poppler-config.h"
-#include "goo/GooList.h"
 #include "GfxState.h"
 #include "Object.h"
 #include "PopplerCache.h"
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
index c1f1742..f492b33 100644
--- a/poppler/GfxState.cc
+++ b/poppler/GfxState.cc
@@ -432,7 +432,7 @@
   return cs;
 }
 
-void GfxColorSpace::createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
+void GfxColorSpace::createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
   return;
 }
 
@@ -2857,7 +2857,7 @@
   color->c[0] = gfxColorComp1;
 }
 
-void GfxSeparationColorSpace::createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
+void GfxSeparationColorSpace::createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
   if (nonMarking)
     return;
   mapping = (int *)gmalloc(sizeof(int));
@@ -2914,7 +2914,7 @@
 					   GooString **namesA,
 					   GfxColorSpace *altA,
 					   Function *funcA,
-					   GooList<GfxSeparationColorSpace*> *sepsCSA) {
+					   std::vector<GfxSeparationColorSpace*> *sepsCSA) {
   int i;
 
   nComps = nCompsA;
@@ -2949,7 +2949,7 @@
 					   GooString **namesA,
 					   GfxColorSpace *altA,
 					   Function *funcA,
-					   GooList<GfxSeparationColorSpace*> *sepsCSA,
+					   std::vector<GfxSeparationColorSpace*> *sepsCSA,
 					   int *mappingA,
 					   bool nonMarkingA,
 					   unsigned int overprintMaskA) {
@@ -2987,7 +2987,7 @@
   int i;
   int *mappingA = nullptr;
 
-  auto sepsCSA = new GooList<GfxSeparationColorSpace*>();
+  auto sepsCSA = new std::vector<GfxSeparationColorSpace*>();
   sepsCSA->reserve(sepsCS->size());
   for (std::size_t i = 0; i < sepsCS->size(); i++) {
     GfxSeparationColorSpace *scs = (*sepsCS)[i];
@@ -3012,7 +3012,7 @@
   Function *funcA;
   Object obj1;
   int i;
-  auto separationList = new GooList<GfxSeparationColorSpace*>();
+  auto separationList = new std::vector<GfxSeparationColorSpace*>();
 
   if (arr->getLength() != 4 && arr->getLength() != 5) {
     error(errSyntaxWarning, -1, "Bad DeviceN color space");
@@ -3154,7 +3154,7 @@
   }
 }
 
-void GfxDeviceNColorSpace::createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
+void GfxDeviceNColorSpace::createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) {
   if (nonMarking)               // None
     return;
   mapping = (int *)gmalloc(sizeof(int) * nComps);
diff --git a/poppler/GfxState.h b/poppler/GfxState.h
index 4bd7620..ed06e9f 100644
--- a/poppler/GfxState.h
+++ b/poppler/GfxState.h
@@ -235,7 +235,7 @@
   virtual void getDeviceNLine(unsigned char * /*in*/, unsigned char * /*out*/, int /*length*/) {  error(errInternal, -1, "GfxColorSpace::getDeviceNLine this should not happen"); }
 
   // create mapping for spot colorants
-  virtual void createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps);
+  virtual void createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps);
 
   // Does this ColorSpace support getRGBLine?
   virtual bool useGetRGBLine() const { return false; }
@@ -621,7 +621,7 @@
   unsigned char *getLookup() { return lookup; }
   GfxColor *mapColorToBase(const GfxColor *color, GfxColor *baseColor) const;
   unsigned int getOverprintMask() { return base->getOverprintMask(); }
-  void createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) override
+  void createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) override
     { base->createMapping(separationList, maxSepComps); }
 
 
@@ -653,7 +653,7 @@
   void getCMYK(const GfxColor *color, GfxCMYK *cmyk) const override;
   void getDeviceN(const GfxColor *color, GfxColor *deviceN) const override;
 
-  void createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) override;
+  void createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) override;
 
   int getNComps() const override { return 1; }
   void getDefaultColor(GfxColor *color) override;
@@ -685,7 +685,7 @@
 public:
 
   GfxDeviceNColorSpace(int nCompsA, GooString **namesA,
-		       GfxColorSpace *alt, Function *func, GooList<GfxSeparationColorSpace*> *sepsCS);
+		       GfxColorSpace *alt, Function *func, std::vector<GfxSeparationColorSpace*> *sepsCS);
   ~GfxDeviceNColorSpace();
   GfxColorSpace *copy() override;
   GfxColorSpaceMode getMode() override { return csDeviceN; }
@@ -698,7 +698,7 @@
   void getCMYK(const GfxColor *color, GfxCMYK *cmyk) const override;
   void getDeviceN(const GfxColor *color, GfxColor *deviceN) const override;
 
-  void createMapping(GooList<GfxSeparationColorSpace*> *separationList, int maxSepComps) override;
+  void createMapping(std::vector<GfxSeparationColorSpace*> *separationList, int maxSepComps) override;
 
   int getNComps() const override { return nComps; }
   void getDefaultColor(GfxColor *color) override;
@@ -713,13 +713,8 @@
 private:
 
   GfxDeviceNColorSpace(int nCompsA, GooString **namesA,
-<<<<<<< HEAD
-		       GfxColorSpace *alt, Function *func, GooList *sepsCSA,
+		       GfxColorSpace *alt, Function *func, std::vector<GfxSeparationColorSpace*> *sepsCSA,
 		       int *mappingA, bool nonMarkingA, unsigned int overprintMaskA);
-=======
-		       GfxColorSpace *alt, Function *func, GooList<GfxSeparationColorSpace*> *sepsCSA,
-		       int *mappingA, bool nonMarkingA, Guint overprintMaskA);
->>>>>>> Make GooList a template type
 
   int nComps;			// number of components
   GooString			// colorant names
@@ -727,7 +722,7 @@
   GfxColorSpace *alt;		// alternate color space
   Function *func;		// tint transform (into alternate color space)
   bool nonMarking;
-  GooList<GfxSeparationColorSpace*> *sepsCS; // list of separation cs for spot colorants;
+  std::vector<GfxSeparationColorSpace*> *sepsCS; // list of separation cs for spot colorants;
 };
 
 //------------------------------------------------------------------------
diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc
index 3acd60d..0f17bf5 100644
--- a/poppler/GlobalParams.cc
+++ b/poppler/GlobalParams.cc
@@ -58,7 +58,6 @@
 #include "goo/glibc.h"
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "goo/gfile.h"
 #include "goo/gdir.h"
 #include "Error.h"
@@ -246,11 +245,11 @@
 			       const char *path);
 #endif
 
-  GooList<SysFontInfo*> *fonts;
+  std::vector<SysFontInfo*> *fonts;
 };
 
 SysFontList::SysFontList() {
-  fonts = new GooList<SysFontInfo*>();
+  fonts = new std::vector<SysFontInfo*>();
 }
 
 SysFontList::~SysFontList() {
@@ -397,7 +396,7 @@
 
   nameToUnicodeZapfDingbats = new NameToCharCode();
   nameToUnicodeText = new NameToCharCode();
-  toUnicodeDirs = new GooList<GooString*>();
+  toUnicodeDirs = new std::vector<GooString*>();
   sysFonts = new SysFontList();
   psExpandSmaller = false;
   psShrinkLarger = true;
@@ -1209,9 +1208,9 @@
   return getUnicodeMap2(textEncoding);
 }
 
-GooList<GooString*> *GlobalParams::getEncodingNames()
+std::vector<GooString*> *GlobalParams::getEncodingNames()
 {
-  auto* const result = new GooList<GooString*>;
+  auto* const result = new std::vector<GooString*>;
   for (const auto& unicodeMap : residentUnicodeMaps) {
     result->push_back(new GooString(unicodeMap.first));
   }
diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h
index 0277ee2..b20bd4e 100644
--- a/poppler/GlobalParams.h
+++ b/poppler/GlobalParams.h
@@ -44,6 +44,7 @@
 #include <unordered_map>
 #include <string>
 #include <mutex>
+#include <vector>
 
 class GooString;
 class NameToCharCode;
@@ -144,7 +145,7 @@
   CMap *getCMap(const GooString *collection, GooString *cMapName, Stream *stream = nullptr);
   UnicodeMap *getTextEncoding();
 
-  GooList<GooString*> *getEncodingNames();
+  std::vector<GooString*> *getEncodingNames();
 
   //----- functions to set parameters
   void addFontFile(GooString *fontName, GooString *path);
@@ -194,7 +195,7 @@
   std::unordered_map<std::string, std::string> unicodeMaps;
   // list of CMap dirs, indexed by collection
   std::unordered_multimap<std::string, std::string> cMapDirs;
-  GooList<GooString*> *toUnicodeDirs;		// list of ToUnicode CMap dirs
+  std::vector<GooString*> *toUnicodeDirs;		// list of ToUnicode CMap dirs
   bool baseFontsInitialized;
 #ifdef _WIN32
   // windows font substitutes (for CID fonts)
diff --git a/poppler/GlobalParamsWin.cc b/poppler/GlobalParamsWin.cc
index 6d13f72..6680d2f 100644
--- a/poppler/GlobalParamsWin.cc
+++ b/poppler/GlobalParamsWin.cc
@@ -34,7 +34,6 @@
 
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "goo/gfile.h"
 #include "Error.h"
 #include "NameToCharCode.h"
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
index e9177ab..1bb4751 100644
--- a/poppler/JBIG2Stream.cc
+++ b/poppler/JBIG2Stream.cc
@@ -35,7 +35,6 @@
 
 #include <stdlib.h>
 #include <limits.h>
-#include "goo/GooList.h"
 #include "Error.h"
 #include "JArithmeticDecoder.h"
 #include "JBIG2Stream.h"
@@ -1244,7 +1243,7 @@
 
 void JBIG2Stream::reset() {
   // read the globals stream
-  globalSegments = new GooList<JBIG2Segment*>();
+  globalSegments = new std::vector<JBIG2Segment*>();
   if (globalsStream.isStream()) {
     segments = globalSegments;
     curStr = globalsStream.getStream();
@@ -1257,7 +1256,7 @@
   }
 
   // read the main stream
-  segments = new GooList<JBIG2Segment*>();
+  segments = new std::vector<JBIG2Segment*>();
   curStr = str;
   curStr->reset();
   arithDecoder->setStream(curStr);
@@ -1562,7 +1561,7 @@
   JBIG2HuffmanTable *huffDHTable, *huffDWTable;
   JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable;
   JBIG2Segment *seg;
-  GooList<JBIG2Segment*> *codeTables;
+  std::vector<JBIG2Segment*> *codeTables;
   JBIG2SymbolDict *inputSymbolDict;
   unsigned int flags, sdTemplate, sdrTemplate, huff, refAgg;
   unsigned int huffDH, huffDW, huffBMSize, huffAggInst;
@@ -1633,7 +1632,7 @@
   }
 
   // get referenced segments: input symbol dictionaries and code tables
-  codeTables = new GooList<JBIG2Segment*>();
+  codeTables = new std::vector<JBIG2Segment*>();
   numInputSyms = 0;
   for (i = 0; i < nRefSegs; ++i) {
     // This is need by bug 12014, returning false makes it not crash
@@ -2025,7 +2024,7 @@
   JBIG2HuffmanTable *huffRDWTable, *huffRDHTable;
   JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable;
   JBIG2Segment *seg;
-  GooList<JBIG2Segment*> *codeTables;
+  std::vector<JBIG2Segment*> *codeTables;
   JBIG2SymbolDict *symbolDict;
   JBIG2Bitmap **syms;
   unsigned int w, h, x, y, segInfoFlags, extCombOp;
@@ -2089,7 +2088,7 @@
   }
 
   // get symbol dictionaries and tables
-  codeTables = new GooList<JBIG2Segment*>();
+  codeTables = new std::vector<JBIG2Segment*>();
   numSyms = 0;
   for (i = 0; i < nRefSegs; ++i) {
     if ((seg = findSegment(refSegs[i]))) {
diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h
index f410134..630bdc7 100644
--- a/poppler/JBIG2Stream.h
+++ b/poppler/JBIG2Stream.h
@@ -133,8 +133,8 @@
   unsigned int pageDefPixel;
   JBIG2Bitmap *pageBitmap;
   unsigned int defCombOp;
-  GooList<JBIG2Segment*> *segments;
-  GooList<JBIG2Segment*> *globalSegments;
+  std::vector<JBIG2Segment*> *segments;
+  std::vector<JBIG2Segment*> *globalSegments;
   Stream *curStr;
   unsigned char *dataPtr;
   unsigned char *dataEnd;
diff --git a/poppler/Link.cc b/poppler/Link.cc
index d9498ab..e1ab66e 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -35,7 +35,6 @@
 #include <string.h>
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "Error.h"
 #include "Object.h"
 #include "Array.h"
@@ -162,7 +161,7 @@
 
   // parse the next actions
   const Object nextObj = obj->dictLookup("Next");
-  GooList<LinkAction*> *actionList = nullptr;
+  std::vector<LinkAction*> *actionList = nullptr;
   if (nextObj.isDict()) {
 
     // Prevent circles in the tree by checking the ref against used refs in
@@ -176,13 +175,13 @@
         }
     }
 
-    actionList = new GooList<LinkAction*>();
+    actionList = new std::vector<LinkAction*>();
     actionList->reserve(1);
     actionList->push_back(parseAction(&nextObj, nullptr, seenNextActions));
   } else if (nextObj.isArray()) {
     const Array *a = nextObj.getArray();
     const int n = a->getLength();
-    actionList = new GooList<LinkAction*>();
+    actionList = new std::vector<LinkAction*>();
     actionList->reserve(n);
     for (int i = 0; i < n; ++i) {
       const Object obj3 = a->get(i);
@@ -210,11 +209,11 @@
   return action;
 }
 
-const GooList<LinkAction*> *LinkAction::nextActions() const {
+const std::vector<LinkAction*> *LinkAction::nextActions() const {
   return nextActionList;
 }
 
-void LinkAction::setNextActions(GooList<LinkAction*> *actions) {
+void LinkAction::setNextActions(std::vector<LinkAction*> *actions) {
   delete nextActionList;
   nextActionList = actions;
 }
@@ -828,7 +827,7 @@
 // LinkOCGState
 //------------------------------------------------------------------------
 LinkOCGState::LinkOCGState(const Object *obj) {
-  stateList = new GooList<StateList*>();
+  stateList = new std::vector<StateList*>();
   preserveRB = true;
 
   Object obj1 = obj->dictLookup("State");
@@ -843,7 +842,7 @@
 
 	const char *name = obj2.getName();
 	stList = new StateList();
-	stList->list = new GooList<Ref*>();
+	stList->list = new std::vector<Ref*>();
 	if (!strcmp (name, "ON")) {
 	  stList->st = On;
 	} else if (!strcmp (name, "OFF")) {
diff --git a/poppler/Link.h b/poppler/Link.h
index e7830fa..6d99a57 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -29,7 +29,6 @@
 #ifndef LINK_H
 #define LINK_H
 
-#include "goo/GooList.h"
 #include "Object.h"
 #include <memory>
 #include <set>
@@ -85,15 +84,15 @@
 
   // A List of the next actions to execute in order.
   // The list contains pointer to LinkAction objects.
-  const GooList<LinkAction*> *nextActions() const;
+  const std::vector<LinkAction*> *nextActions() const;
 
   // Sets the next action list. Takes ownership of the actions.
-  void setNextActions(GooList<LinkAction*> *actions);
+  void setNextActions(std::vector<LinkAction*> *actions);
 
 private:
   static LinkAction *parseAction(const Object *obj, const GooString *baseURI, std::set<int> *seenNextActions);
 
-  GooList<LinkAction*> *nextActionList;
+  std::vector<LinkAction*> *nextActionList;
 };
 
 //------------------------------------------------------------------------
@@ -452,14 +451,14 @@
     StateList(const StateList &) = delete;
     StateList& operator=(const StateList &) = delete;
     State st;
-    GooList<Ref*> *list;
+    std::vector<Ref*> *list;
   };
 
-  const GooList<StateList*> *getStateList() const { return stateList; }
+  const std::vector<StateList*> *getStateList() const { return stateList; }
   bool getPreserveRB() const { return preserveRB; }
 
 private:
-  GooList<StateList*> *stateList;
+  std::vector<StateList*> *stateList;
   bool preserveRB;
 };
 
diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc
index e2b293a..7dfde6a 100644
--- a/poppler/OptionalContent.cc
+++ b/poppler/OptionalContent.cc
@@ -17,7 +17,6 @@
 
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "Error.h"
 #include "OptionalContent.h"
 
@@ -432,22 +431,22 @@
 
 void OCDisplayNode::addChild(OCDisplayNode *child) {
   if (!children) {
-    children = new GooList<OCDisplayNode*>();
+    children = new std::vector<OCDisplayNode*>();
   }
   children->push_back(child);
 }
 
-void OCDisplayNode::addChildren(GooList<OCDisplayNode*> *childrenA) {
+void OCDisplayNode::addChildren(std::vector<OCDisplayNode*> *childrenA) {
   if (!children) {
-    children = new GooList<OCDisplayNode*>();
+    children = new std::vector<OCDisplayNode*>();
   }
   children->reserve(children->size() + childrenA->size());
   children->insert(children->end(), childrenA->begin(), childrenA->end());
   delete childrenA;
 }
 
-GooList<OCDisplayNode*> *OCDisplayNode::takeChildren() {
-  GooList<OCDisplayNode*> *childrenA = children;
+std::vector<OCDisplayNode*> *OCDisplayNode::takeChildren() {
+  std::vector<OCDisplayNode*> *childrenA = children;
 
   children = nullptr;
   return childrenA;
diff --git a/poppler/OptionalContent.h b/poppler/OptionalContent.h
index 1c060f0..e9e15e0 100644
--- a/poppler/OptionalContent.h
+++ b/poppler/OptionalContent.h
@@ -14,7 +14,6 @@
 #ifndef OPTIONALCONTENT_H
 #define OPTIONALCONTENT_H
 
-#include "goo/GooList.h"
 #include "Object.h"
 #include "CharTypes.h"
 #include <unordered_map>
@@ -135,12 +134,12 @@
   OCDisplayNode(const GooString *nameA);
   OCDisplayNode(OptionalContentGroup *ocgA);
   void addChild(OCDisplayNode *child);
-  void addChildren(GooList<OCDisplayNode*> *childrenA);
-  GooList<OCDisplayNode*> *takeChildren();
+  void addChildren(std::vector<OCDisplayNode*> *childrenA);
+  std::vector<OCDisplayNode*> *takeChildren();
 
   GooString *name;		// display name (may be nullptr)
   OptionalContentGroup *ocg;	// nullptr for display labels
-  GooList<OCDisplayNode*> *children;		// nullptr if there are no children
+  std::vector<OCDisplayNode*> *children;		// nullptr if there are no children
 				//   [OCDisplayNode]
 };
 
diff --git a/poppler/Outline.cc b/poppler/Outline.cc
index 20d4f41..a05c753 100644
--- a/poppler/Outline.cc
+++ b/poppler/Outline.cc
@@ -30,7 +30,6 @@
 
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "XRef.h"
 #include "Link.h"
 #include "PDFDocEncoding.h"
@@ -111,8 +110,8 @@
   }
 }
 
-GooList<OutlineItem*> *OutlineItem::readItemList(OutlineItem *parent, const Object *firstItemRef, XRef *xrefA) {
-  auto items = new GooList<OutlineItem*>();
+std::vector<OutlineItem*> *OutlineItem::readItemList(OutlineItem *parent, const Object *firstItemRef, XRef *xrefA) {
+  auto items = new std::vector<OutlineItem*>();
 
   char* alreadyRead = (char *)gmalloc(xrefA->getNumObjects());
   memset(alreadyRead, 0, xrefA->getNumObjects());
diff --git a/poppler/Outline.h b/poppler/Outline.h
index edd5c87..984bc94 100644
--- a/poppler/Outline.h
+++ b/poppler/Outline.h
@@ -26,7 +26,6 @@
 
 #include "Object.h"
 #include "CharTypes.h"
-#include "goo/GooList.h"
 
 class GooString;
 class XRef;
@@ -44,11 +43,11 @@
   Outline(const Outline &) = delete;
   Outline& operator=(const Outline &) = delete;
 
-  const GooList<OutlineItem*> *getItems() const { return items; }
+  const std::vector<OutlineItem*> *getItems() const { return items; }
 
 private:
 
-  GooList<OutlineItem*> *items; // nullptr if document has no outline,
+  std::vector<OutlineItem*> *items; // nullptr if document has no outline,
 };
 
 //------------------------------------------------------------------------
@@ -62,7 +61,7 @@
   OutlineItem(const OutlineItem &) = delete;
   OutlineItem& operator=(const OutlineItem &) = delete;
 
-  static GooList<OutlineItem*> *readItemList(OutlineItem *parent, const Object *firstItemRef, XRef *xrefA);
+  static std::vector<OutlineItem*> *readItemList(OutlineItem *parent, const Object *firstItemRef, XRef *xrefA);
 
   void open();
   void close();
@@ -72,7 +71,7 @@
   const LinkAction *getAction() const { return action; }
   bool isOpen() const { return startsOpen; }
   bool hasKids() const { return firstRef.isRef(); }
-  const GooList<OutlineItem*> *getKids() const { return kids; }
+  const std::vector<OutlineItem*> *getKids() const { return kids; }
 
 private:
 
@@ -86,7 +85,7 @@
   Object lastRef;
   Object nextRef;
   bool startsOpen;
-  GooList<OutlineItem*> *kids;   // nullptr if this item is closed or has no kids
+  std::vector<OutlineItem*> *kids;   // nullptr if this item is closed or has no kids
 };
 
 #endif
diff --git a/poppler/PDFDocFactory.cc b/poppler/PDFDocFactory.cc
index 9ac973f..bda6d28 100644
--- a/poppler/PDFDocFactory.cc
+++ b/poppler/PDFDocFactory.cc
@@ -15,7 +15,6 @@
 
 #include "PDFDocFactory.h"
 
-#include "goo/GooList.h"
 #include "goo/GooString.h"
 #include "PDFDoc.h"
 #include "LocalPDFDocBuilder.h"
@@ -29,12 +28,12 @@
 // PDFDocFactory
 //------------------------------------------------------------------------
 
-PDFDocFactory::PDFDocFactory(GooList<PDFDocBuilder*> *pdfDocBuilders)
+PDFDocFactory::PDFDocFactory(std::vector<PDFDocBuilder*> *pdfDocBuilders)
 {
   if (pdfDocBuilders) {
     builders = pdfDocBuilders;
   } else {
-    builders = new GooList<PDFDocBuilder*>();
+    builders = new std::vector<PDFDocBuilder*>();
   }
   builders->push_back(new LocalPDFDocBuilder());
   builders->push_back(new StdinPDFDocBuilder());
diff --git a/poppler/PDFDocFactory.h b/poppler/PDFDocFactory.h
index fa735bf..b029b31 100644
--- a/poppler/PDFDocFactory.h
+++ b/poppler/PDFDocFactory.h
@@ -33,7 +33,7 @@
 
 public:
 
-  PDFDocFactory(GooList<PDFDocBuilder*> *pdfDocBuilders = nullptr);
+  PDFDocFactory(std::vector<PDFDocBuilder*> *pdfDocBuilders = nullptr);
   ~PDFDocFactory();
 
   PDFDocFactory(const PDFDocFactory &) = delete;
@@ -50,7 +50,7 @@
 
 private:
 
-  GooList<PDFDocBuilder*> *builders;
+  std::vector<PDFDocBuilder*> *builders;
 
 };
 
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index cd65ee0..5de0e40 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -52,7 +52,6 @@
 #include <algorithm>
 #include <array>
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "poppler-config.h"
 #include "GlobalParams.h"
 #include "Object.h"
@@ -1325,7 +1324,7 @@
     paperMatch = false;
   }
   Page *page;
-  paperSizes = new GooList<PSOutPaperSize*>();
+  paperSizes = new std::vector<PSOutPaperSize*>();
   for (size_t pgi = 0; pgi < pages.size(); ++pgi) {
     const int pg = pages[pgi];
     page = catalog->getPage(pg);
diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h
index 8ce7613..119a1d6 100644
--- a/poppler/PSOutputDev.h
+++ b/poppler/PSOutputDev.h
@@ -498,7 +498,7 @@
   int numTilingPatterns;	// current number of nested tiling patterns
   int nextFunc;			// next unique number to use for a function
 
-  GooList<PSOutPaperSize*> *paperSizes;	// list of used paper sizes, if paperMatch
+  std::vector<PSOutPaperSize*> *paperSizes;	// list of used paper sizes, if paperMatch
 				//   is true
   std::map<int,int> pagePaperSize; // page num to paperSize entry mapping
   double tx0, ty0;		// global translation
diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc
index d8b7f0d..35fc0b4 100644
--- a/poppler/TextOutputDev.cc
+++ b/poppler/TextOutputDev.cc
@@ -63,7 +63,6 @@
 #include "goo/gfile.h"
 #include "goo/gmem.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "poppler-config.h"
 #include "Error.h"
 #include "GlobalParams.h"
@@ -2281,7 +2280,7 @@
   TextWord **wordArray;
   int nWords, i;
 
-  words = new GooList<TextWord*>();
+  words = new std::vector<TextWord*>();
 
   if (text->rawOrder) {
     for (word = text->rawWords; word; word = word->next) {
@@ -2373,11 +2372,11 @@
   blocks = nullptr;
   rawWords = nullptr;
   rawLastWord = nullptr;
-  fonts = new GooList<TextFontInfo*>();
+  fonts = new std::vector<TextFontInfo*>();
   lastFindXMin = lastFindYMin = 0;
   haveLastFind = false;
-  underlines = new GooList<TextUnderline*>();
-  links = new GooList<TextLink*>();
+  underlines = new std::vector<TextUnderline*>();
+  links = new std::vector<TextLink*>();
   mergeCombining = true;
 }
 
@@ -2480,9 +2479,9 @@
   blocks = nullptr;
   rawWords = nullptr;
   rawLastWord = nullptr;
-  fonts = new GooList<TextFontInfo*>();
-  underlines = new GooList<TextUnderline*>();
-  links = new GooList<TextLink*>();
+  fonts = new std::vector<TextFontInfo*>();
+  underlines = new std::vector<TextUnderline*>();
+  links = new std::vector<TextLink*>();
 }
 
 void TextPage::updateFont(GfxState *state) {
@@ -4427,16 +4426,16 @@
   void endPage();
 
   GooString *getText(void);
-  GooList<TextWordSelection*> **takeWordList(int *nLines);
+  std::vector<TextWordSelection*> **takeWordList(int *nLines);
 
 private:
 
   void startLine();
   void finishLine();
 
-  GooList<TextWordSelection*> **lines;
+  std::vector<TextWordSelection*> **lines;
   int nLines, linesSize;
-  GooList<TextWordSelection*> *words;
+  std::vector<TextWordSelection*> *words;
   int tableId;
   TextBlock *currentBlock;
 };
@@ -4445,7 +4444,7 @@
     : TextSelectionVisitor(page)
 {
   linesSize = 256;
-  lines = (GooList<TextWordSelection*> **)gmallocn(linesSize, sizeof(GooList<TextWordSelection*> *));
+  lines = (std::vector<TextWordSelection*> **)gmallocn(linesSize, sizeof(std::vector<TextWordSelection*> *));
   nLines = 0;
 
   tableId = -1;
@@ -4467,14 +4466,14 @@
 void TextSelectionDumper::startLine()
 {
   finishLine();
-  words = new GooList<TextWordSelection*>();
+  words = new std::vector<TextWordSelection*>();
 }
 
 void TextSelectionDumper::finishLine()
 {
   if (nLines == linesSize) {
     linesSize *= 2;
-    lines = (GooList<TextWordSelection*> **)grealloc(lines, linesSize * sizeof(GooList<TextWordSelection*> *));
+    lines = (std::vector<TextWordSelection*> **)grealloc(lines, linesSize * sizeof(std::vector<TextWordSelection*> *));
   }
 
   if (words && words->size() > 0)
@@ -4549,7 +4548,7 @@
   eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
 
   for (i = 0; i < nLines; i++) {
-    GooList<TextWordSelection*> *lineWords = lines[i];
+    std::vector<TextWordSelection*> *lineWords = lines[i];
     for (std::size_t j = 0; j < lineWords->size(); j++) {
       TextWordSelection *sel = (*lineWords)[j];
 
@@ -4566,9 +4565,9 @@
   return text;
 }
 
-GooList<TextWordSelection*> **TextSelectionDumper::takeWordList(int *nLinesOut)
+std::vector<TextWordSelection*> **TextSelectionDumper::takeWordList(int *nLinesOut)
 {
-  GooList<TextWordSelection*> **returnValue = lines;
+  std::vector<TextWordSelection*> **returnValue = lines;
 
   *nLinesOut = nLines;
   if (nLines == 0)
@@ -4598,10 +4597,10 @@
   void visitWord (TextWord *word, int begin, int end,
 			  PDFRectangle *selection) override { };
 
-  GooList<PDFRectangle*> *getRegion () { return list; }
+  std::vector<PDFRectangle*> *getRegion () { return list; }
 
 private:
-  GooList<PDFRectangle*> *list;
+  std::vector<PDFRectangle*> *list;
   double scale;
 };
 
@@ -4609,7 +4608,7 @@
   : TextSelectionVisitor(page),
     scale(scale)
 {
-  list = new GooList<PDFRectangle*>();
+  list = new std::vector<PDFRectangle*>();
 }
 
 void TextSelectionSizer::visitLine (TextLine *line, 
@@ -4664,7 +4663,7 @@
   OutputDev *out;
   GfxColor *glyph_color;
   GfxState *state;
-  GooList<TextWordSelection*> *selectionList;
+  std::vector<TextWordSelection*> *selectionList;
   Matrix ctm, ictm;
 };
 
@@ -4680,7 +4679,7 @@
 {
   PDFRectangle box(0, 0, page->pageWidth, page->pageHeight);
 
-  selectionList = new GooList<TextWordSelection*>();
+  selectionList = new std::vector<TextWordSelection*>();
   state = new GfxState(72 * scale, 72 * scale, &box, rotation, false);
 
   state->getCTM(&ctm);
@@ -5143,7 +5142,7 @@
   painter.endPage();
 }
 
-GooList<PDFRectangle*> *TextPage::getSelectionRegion(PDFRectangle *selection,
+std::vector<PDFRectangle*> *TextPage::getSelectionRegion(PDFRectangle *selection,
 				      SelectionStyle style,
 				      double scale) {
   TextSelectionSizer sizer(this, scale);
@@ -5164,7 +5163,7 @@
   return dumper.getText();
 }
 
-GooList<TextWordSelection*> **TextPage::getSelectionWords(PDFRectangle *selection,
+std::vector<TextWordSelection*> **TextPage::getSelectionWords(PDFRectangle *selection,
                                       SelectionStyle style,
                                       int *nLines)
 {
@@ -5922,7 +5921,7 @@
   text->drawSelection(out, scale, rotation, selection, style, glyph_color, box_color);
 }
 
-GooList<PDFRectangle*> *TextOutputDev::getSelectionRegion(PDFRectangle *selection,
+std::vector<PDFRectangle*> *TextOutputDev::getSelectionRegion(PDFRectangle *selection,
 					   SelectionStyle style,
 					   double scale) {
   return text->getSelectionRegion(selection, style, scale);
diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h
index 8ebc4b7..6e158b8 100644
--- a/poppler/TextOutputDev.h
+++ b/poppler/TextOutputDev.h
@@ -519,7 +519,7 @@
 
 private:
 
-  GooList<TextWord*> *words;
+  std::vector<TextWord*> *words;
 };
 
 #endif // TEXTOUT_WORD_LIST
@@ -637,14 +637,14 @@
 		     SelectionStyle style,
 		     GfxColor *glyph_color, GfxColor *box_color);
 
-  GooList<PDFRectangle*> *getSelectionRegion(PDFRectangle *selection,
+  std::vector<PDFRectangle*> *getSelectionRegion(PDFRectangle *selection,
 			      SelectionStyle style,
 			      double scale);
 
   GooString *getSelectionText(PDFRectangle *selection,
 			      SelectionStyle style);
 
-  GooList<TextWordSelection*> **getSelectionWords(PDFRectangle *selection,
+  std::vector<TextWordSelection*> **getSelectionWords(PDFRectangle *selection,
                               SelectionStyle style,
                               int *nLines);
 
@@ -709,14 +709,14 @@
 				//   rawOrder is set)
   TextWord *rawLastWord;	// last word on rawWords list
 
-  GooList<TextFontInfo*> *fonts;// all font info objects used on this page
+  std::vector<TextFontInfo*> *fonts;// all font info objects used on this page
 
   double lastFindXMin,		// coordinates of the last "find" result
          lastFindYMin;
   bool haveLastFind;
 
-  GooList<TextUnderline*> *underlines;
-  GooList<TextLink*> *links;
+  std::vector<TextUnderline*> *underlines;
+  std::vector<TextLink*> *links;
 
   int refCnt;
 
@@ -876,7 +876,7 @@
 		     SelectionStyle style,
 		     GfxColor *glyph_color, GfxColor *box_color);
 
-  GooList<PDFRectangle*> *getSelectionRegion(PDFRectangle *selection,
+  std::vector<PDFRectangle*> *getSelectionRegion(PDFRectangle *selection,
 			      SelectionStyle style,
 			      double scale);
 
diff --git a/poppler/UnicodeMap.cc b/poppler/UnicodeMap.cc
index a1244ea..6066cc8 100644
--- a/poppler/UnicodeMap.cc
+++ b/poppler/UnicodeMap.cc
@@ -32,7 +32,6 @@
 #include "goo/gmem.h"
 #include "goo/gfile.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "Error.h"
 #include "GlobalParams.h"
 #include "UnicodeMap.h"
diff --git a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc
index 213cde3..0b70a97 100644
--- a/qt5/src/poppler-document.cc
+++ b/qt5/src/poppler-document.cc
@@ -590,7 +590,7 @@
         if ( !outline )
             return nullptr;
 
-        const GooList<OutlineItem*> * items = outline->getItems();
+        const std::vector<::OutlineItem*> * items = outline->getItems();
         if ( !items || items->size() < 1 )
             return nullptr;
 
@@ -606,7 +606,7 @@
       QVector<OutlineItem> result;
 
       if (::Outline *outline = m_doc->doc->getOutline()) {
-	if (const GooList *items = outline->getItems()) {
+	if (const auto *items = outline->getItems()) {
 	  for (void *item : *items) {
 	    result.push_back(OutlineItem{new OutlineItemData{static_cast<::OutlineItem *>(item), m_doc}});
 	  }
diff --git a/qt5/src/poppler-fontinfo.cc b/qt5/src/poppler-fontinfo.cc
index 08a2422..ae826ab 100644
--- a/qt5/src/poppler-fontinfo.cc
+++ b/qt5/src/poppler-fontinfo.cc
@@ -127,7 +127,7 @@
 	++d->currentPage;
 
 	QList<FontInfo> fonts;
-	GooList<::FontInfo*> *items = d->fontInfoScanner.scan( 1 );
+	std::vector<::FontInfo*> *items = d->fontInfoScanner.scan( 1 );
 	if ( !items )
 		return fonts;
 	fonts.reserve( items->size() );
diff --git a/qt5/src/poppler-outline.cc b/qt5/src/poppler-outline.cc
index c0fbefa..3963694 100644
--- a/qt5/src/poppler-outline.cc
+++ b/qt5/src/poppler-outline.cc
@@ -23,7 +23,6 @@
 #include "poppler-private.h"
 #include "poppler-outline-private.h"
 
-#include "GooList.h"
 #include "Link.h"
 #include "Outline.h"
 
@@ -166,7 +165,7 @@
 
   if (::OutlineItem *data = m_data->data) {
     data->open();
-    if (const GooList *kids = data->getKids()) {
+    if (const auto *kids = data->getKids()) {
       for (void *kid : *kids) {
 	result.push_back(OutlineItem{new OutlineItemData{static_cast<::OutlineItem *>(kid), m_data->documentData}});
       }
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 7e7193d..6c66640 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -362,7 +362,7 @@
 
   if ( popplerLink )
   {
-    const GooList<::LinkAction*> *nextActions = a->nextActions();
+    const std::vector<::LinkAction*> *nextActions = a->nextActions();
     if ( nextActions )
     {
       QVector<Link *> links;
diff --git a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc
index 9fb230e..941c603 100644
--- a/qt5/src/poppler-private.cc
+++ b/qt5/src/poppler-private.cc
@@ -282,7 +282,7 @@
     }
 
 
-    void DocumentData::addTocChildren( QDomDocument * docSyn, QDomNode * parent, const GooList<OutlineItem*> * items )
+    void DocumentData::addTocChildren( QDomDocument * docSyn, QDomNode * parent, const std::vector<::OutlineItem*> * items )
     {
         for ( std::size_t i = 0; i < items->size(); ++i )
         {
@@ -308,7 +308,7 @@
 
             // 3. recursively descend over children
             outlineItem->open();
-            const GooList<OutlineItem*> * children = outlineItem->getKids();
+            const std::vector<::OutlineItem*> * children = outlineItem->getKids();
             if ( children )
                 addTocChildren( docSyn, &item, children );
         }
diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h
index 47df701..659900d 100644
--- a/qt5/src/poppler-private.h
+++ b/qt5/src/poppler-private.h
@@ -124,7 +124,7 @@
 	DocumentData(const DocumentData &) = delete;
 	DocumentData& operator=(const DocumentData &) = delete;
 	
-	void addTocChildren( QDomDocument * docSyn, QDomNode * parent, const GooList<OutlineItem*> * items );
+	void addTocChildren( QDomDocument * docSyn, QDomNode * parent, const std::vector<::OutlineItem*> * items );
 	
 	void setPaperColor(const QColor &color)
 	{
diff --git a/splash/Splash.cc b/splash/Splash.cc
index 6be2477..2ab7963 100644
--- a/splash/Splash.cc
+++ b/splash/Splash.cc
@@ -36,7 +36,6 @@
 #include <math.h>
 #include "goo/gmem.h"
 #include "goo/GooLikely.h"
-#include "goo/GooList.h"
 #include "poppler/Error.h"
 #include "SplashErrorCodes.h"
 #include "SplashMath.h"
diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc
index 0afa3fc..37e936c 100644
--- a/splash/SplashBitmap.cc
+++ b/splash/SplashBitmap.cc
@@ -46,7 +46,6 @@
 #include "goo/PNGWriter.h"
 #include "goo/TiffWriter.h"
 #include "goo/ImgWriter.h"
-#include "goo/GooList.h"
 
 //------------------------------------------------------------------------
 // SplashBitmap
@@ -54,7 +53,7 @@
 
 SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPadA,
 			   SplashColorMode modeA, bool alphaA,
-			   bool topDown, GooList<GfxSeparationColorSpace*> *separationListA) {
+			   bool topDown, std::vector<GfxSeparationColorSpace*> *separationListA) {
   width = widthA;
   height = heightA;
   mode = modeA;
@@ -124,7 +123,7 @@
   } else {
     alpha = nullptr;
   }
-  separationList = new GooList<GfxSeparationColorSpace*>();
+  separationList = new std::vector<GfxSeparationColorSpace*>();
   if (separationListA != nullptr)
     for (std::size_t i = 0; i < separationListA->size(); i++)
       separationList->push_back((GfxSeparationColorSpace*)( (*separationListA)[i])->copy());
diff --git a/splash/SplashBitmap.h b/splash/SplashBitmap.h
index 4ad9b62..fb06684 100644
--- a/splash/SplashBitmap.h
+++ b/splash/SplashBitmap.h
@@ -51,7 +51,7 @@
   // upside-down, i.e., with the last row first in memory.
   SplashBitmap(int widthA, int heightA, int rowPad,
 	       SplashColorMode modeA, bool alphaA,
-	       bool topDown = true, GooList<GfxSeparationColorSpace*> *separationList = nullptr);
+	       bool topDown = true, std::vector<GfxSeparationColorSpace*> *separationList = nullptr);
   static SplashBitmap *copy(SplashBitmap *src);
 
   ~SplashBitmap();
@@ -67,7 +67,7 @@
   SplashColorMode getMode() { return mode; }
   SplashColorPtr getDataPtr() { return data; }
   unsigned char *getAlphaPtr() { return alpha; }
-  GooList<GfxSeparationColorSpace*> *getSeparationList() { return separationList; }
+  std::vector<GfxSeparationColorSpace*> *getSeparationList() { return separationList; }
 
   SplashError writePNMFile(char *fileName);
   SplashError writePNMFile(FILE *f);
@@ -117,7 +117,7 @@
   SplashColorPtr data;		// pointer to row zero of the color data
   unsigned char *alpha;		// pointer to row zero of the alpha data
 				//   (always top-down)
-  GooList<GfxSeparationColorSpace*> *separationList; // list of spot colorants and their mapping functions
+  std::vector<GfxSeparationColorSpace*> *separationList; // list of spot colorants and their mapping functions
 
   friend class Splash;
 
diff --git a/test/perf-test.cc b/test/perf-test.cc
index a9573af..109d3f6 100644
--- a/test/perf-test.cc
+++ b/test/perf-test.cc
@@ -51,7 +51,6 @@
 #include "Error.h"
 #include "ErrorCodes.h"
 #include "goo/GooString.h"
-#include "goo/GooList.h"
 #include "goo/GooTimer.h"
 #include "GlobalParams.h"
 #include "splash/SplashBitmap.h"
diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc
index 721a6f0..1c7416b 100644
--- a/utils/HtmlOutputDev.cc
+++ b/utils/HtmlOutputDev.cc
@@ -59,7 +59,6 @@
 #include <iostream>
 #include "goo/GooString.h"
 #include "goo/gbasename.h"
-#include "goo/GooList.h"
 #include "goo/gbase64.h"
 #include "goo/gbasename.h"
 #include "UnicodeMap.h"
@@ -279,7 +278,7 @@
   yxCur1 = yxCur2 = nullptr;
   fonts=new HtmlFontAccu();
   links=new HtmlLinks();
-  imgList=new GooList<HtmlImage*>();
+  imgList=new std::vector<HtmlImage*>();
   pageWidth=0;
   pageHeight=0;
   fontsPageMarker = 0;
@@ -1102,7 +1101,7 @@
   needClose = false;
   pages = new HtmlPage(rawOrder);
   
-  glMetaVars = new GooList<HtmlMetaVar*>();
+  glMetaVars = new std::vector<HtmlMetaVar*>();
   glMetaVars->push_back(new HtmlMetaVar("generator", "pdftohtml 0.36"));
   if( author ) glMetaVars->push_back(new HtmlMetaVar("author", author));
   if( keywords ) glMetaVars->push_back(new HtmlMetaVar("keywords", keywords));
@@ -1693,7 +1692,7 @@
 	if (!outline)
 		return false;
 
-	const GooList<OutlineItem*> *outlines = outline->getItems();
+	const std::vector<OutlineItem*> *outlines = outline->getItems();
 	if (!outlines)
 		return false;
   
@@ -1750,7 +1749,7 @@
 	return true;
 }
 
-bool HtmlOutputDev::newHtmlOutlineLevel(FILE *output, const GooList<OutlineItem*> *outlines, int level)
+bool HtmlOutputDev::newHtmlOutlineLevel(FILE *output, const std::vector<OutlineItem*> *outlines, int level)
 {
 	bool atLeastOne = false;
 
@@ -1818,7 +1817,7 @@
 	return atLeastOne;
 }
 
-void HtmlOutputDev::newXmlOutlineLevel(FILE *output, const GooList<OutlineItem*> *outlines)
+void HtmlOutputDev::newXmlOutlineLevel(FILE *output, const std::vector<OutlineItem*> *outlines)
 {
     fputs("<outline>\n", output);
 
diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h
index e5e34d2..c9fe69c 100644
--- a/utils/HtmlOutputDev.h
+++ b/utils/HtmlOutputDev.h
@@ -35,7 +35,6 @@
 #define HTMLOUTPUTDEV_H
 
 #include <stdio.h>
-#include "goo/GooList.h"
 #include "goo/gbasename.h"
 #include "GfxFont.h"
 #include "OutputDev.h"
@@ -187,7 +186,7 @@
   int fontsPageMarker; 
   HtmlFontAccu *fonts;
   HtmlLinks *links; 
-  GooList<HtmlImage*> *imgList;
+  std::vector<HtmlImage*> *imgList;
   
   GooString *DocName;
   int pageWidth;
@@ -322,8 +321,8 @@
   GooString* getLinkDest(AnnotLink *link);
   void dumpMetaVars(FILE *);
   void doFrame(int firstPage);
-  bool newHtmlOutlineLevel(FILE *output, const GooList<OutlineItem*> *outlines, int level = 1);
-  void newXmlOutlineLevel(FILE *output, const GooList<OutlineItem*> *outlines);
+  bool newHtmlOutlineLevel(FILE *output, const std::vector<OutlineItem*> *outlines, int level = 1);
+  void newXmlOutlineLevel(FILE *output, const std::vector<OutlineItem*> *outlines);
   int getOutlinePageNum(OutlineItem *item);
   void drawJpegImage(GfxState *state, Stream *str);
   void drawPngImage(GfxState *state, Stream *str, int width, int height,
@@ -345,7 +344,7 @@
   int maxPageHeight;
   GooString *Docname;
   GooString *docTitle;
-  GooList<HtmlMetaVar*> *glMetaVars;
+  std::vector<HtmlMetaVar*> *glMetaVars;
   Catalog *catalog;
   Page *docPage;
   std::vector<std::string> backgroundImages;
diff --git a/utils/pdfdetach.cc b/utils/pdfdetach.cc
index 3ec155c..0648478 100644
--- a/utils/pdfdetach.cc
+++ b/utils/pdfdetach.cc
@@ -28,7 +28,6 @@
 #include <poppler-config.h>
 #include <stdio.h>
 #include "goo/gmem.h"
-#include "goo/GooList.h"
 #include "parseargs.h"
 #include "Annot.h"
 #include "GlobalParams.h"
diff --git a/utils/pdffonts.cc b/utils/pdffonts.cc
index 26be4b9..97ee7ab 100644
--- a/utils/pdffonts.cc
+++ b/utils/pdffonts.cc
@@ -164,7 +164,7 @@
   // get the fonts
   {
     FontInfoScanner scanner(doc, firstPage - 1);
-    GooList<FontInfo*> *fonts = scanner.scan(lastPage - firstPage + 1);
+    std::vector<FontInfo*> *fonts = scanner.scan(lastPage - firstPage + 1);
 
     if (showSubst) {
       // print the font substitutions
diff --git a/utils/printencodings.cc b/utils/printencodings.cc
index 841bcde..92355cb 100644
--- a/utils/printencodings.cc
+++ b/utils/printencodings.cc
@@ -18,15 +18,16 @@
  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include <algorithm>
+
 #include "printencodings.h"
 
 #include "GlobalParams.h"
-#include "goo/GooList.h"
 #include "goo/GooString.h"
 
 void printEncodings()
 {
-  GooList<GooString*> *encNames = globalParams->getEncodingNames();
+  std::vector<GooString*> *encNames = globalParams->getEncodingNames();
 
   std::sort(encNames->begin(), encNames->end(), [](void *lhs, void *rhs) {
     return static_cast<GooString *>(lhs)->cmp(static_cast<GooString *>(rhs)) < 0;
