diff --git a/Direct/Graph.hs b/Direct/Graph.hs
--- a/Direct/Graph.hs
+++ b/Direct/Graph.hs
@@ -3,52 +3,42 @@
 import Data.View
 import GraphRewriting.Graph
 import GraphRewriting.Graph.Write
-import GraphRewriting.Pattern.InteractionNet
 import qualified Common.Term as Term
 
 
 -- <chunk: node_type>
 data SKI
-	= S {inp ∷ Port}
-	| K {inp ∷ Port}
-	| I {inp ∷ Port}
-	| Applicator {inp, out1, out2 ∷ Port}
-	| Duplicator {inp1, inp2, out ∷ Port}
-	| Eraser {inp ∷ Port}
-	| Variable {inp ∷ Port, name ∷ String}
-	| Root {out ∷ Port}
+	=  S           {inp ∷ Port}
+	|  K           {inp ∷ Port}
+	|  I           {inp ∷ Port}
+	|  Applicator  {inp, out1, out2 ∷ Port}
+	|  Duplicator  {inp1, inp2, out ∷ Port}
+	|  Eraser      {inp ∷ Port}
+	|  Variable    {inp ∷ Port, name ∷ String}
+	|  Root        {out ∷ Port}
 -- </chunk: node_type>
 
+-- <chunk: view_ports>
 instance View [Port] SKI where
 	inspect ski = case ski of
-		S {inp = i}                                → [i]
-		K {inp = i}                                → [i]
-		I {inp = i}                                → [i]
-		Applicator {inp = i, out1 = o1, out2 = o2} → [i,o1,o2]
-		Duplicator {inp1 = i1, inp2 = i2, out = o} → [i1,i2,o]
-		Eraser {inp = i}                           → [i]
-		Variable {inp = i}                         → [i]
-		Root {out = o}                             → [o]
+		S           {inp = i}                        → [i]
+		K           {inp = i}                        → [i]
+		I           {inp = i}                        → [i]
+		Applicator  {inp = i, out1 = o1, out2 = o2}  → [i,o1,o2]
+		Duplicator  {inp1 = i1, inp2 = i2, out = o}  → [i1,i2,o]
+		Eraser      {inp = i}                        → [i]
+		Variable    {inp = i}                        → [i]
+		Root        {out = o}                        → [o]
 	update ports ski = case ski of
-		S {} → ski {inp = i}                                 where [i]       = ports
-		K {} → ski {inp = i}                                 where [i]       = ports
-		I  {} → ski {inp = i}                                where [i]       = ports
-		Applicator  {} → ski {inp = i, out1 = o1, out2 = o2} where [i,o1,o2] = ports
-		Duplicator  {} → ski {inp1 = i1, inp2 = i2, out = o} where [i1,i2,o] = ports
-		Eraser  {} → ski {inp = i}                           where [i]       = ports
-		Variable  {} → ski {inp = i}                         where [i]       = ports
-		Root  {} → ski {out = o}                             where [o]       = ports
-
-instance INet SKI where
-	principalPort ski = case ski of
-		Root {out = o}                             → 0
-		Applicator {inp = i, out1 = o1, out2 = o2} → 1
-		Duplicator {inp1 = i1, inp2 = i2, out = o} → 2
-		Eraser {inp = i}                           → 0
-		Variable {inp = i}                         → 0
-		S {inp = i}                                → 0
-		K {inp = i}                                → 0
-		I {inp = i}                                → 0
+		S           {} → ski {inp = i}                        where [i]        = ports
+		K           {} → ski {inp = i}                        where [i]        = ports
+		I           {} → ski {inp = i}                        where [i]        = ports
+		Applicator  {} → ski {inp = i, out1 = o1, out2 = o2}  where [i,o1,o2]  = ports
+		Duplicator  {} → ski {inp1 = i1, inp2 = i2, out = o}  where [i1,i2,o]  = ports
+		Eraser      {} → ski {inp = i}                        where [i]        = ports
+		Variable    {} → ski {inp = i}                        where [i]        = ports
+		Root        {} → ski {out = o}                        where [o]        = ports
+-- </chunk: view_ports>
 
 fromTerm ∷ Term.Expr → Graph SKI
 fromTerm term = flip execGraph emptyGraph $ do
diff --git a/Direct/Rules.hs b/Direct/Rules.hs
--- a/Direct/Rules.hs
+++ b/Direct/Rules.hs
@@ -3,9 +3,9 @@
 import Prelude.Unicode
 import Direct.Graph
 import GraphRewriting
-import GraphRewriting.Pattern.InteractionNet
 
 
+-- <chunk: rules>
 ruleS ∷ (View [Port] n, View SKI n) ⇒ Rule n 
 ruleS = do
 	S {inp = si} ← node
@@ -21,6 +21,7 @@
 		 Node $ Applicator {inp = r, out1 = g, out2 = rr},
 		 Node $ Duplicator {inp1 = lr, inp2 = rr, out = x}]
 
+-- <chunk: ruleK>
 ruleK ∷ (View [Port] n, View SKI n) ⇒ Rule n 
 ruleK = do
 	K {inp = si} ← node
@@ -29,10 +30,13 @@
 	Applicator {inp = i2, out1 = o2, out2 = y} ← nodeAt i1
 	require (i1 ≡ o2)
 	replace0 [Wire x i2, Node $ Eraser {inp = y}]
+-- </chunk: ruleK>
 
 ruleI ∷ (View [Port] n, View SKI n) ⇒ Rule n
 ruleI = do
-	I {} :-: Applicator {inp = iA, out2 = o2} ← activePair
+	I {inp = iI} ← node
+	Applicator {inp = iA, out2 = o2} ← nodeAt iI
+	require (iI ≡ iA)
 	rewire [[iA,o2]]
 
 combinatorAt ∷ (View [Port] n, View SKI n) ⇒ Edge → Pattern n SKI
@@ -77,3 +81,4 @@
 	if iE ≡ i1
 		then rewire [[oD,i2]]
 		else rewire [[oD,i1]]
+-- <chunk: rules>
diff --git a/graph-rewriting-ski.cabal b/graph-rewriting-ski.cabal
--- a/graph-rewriting-ski.cabal
+++ b/graph-rewriting-ski.cabal
@@ -1,5 +1,5 @@
 Name:           graph-rewriting-ski
-Version:        0.5.2
+Version:        0.5.4
 Copyright:      (c) 2010, Jan Rochel
 License:        BSD3
 License-File:   LICENSE
@@ -13,32 +13,34 @@
 Category:       Graphs, Application
 Cabal-Version:  >= 1.6
 Data-Files:     examples/*.ski examples/combinator_birds/*.ski
-Build-Depends:
-	base >= 4 && < 4.3,
-	base-unicode-symbols >= 0.2 && < 0.3,
-	graph-rewriting >= 0.4.4 && < 0.5,
-	graph-rewriting-layout >= 0.4.2 && < 0.5,
-	graph-rewriting-gl >= 0.6 && < 0.7,
-	parsec >= 2.1 && < 2.2,
-	GLUT >= 2.2 && < 2.3,
-	OpenGL >= 2.4 && < 2.5
 
-Executable:     ski-inet
-Main-Is:        INet/Main.hs
-GHC-Options:    -fno-warn-duplicate-exports -fwarn-unused-imports
-Other-Modules:  Common.GL INet.GL INet.Graph INet.Rules Common.Term
-Extensions:
-	UnicodeSyntax
-	FlexibleInstances
-	FlexibleContexts
-	MultiParamTypeClasses
+Library
+  Build-Depends:
+    base >= 4 && < 4.3,
+    base-unicode-symbols >= 0.2 && < 0.3,
+    graph-rewriting >= 0.4.4 && < 0.5,
+    graph-rewriting-layout >= 0.4.2 && < 0.5,
+    graph-rewriting-gl >= 0.6 && < 0.7,
+    parsec >= 2.1 && < 2.2,
+    GLUT >= 2.2 && < 2.3,
+    OpenGL >= 2.4 && < 2.5
 
-Executable:     ski-direct
-Main-Is:        Direct/Main.hs
-GHC-Options:    -fno-warn-duplicate-exports -fwarn-unused-imports
-Other-Modules:  Common.GL Direct.GL Direct.Graph Direct.Rules Common.Term
-Extensions:
-	UnicodeSyntax
-	FlexibleInstances
-	FlexibleContexts
-	MultiParamTypeClasses
+Executable ski-inet
+  Main-Is:        INet/Main.hs
+  GHC-Options:    -fno-warn-duplicate-exports -fwarn-unused-imports
+  Other-Modules:  Common.GL INet.GL INet.Graph INet.Rules Common.Term
+  Extensions:
+    UnicodeSyntax
+    FlexibleInstances
+    FlexibleContexts
+    MultiParamTypeClasses
+
+Executable ski-direct
+  Main-Is:        Direct/Main.hs
+  GHC-Options:    -fno-warn-duplicate-exports -fwarn-unused-imports
+  Other-Modules:  Common.GL Direct.GL Direct.Graph Direct.Rules Common.Term
+  Extensions:
+    UnicodeSyntax
+    FlexibleInstances
+    FlexibleContexts
+    MultiParamTypeClasses
