diff --git a/hs-src/Language/Scheme/Core.hs b/hs-src/Language/Scheme/Core.hs
--- a/hs-src/Language/Scheme/Core.hs
+++ b/hs-src/Language/Scheme/Core.hs
@@ -807,11 +807,13 @@
 
 evalfuncCallCC [cont@(Continuation _ _ _ _ _), func] = do
    case func of
+     Continuation _ _ _ _ _ -> apply cont func [cont] 
      PrimitiveFunc f -> do
          result <- liftThrows $ f [cont]
          case cont of
              Continuation cEnv _ _ _ _ -> continueEval cEnv cont result
              _ -> return result
+     Func _ (Just _) _ _ -> apply cont func [cont] -- Variable # of args (pair). Just call into cont
      Func aparams _ _ _ ->
        if (toInteger $ length aparams) == 1
          then apply cont func [cont]
diff --git a/hs-src/Language/Scheme/FFI.hs b/hs-src/Language/Scheme/FFI.hs
--- a/hs-src/Language/Scheme/FFI.hs
+++ b/hs-src/Language/Scheme/FFI.hs
@@ -94,8 +94,10 @@
 
 defaultRunGhc :: GHC.Ghc a -> IO a
 defaultRunGhc =
-#if __GLASGOW_HASKELL__ < 720
+#if __GLASGOW_HASKELL__ <= 700
+  -- Old syntax for GHC 7.0.x and lower
   GHC.defaultErrorHandler DynFlags.defaultDynFlags . GHC.runGhc (Just GHC.Paths.libdir)
 #else
+  -- New syntax in GHC 7.2
   GHC.defaultErrorHandler DynFlags.defaultLogAction . GHC.runGhc (Just GHC.Paths.libdir)
 #endif
diff --git a/hs-src/shell.hs b/hs-src/shell.hs
--- a/hs-src/shell.hs
+++ b/hs-src/shell.hs
@@ -67,8 +67,8 @@
   putStrLn " | | | | |_| \\__ \\   <    /// \\\\\\   \\__ \\ (__| | | |  __/ | | | | |  __/ "
   putStrLn " |_| |_|\\__,_|___/_|\\_\\  ///   \\\\\\  |___/\\___|_| |_|\\___|_| |_| |_|\\___| "
   putStrLn "                                                                         "
-  putStrLn " husk Scheme Interpreter                                   Version 3.4.3 "
-  putStrLn " (c) 2010-2011 Justin Ethier         github.com/justinethier/husk-scheme "
+  putStrLn " http://justinethier.github.com/husk-scheme                Version 3.4.4 "
+  putStrLn " (c) 2010-2011 Justin Ethier                                             "
   putStrLn "                                                                         "
 
 runRepl :: IO ()
diff --git a/husk-scheme.cabal b/husk-scheme.cabal
--- a/husk-scheme.cabal
+++ b/husk-scheme.cabal
@@ -1,5 +1,5 @@
 Name:                husk-scheme
-Version:             3.4.3
+Version:             3.4.4
 Synopsis:            R5RS Scheme interpreter program and library.
 Description:         A dialect of R5RS Scheme written in Haskell. Provides advanced 
                      features including continuations, hygienic macros, a Haskell FFI,
diff --git a/stdlib.scm b/stdlib.scm
--- a/stdlib.scm
+++ b/stdlib.scm
@@ -107,7 +107,19 @@
 (define-syntax cond
   (syntax-rules (else =>)
     ((cond (else result1 result2 ...))
-     (begin result1 result2 ...))
+;
+; TODO: see pitfall 3.2
+;
+; This is a modification from R5RS - we put the begin within
+; an if statement, because in this context definitions are
+; not allowed. This prevents one from interfering with macro
+; hygiene. 
+;
+; TODO: unfortunately the macro logic has not yet been
+; updated to take this into acccount, so the pitfall
+; still fails
+;
+     (if #t (begin result1 result2 ...)))
     ((cond (test => result))
      (let ((temp test))
        (if temp (result temp))))
@@ -139,7 +151,7 @@
        (case atom-key clauses ...)))
     ((case key
        (else result1 result2 ...))
-     (begin result1 result2 ...))
+     (if #t (begin result1 result2 ...)))
     ((case key
        ((atoms ...) result1 result2 ...))
      (if (memv key '(atoms ...))
@@ -201,12 +213,36 @@
             (fold (lambda (a b) (append-2 b a)) (car lst) (cdr lst))))))
 
 ; Let forms
+;
+; letrec from R5RS
 (define-syntax letrec
-  (syntax-rules ()
-    ((_ ((x v) ...) e1 e2 ...)
-     (let () 
-       (define x v) ...
-       (let () e1 e2 ...)))))
+    (syntax-rules ()
+      ((letrec ((var1 init1) ...) body ...)
+       (letrec "generate_temp_names"
+         (var1 ...)
+         ()
+         ((var1 init1) ...)
+         body ...))
+      ((letrec "generate_temp_names"
+         ()
+         (temp1 ...)
+         ((var1 init1) ...)
+         body ...)                         ; start the changed code
+       (let ((var1 #f) ...)
+         (let ((temp1 init1) ...)
+           (set! var1 temp1)
+           ...
+           body ...)))
+      ((letrec "generate_temp_names"
+         (x y ...)
+         (temp ...)
+         ((var1 init1) ...)
+         body ...)
+       (letrec "generate_temp_names"
+         (y ...)
+         (newtemp temp ...)
+         ((var1 init1) ...)
+         body ...))))
 
 ; let and named let (using the Y-combinator):
 (define-syntax let
