pointer attributes
diff --git a/webdriver/tests/perform_actions/conftest.py b/webdriver/tests/perform_actions/conftest.py
index 970f7b7..210bbf3 100644
--- a/webdriver/tests/perform_actions/conftest.py
+++ b/webdriver/tests/perform_actions/conftest.py
@@ -33,6 +33,14 @@
 
 
 @pytest.fixture
+def pen_chain(session):
+    return session.actions.sequence(
+        "pointer",
+        "pointer_id",
+        {"pointerType": "pen"})
+
+
+@pytest.fixture
 def none_chain(session):
     return session.actions.sequence("none", "none_id")
 
diff --git a/webdriver/tests/perform_actions/pointer.py b/webdriver/tests/perform_actions/pointer.py
index ad54692..8b4ecc3 100644
--- a/webdriver/tests/perform_actions/pointer.py
+++ b/webdriver/tests/perform_actions/pointer.py
@@ -115,6 +115,31 @@
     Poll(session, message=error_message).until(lambda s: s.url == destination)
 
 
+def test_pointer_attributes(session, test_actions_page, pen_chain):
+    pointerArea = session.find.css("#pointerArea", all=False)
+    center = get_inview_center(pointerArea.rect, get_viewport_rect(session))
+    pen_chain.pointer_move(0, 0, origin=pointerArea) \
+        .pointer_down(pressure=0.3, twist=80) \
+        .pointer_move(10, 10, origin=pointerArea, pressure=0.6, twist=50) \
+        .pointer_up() \
+        .pointer_move(80, 50, origin=pointerArea) \
+        .perform()
+    events = get_events(session)
+    assert len(events) == 13
+    event_types = [e["type"] for e in events]
+    assert ["pointerover", "pointerenter", "pointermove", "mousemove",
+            "pointerdown", "pointerover", "pointerenter", "pointermove",
+            "pointerup", "pointerout", "pointerleave", "pointerout",
+            "pointerleave"] == event_types
+    for e in events:
+        if e["type"] == "pointerdown":
+            assert e["pageX"] == pytest.approx(center["x"], abs=1.0)
+            assert e["pageY"] == pytest.approx(center["y"], abs=1.0)
+            assert e["target"] == "pointerArea"
+            assert e["pressure"] == 0.3
+            assert e["twist"] == 80
+
+
 @pytest.mark.parametrize("drag_duration", [0, 300, 800])
 @pytest.mark.parametrize("dx, dy", [
     (20, 0), (0, 15), (10, 15), (-20, 0), (10, -15), (-10, -15)
diff --git a/webdriver/tests/perform_actions/support/test_actions_wdspec.html b/webdriver/tests/perform_actions/support/test_actions_wdspec.html
index 0253add..7761fcf 100644
--- a/webdriver/tests/perform_actions/support/test_actions_wdspec.html
+++ b/webdriver/tests/perform_actions/support/test_actions_wdspec.html
@@ -162,6 +162,15 @@
           outer.addEventListener("mouseup", recordPointerEvent);
           outer.addEventListener("contextmenu", recordPointerEvent);
 
+          var pointerArea = document.getElementById("pointerArea");
+          pointerArea.addEventListener("pointerdown", recordPointerEvent);
+          pointerArea.addEventListener("pointermove", recordPointerEvent);
+          pointerArea.addEventListener("pointerup", recordPointerEvent);
+          pointerArea.addEventListener("pointerover", recordPointerEvent);
+          pointerArea.addEventListener("pointerenter", recordPointerEvent);
+          pointerArea.addEventListener("pointerout", recordPointerEvent);
+          pointerArea.addEventListener("pointerleave", recordPointerEvent);
+
           window.addEventListener("mousemove", recordFirstPointerMove);
           //visual cue for mousemove
           var pointer = document.getElementById("trackPointer");
@@ -196,6 +205,11 @@
     </div>
   </div>
   <div>
+    <h2>PointerReporter</h2>
+    <div id="pointerArea" class="area">
+    </div>
+  </div>
+  <div>
     <h2>DragReporter</h2>
     <div id="dragArea" class="area">
       <div id="dragTarget" class="block"></div>