diff --git a/Esotericbot/Chanop.hs b/Esotericbot/Chanop.hs
--- a/Esotericbot/Chanop.hs
+++ b/Esotericbot/Chanop.hs
@@ -3,7 +3,6 @@
 
 import Data.Attoparsec
 import Data.List.Stream as L
-import Data.Time
 import Data.Map as M
 import Data.ByteString.Unsafe
 
diff --git a/esotericbot.cabal b/esotericbot.cabal
--- a/esotericbot.cabal
+++ b/esotericbot.cabal
@@ -1,5 +1,5 @@
 Name:			esotericbot
-Version:		0.0.4
+Version:		0.0.5
 License:		BSD3
 License-File:		License
 Author:			John Morrice <spoon@killersmurf.com>
@@ -59,7 +59,7 @@
 
 Homepage:		http://www.killersmurf.com/projects/esotericbot
 
-Build-Depends:		base , bytestring , mtl , attoparsec , network , stream-fusion , stm , containers==0.2.0.0 , time , tuple , unix , directory 
+Build-Depends:		base , bytestring , mtl , attoparsec , network , stream-fusion , stm , containers==0.2.0.0 , tuple , unix , directory , fgl 
 Cabal-Version:		>= 1.6
 Other-Modules:		Esotericbot.BSH 
           		Esotericbot.BSUtils 
diff --git a/hs_plugins/SK.hs b/hs_plugins/SK.hs
--- a/hs_plugins/SK.hs
+++ b/hs_plugins/SK.hs
@@ -1,14 +1,13 @@
-{-# OPTIONS -XScopedTypeVariables #-}
-
 import Text.ParserCombinators.Parsec
 
 import System.Environment
 
-import Data.List
+import Data.List.Stream as L
 import Data.Maybe
 import Data.Graph.Inductive
 import qualified Data.Foldable as F
 
+import Control.Monad.Stream as C
 import Control.Monad.State
 import Control.Arrow
 
@@ -30,7 +29,7 @@
 
 instance Show SKstr where
    show ( SKstr sks ) =
-      "(" ++ ( concat $ map show sks ) ++ ")"
+      "(" L.++ ( L.concat $ L.map show sks ) L.++ ")"
    show ( ASK sk ) =
       show sk
 
@@ -60,11 +59,11 @@
             [ skstr ]
 
 simplify ( SKstr sks ) =
-   if length sks == 1
+   if L.length sks == 1
       then
-         simplify $ head sks
+         simplify $ L.head sks
       else
-         SKstr $ map simplify sks
+         SKstr $ L.map simplify sks
 simplify x =
    x 
 
@@ -73,9 +72,9 @@
    maybe next
          ( \ ( sk , p ) -> do
             input <- suck_input sk p [ ]
-            if length input >= suck_level sk
+            if L.length input >= suck_level sk
                then do
-                  sub first red ( snd $ head p , snd $ head $ tail p ) sk input
+                  sub first red ( snd $ L.head p , snd $ L.head $ L.tail p ) sk input
                   eval False red n False
                else
                   next
@@ -96,7 +95,7 @@
           ( x , _ ) <- valueOf a
           case x of
              App ->
-                putGr $ insEdges ( inn oldgr n ++ ( mkEdgesFrom n $ out oldgr a ) ) $ insNode ( n , x ) $ delNode n g
+                putGr $ insEdges ( inn oldgr n L.++ ( mkEdgesFrom n $ out oldgr a ) ) $ insNode ( n , x ) $ delNode n g
              _ ->
                 putGr $ insEdges ( inn oldgr n ) $ insNode ( n , x ) $ delNode n g
    case sk of
@@ -143,7 +142,7 @@
             _ ->
                return ( )
    where
-   mkEdgesFrom n es = map ( \ ( _ , to , v ) -> ( n , to , v ) ) es 
+   mkEdgesFrom n es = L.map ( \ ( _ , to , v ) -> ( n , to , v ) ) es 
 
 cloneNode from to = do
    gr <- getGr
@@ -156,21 +155,21 @@
    case skstr of
       SKstr sks -> do
          putGr $ insNode ( n , App ) gr 
-         mapM_ ( joinToNode n ) sks 
+         C.mapM_ ( joinToNode n ) sks 
       ASK x ->
          putGr $ insNode ( n , x ) gr
    where
    joinToNode n sk = do
       gr <- getGr
       ( _ , seq ) <- valueOf n
-      let newEdge = if null seq
+      let newEdge = if L.null seq
                        then 0 
-                       else fst ( maximum seq ) + 1
-          newNode = head $ newNodes 1 gr
+                       else fst ( L.maximum seq ) + 1
+          newNode = L.head $ newNodes 1 gr
       case sk of
          SKstr sks -> do
             putGr $ insEdge ( n , newNode , newEdge ) $ insNode ( newNode , App ) gr
-            mapM_ ( joinToNode newNode ) sks
+            C.mapM_ ( joinToNode newNode ) sks
          ASK x -> do
             putGr $ insEdge ( n , newNode , newEdge ) $ insNode ( newNode , x ) gr
 
@@ -178,7 +177,7 @@
    ( sk , seq ) <- valueOf n
    case sk of
       App -> do
-         linkedVals <- mapM node_to_str $ map snd seq
+         linkedVals <- C.mapM node_to_str $ L.map snd seq
          return $ SKstr linkedVals
       _ ->
          return $ ASK sk
@@ -189,19 +188,19 @@
    in
    case sk of
       App ->
-         foldr cleanupNode withoutn $ map snd seq
+         L.foldr cleanupNode withoutn $ L.map snd seq
       _ ->
          withoutn
          
                
 sk_panic msg =
-   error $ unlines [ "SK panic!  The possible happened!!!1"
+   error $ L.unlines [ "SK panic!  The possible happened!!!1"
                    , msg
                    ]
 
 valueOf a = do
    gr <- getGr
-   maybe ( sk_panic $ "Lookup for node " ++ show a ++ " failed!" )
+   maybe ( sk_panic $ "Lookup for node " L.++ show a L.++ " failed!" )
          ( \ ( _ , _ , sk , sks ) -> return ( sk , sort sks ) )
          ( fst $ match a gr )
    
@@ -211,7 +210,7 @@
       then do
          ms <- suck_one p
          maybe ( return sucked ) 
-               ( \ ( newp , s ) -> suck_input sk newp $ sucked ++ [ s ] )
+               ( \ ( newp , s ) -> suck_input sk newp $ sucked L.++ [ s ] )
                ms
       else
          return sucked
@@ -238,32 +237,32 @@
 
 find_term n = do
    terms <- first_terms ( Nothing , 0 ) [ ]
-   if length terms > n
+   if L.length terms > n
       then
-         return $ Just $ terms !! n
+         return $ Just $ terms L.!! n
       else
          return Nothing
 
 first_terms :: ( Maybe Int , Int ) -> [ ( Maybe Int , Int ) ] -> SKM [ ( SK , [ ( Maybe Int , Int ) ] ) ]
 first_terms addr@( maybe_edge , n ) path = do
    ( sk , sequence ) <- valueOf n    
-   skterm ( if null sequence
+   skterm ( if L.null sequence
                then
                   return [ ] 
                else do
-                  ( nVal , _ ) <- valueOf $ snd $ head sequence
+                  ( nVal , _ ) <- valueOf $ snd $ L.head sequence
                   skterm ( do
-                            let tovisit = map ( first Just ) sequence
-                            ts <- mapM ( flip first_terms ( addr : path ) ) tovisit
-                            let just_ts = concat ts
-                            if null just_ts
+                            let tovisit = L.map ( first Just ) sequence
+                            ts <- C.mapM ( flip first_terms ( addr : path ) ) tovisit
+                            let just_ts = L.concat ts
+                            if L.null just_ts
                                then
                                   return [ ]
                                else
                                   return just_ts
                          )
                          ( const $ do 
-                            return [ ( nVal , ( first Just $ head sequence ) : addr : path ) ] 
+                            return [ ( nVal , ( first Just $ L.head sequence ) : addr : path ) ] 
                          )
                          nVal
           )
@@ -307,7 +306,7 @@
 
 
 could_suck_more sk sucked =
-   if length sucked >= suck_level sk
+   if L.length sucked >= suck_level sk
       then
          False             
       else
@@ -315,7 +314,7 @@
 main = do
    prog <- getContents
    args <- getArgs
-   exec_sk ( not $ null args ) prog
+   exec_sk ( not $ L.null args ) prog
 
 exec_sk red skprog = do
    ( _ , skgr ) <- parse_sk skprog
@@ -324,7 +323,7 @@
  
 output_sk_strs :: [ SKstr] -> IO ( )
 output_sk_strs sk_strs = do
-   putStrLn $ concat $ map show sk_strs
+   putStrLn $ L.concat $ L.map show sk_strs
  
 parse_sk sk = do
    name <- getProgName
