diff --git a/pom.xml b/pom.xml
index a7d6b9d060a77c12d1c81c38ef77df0ef93a18f5..3c619a560ad4762f7d200ca70a9ce4c8134fa671 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
 	<artifactId>sambox</artifactId>
 	<packaging>jar</packaging>
 	<name>sambox</name>
-	<version>2.3.1</version>
+	<version>2.3.4</version>
 
 	<description>An Apache PDFBox fork intended to be used as PDF processor for Sejda and PDFsam related projects</description>
 	<url>http://www.sejda.org</url>
@@ -33,7 +33,7 @@
 		<connection>scm:git:git@github.com:torakiki/sambox.git</connection>
 		<developerConnection>scm:git:git@github.com:torakiki/sambox.git</developerConnection>
 		<url>scm:git:git@github.com:torakiki/sambox.git</url>
-		<tag>v2.3.1</tag>
+		<tag>v2.3.4</tag>
 	</scm>
 
 	<developers>
diff --git a/src/main/java/org/sejda/sambox/pdmodel/PDPageTree.java b/src/main/java/org/sejda/sambox/pdmodel/PDPageTree.java
index 973db7e679cefc241d2972dffd77341eef66ed9f..93f0ad38ad57765a141830577888a50f725a6686 100644
--- a/src/main/java/org/sejda/sambox/pdmodel/PDPageTree.java
+++ b/src/main/java/org/sejda/sambox/pdmodel/PDPageTree.java
@@ -470,7 +470,7 @@ public class PDPageTree implements COSObjectable, Iterable<PDPage>
     public void remove(int index)
     {
         PageAndPageTreeParent res = get(index + 1, root, 0, null);
-        remove(res.node);
+        remove(res.node, res.parent);
     }
 
     /**
@@ -487,14 +487,32 @@ public class PDPageTree implements COSObjectable, Iterable<PDPage>
      * Removes the given COS page.
      */
     private void remove(COSDictionary node)
+    {
+        remove(node, null);
+    }
+
+    /**
+     * Removes the given COS page.
+     */
+    private void remove(COSDictionary node, COSDictionary knownParent)
     {
         // remove from parent's kids
         COSDictionary parent = node.getDictionaryObject(COSName.PARENT, COSName.P,
                 COSDictionary.class);
+        
+        if(parent == null)
+        {
+            // broken node with missing PARENT, use the one known from traversing the page tree
+            parent = knownParent;
+        }
+        
         COSArray kids = parent.getDictionaryObject(COSName.KIDS, COSArray.class);
         if (kids.removeObject(node))
         {
             // update ancestor counts
+            parent.setInt(COSName.COUNT, parent.getInt(COSName.COUNT) - 1);
+            node = parent;
+            
             do
             {
                 node = node.getDictionaryObject(COSName.PARENT, COSName.P, COSDictionary.class);
diff --git a/src/main/java/org/sejda/sambox/pdmodel/common/PDNameTreeNode.java b/src/main/java/org/sejda/sambox/pdmodel/common/PDNameTreeNode.java
index b98ba977ce091e05a049f05dcf074890b1931909..ac1f04856618dc840873d838e9947eef03f66abc 100644
--- a/src/main/java/org/sejda/sambox/pdmodel/common/PDNameTreeNode.java
+++ b/src/main/java/org/sejda/sambox/pdmodel/common/PDNameTreeNode.java
@@ -246,7 +246,7 @@ public abstract class PDNameTreeNode<T extends COSObjectable> implements COSObje
                 return names.get(name);
             }
         }
-        catch (IOException e)
+        catch (IOException | ClassCastException e)
         {
             LOG.warn("NameTreeNode couldn't get the names map", e);
         }
diff --git a/src/main/java/org/sejda/sambox/pdmodel/graphics/shading/AxialShadingContext.java b/src/main/java/org/sejda/sambox/pdmodel/graphics/shading/AxialShadingContext.java
index e0e3b60cc1826d3f5f8c808a59b107a32b8d80a1..e71098a3479dc1e0174b5b74695579fbd24a6176 100644
--- a/src/main/java/org/sejda/sambox/pdmodel/graphics/shading/AxialShadingContext.java
+++ b/src/main/java/org/sejda/sambox/pdmodel/graphics/shading/AxialShadingContext.java
@@ -115,6 +115,7 @@ public class AxialShadingContext extends ShadingContext implements PaintContext
         {
             LOG.error(ex.getMessage() + ", matrix: " + matrix, ex);
             LOG.error(ex.getMessage(), ex);
+            rat = new AffineTransform();
         }
 
         // shading space -> device space
diff --git a/src/main/java/org/sejda/sambox/pdmodel/interactive/form/PDButton.java b/src/main/java/org/sejda/sambox/pdmodel/interactive/form/PDButton.java
index 5d0211dd94db9c91e6c72bd3d15f050d9816c064..085a370a1cb380a2a2ee2fd97c22f549d18bd218 100644
--- a/src/main/java/org/sejda/sambox/pdmodel/interactive/form/PDButton.java
+++ b/src/main/java/org/sejda/sambox/pdmodel/interactive/form/PDButton.java
@@ -441,12 +441,6 @@ public abstract class PDButton extends PDTerminalField
         List<String> options = getExportValues();
         Set<String> uniqueOptions = new HashSet<>(options);
 
-        if (widgets.size() != options.size() && uniqueOptions.size() > 1)
-        {
-            throw new IllegalArgumentException(
-                    "The number of options doesn't match the number of widgets");
-        }
-
         if (value.equals(COSName.Off.getName()))
         {
             updateByValue(value);
@@ -465,8 +459,16 @@ public abstract class PDButton extends PDTerminalField
                 if (onValue != null)
                 {
                     updateByValue(onValue);
+                    return;
                 }
             }
+
+            // we reach here if update failed
+            if (widgets.size() != options.size() && uniqueOptions.size() > 1)
+            {
+                throw new IllegalArgumentException(
+                        "The number of options doesn't match the number of widgets");
+            }
         }
     }
 }