diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
index 6b9929e..3e8d5dd 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
@@ -110,24 +110,22 @@
     }
 
     protected static void rotate(int rotation, PDRectangle viewBox, AffineTransform atdoc) {
-        float x = viewBox.getWidth() + viewBox.getLowerLeftX();
-        float y = viewBox.getHeight() + viewBox.getLowerLeftY();
+        float w = viewBox.getWidth();
+        float h = viewBox.getHeight();
+        float x = viewBox.getLowerLeftX();
+        float y = viewBox.getLowerLeftY();
         switch (rotation) {
             case 90:
-                atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
-                atdoc.translate(0, viewBox.getWidth());
-                atdoc.rotate(-Math.PI / 2.0);
-                atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
+                atdoc.rotate(Math.toRadians(rotation + 180), x, y);
+                atdoc.translate(-h, 0);
                 break;
             case 180:
-                atdoc.translate(x, y);
-                atdoc.rotate(-Math.PI);
-                atdoc.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
+                atdoc.translate(w, h);
+                atdoc.rotate(Math.toRadians(rotation), x, y);
                 break;
             case 270:
-                atdoc.translate(viewBox.getLowerLeftX(), y);
-                atdoc.rotate(Math.toRadians(270 + 180));
-                atdoc.translate(-x, -y);
+                atdoc.rotate(Math.toRadians(rotation + 180), x, h + y);
+                atdoc.translate(-w, 0);
                 break;
             default:
                 //no additional transformations necessary
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 54c460d..eda1af7 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -84,7 +84,6 @@
 import junit.framework.Assert;
 
 public class PDFBoxAdapterTestCase {
-    private Rectangle2D r = new Rectangle2D.Double();
     protected static final String CFF1 = "test/resources/2fonts.pdf";
     protected static final String CFF2 = "test/resources/2fonts2.pdf";
     protected static final String CFF3 = "test/resources/simpleh.pdf";
@@ -109,9 +108,14 @@
     private static final String XFORM = "test/resources/xform.pdf";
     private static final String LOOP = "test/resources/loop.pdf";
 
-    private PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
+    private static PDFPage getPDFPage(PDFDocument doc) {
+        final Rectangle2D r = new Rectangle2D.Double();
+        return new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+    }
+
+    protected static PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
         PDFDocument doc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(doc);
         doc.setMergeFontsEnabled(mergeFonts);
         pdfpage.setDocument(doc);
         pdfpage.setObjectNumber(1);
@@ -187,27 +191,9 @@
     }
 
     @Test
-    public void testStream() throws Exception {
-        PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
-        pdfpage.setDocument(pdfdoc);
-        PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
-        PDDocument doc = PDDocument.load(new File(ROTATE));
-        PDPage page = doc.getDocumentCatalog().getPages().get(0);
-        AffineTransform at = new AffineTransform();
-        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
-        String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
-        Assert.assertEquals(at, new AffineTransform(-0.0, 1.0000000554888686, 1.0000000554888686, 0.0, 0.0,
-                -2.0742416381835938E-5));
-        Assert.assertTrue(stream.contains("/GS0106079 gs"));
-        Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
-        doc.close();
-    }
-
-    @Test
     public void testTaggedPDFWriter() throws IOException {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
         adapter.setCurrentMCID(5);
@@ -223,7 +209,7 @@
     @Test
     public void testAnnot() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
@@ -258,7 +244,7 @@
     @Test
     public void testLink() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -280,7 +266,7 @@
         PDFDocument pdfdoc = new PDFDocument("");
         pdfdoc.getFilterMap().put(PDFFilterList.DEFAULT_FILTER, Collections.singletonList("null"));
         pdfdoc.setMergeFontsEnabled(true);
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         pdfpage.setObjectNumber(1);
         Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -396,7 +382,7 @@
         PDDocument doc = PDDocument.load(new File(SHADING));
         ImagePDF img = new ImagePDF(imgi, doc);
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfpage.setDocument(pdfdoc);
         PDFGState g = new PDFGState();
         pdfdoc.assignObjectNumber(g);
@@ -417,7 +403,7 @@
     @Test
     public void testPDFCache() throws IOException {
         PDFDocument pdfdoc = new PDFDocument("");
-        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        PDFPage pdfpage = getPDFPage(pdfdoc);
         pdfdoc.assignObjectNumber(pdfpage);
         pdfpage.setDocument(pdfdoc);
         Map<Object, Object> pdfCache = new HashMap<Object, Object>();
diff --git a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
index 700d1fc..874b705 100644
--- a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
@@ -19,7 +19,11 @@
 
 package org.apache.fop.render.pdf;
 
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.io.File;
+import java.io.IOException;
 
 import org.junit.Test;
 
@@ -34,6 +38,7 @@
 
 import org.apache.fop.render.pdf.pdfbox.ImageConverterPDF2G2D;
 import org.apache.fop.render.pdf.pdfbox.ImagePDF;
+import org.apache.fop.render.pdf.pdfbox.PDFBoxAdapter;
 import org.apache.fop.render.pdf.pdfbox.PSPDFGraphics2D;
 
 import junit.framework.Assert;
@@ -58,4 +63,27 @@
         ig.getGraphics2DImagePainter().paint(g2d, rect);
         Assert.assertEquals(g2d.getTransform().getShearX(), 0.16339869281045735);
     }
+
+    @Test
+    public void testAngle() throws IOException {
+        Assert.assertEquals(getTransform(90), new AffineTransform(0, 1, 1, 0, 0, 0));
+        Assert.assertEquals(getTransform(270), new AffineTransform(0, -1, -1, 0, 842, 595));
+        AffineTransform at = getTransform(180);
+        Assert.assertEquals((int)at.getTranslateX(), 842);
+        Assert.assertEquals(at.getTranslateY(), 0.0);
+    }
+
+    private AffineTransform getTransform(int angle) throws IOException {
+        PDFBoxAdapter adapter = PDFBoxAdapterTestCase.getPDFBoxAdapter(false);
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.ROTATE));
+        PDPage page = doc.getDocumentCatalog().getPages().get(0);
+        page.setRotation(angle);
+        AffineTransform at = new AffineTransform();
+        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+        String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+        Assert.assertTrue(stream.contains("/GS0106079 gs"));
+        Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
+        doc.close();
+        return at;
+    }
 }
