diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2008-2009 Bernard James Pope 
+Copyright (c) 2009-2010 Bernard James Pope (also known as Bernie Pope).
 
 All rights reserved.
 
diff --git a/language-python.cabal b/language-python.cabal
--- a/language-python.cabal
+++ b/language-python.cabal
@@ -1,16 +1,16 @@
 name:                language-python
-version:             0.2
-cabal-version:       >= 1.2
+version:             0.3.0
+cabal-version:       >= 1.6
 synopsis:            Parsing and pretty printing of Python code. 
 description:         language-python is a Haskell library for lexical analysis, parsing 
                      and pretty printing Python code. It supports versions 2.x and 3.x of Python. 
 category:            Language
 license:             BSD3
 license-file:        LICENSE
-copyright:           (c) 2008-2009 Bernard James Pope
-author:              Bernard James Pope 
-maintainer:          bjpop@csse.unimelb.edu.au
-homepage:            http://projects.haskell.org/language-python/
+copyright:           (c) 2008-2010 Bernard James Pope
+author:              Bernard James Pope (Bernie Pope)
+maintainer:          florbitous@gmail.com
+homepage:            http://github.com/bjpop/language-python 
 build-depends:       base
 build-type:          Simple
 stability:           experimental
@@ -19,7 +19,8 @@
 
 Library
    hs-source-dirs:   src
-   build-depends:    base >= 4 && < 5, containers, pretty, array, transformers, monads-tf
+   build-depends:    base == 4.*, containers == 0.2.*, pretty == 1.0.*, array == 0.2.*, transformers == 0.2.*, 
+                     monads-tf == 0.1.*
    build-tools:      happy, alex
    exposed-modules:
       Language.Python.Common
@@ -27,6 +28,7 @@
       Language.Python.Common.SrcLocation
       Language.Python.Common.Pretty
       Language.Python.Common.Token
+      Language.Python.Common.ParserMonad
       Language.Python.Common.PrettyToken
       Language.Python.Common.AST
       Language.Python.Common.PrettyAST
@@ -39,7 +41,6 @@
       Language.Python.Common.PrettyParseError
       Language.Python.Common.StringEscape
    other-modules:
-      Language.Python.Common.ParserMonad
       Language.Python.Common.ParserUtils
       Language.Python.Common.LexerUtils
       Language.Python.Version3.Parser.Parser
diff --git a/src/Language/Python/Common/AST.hs b/src/Language/Python/Common/AST.hs
--- a/src/Language/Python/Common/AST.hs
+++ b/src/Language/Python/Common/AST.hs
@@ -590,7 +590,7 @@
      , expr_annot :: annot
      }
    -- | Subscription, for example \'x [y]\'. 
-   | Subscript { subscriptee :: Expr annot, subscript_exprs :: [Expr annot], expr_annot :: annot }
+   | Subscript { subscriptee :: Expr annot, subscript_expr :: Expr annot, expr_annot :: annot }
    -- | Slicing, for example \'w [x:y:z]\'. 
    | SlicedExpr { slicee :: Expr annot, slices :: [Slice annot], expr_annot :: annot } 
    -- | Conditional expresison. 
diff --git a/src/Language/Python/Common/LexerUtils.hs b/src/Language/Python/Common/LexerUtils.hs
--- a/src/Language/Python/Common/LexerUtils.hs
+++ b/src/Language/Python/Common/LexerUtils.hs
@@ -47,7 +47,8 @@
 dedentation :: P Token -> Action
 dedentation lexToken span _len _str = do
    topIndent <- getIndent
-   case compare (endCol span) topIndent of
+   -- case compare (endCol span) topIndent of
+   case compare (startCol span) topIndent of
       EQ -> do popStartCode
                lexToken 
       LT -> do popIndent
@@ -69,16 +70,18 @@
       then lexToken
       else do 
          topIndent <- getIndent
-         case compare (endCol span) topIndent of
+         -- case compare (endCol span) topIndent of
+         case compare (startCol span) topIndent of
             EQ -> case bo of
                      BOF -> lexToken
                      BOL -> newlineToken   
             LT -> do pushStartCode dedentCode 
                      newlineToken 
-            GT -> do pushIndent (endCol span)
-                     return indentToken 
+            -- GT -> do pushIndent (endCol span)
+            GT -> do pushIndent (startCol span)
+                     return indentToken
    where
-   indentToken = IndentToken span 
+   indentToken = IndentToken span
 
 symbolToken :: (SrcSpan -> Token) -> Action 
 symbolToken mkToken location _ _ = return (mkToken location)
diff --git a/src/Language/Python/Common/ParserMonad.hs b/src/Language/Python/Common/ParserMonad.hs
--- a/src/Language/Python/Common/ParserMonad.hs
+++ b/src/Language/Python/Common/ParserMonad.hs
@@ -74,6 +74,7 @@
    , lastEOL :: !SrcSpan      -- location of the most recent end-of-line encountered
    , comments :: [Token]      -- accumulated comments 
    }
+   deriving Show
 
 initToken :: Token
 initToken = NewlineToken SpanEmpty 
diff --git a/src/Language/Python/Common/ParserUtils.hs b/src/Language/Python/Common/ParserUtils.hs
--- a/src/Language/Python/Common/ParserUtils.hs
+++ b/src/Language/Python/Common/ParserUtils.hs
@@ -44,7 +44,7 @@
   getSpan = trailer_span
 
 data Subscript
-   = SubscriptExpr { subscript_expr :: ExprSpan, subscript_span :: SrcSpan }
+   = SubscriptExpr { subscription :: ExprSpan, subscript_span :: SrcSpan }
    | SubscriptSlice 
      { subscript_slice_span1 :: Maybe ExprSpan
      , subscript_slice_span2 :: Maybe ExprSpan
@@ -69,11 +69,15 @@
    = SliceEllipsis span
 
 subscriptToExpr :: Subscript -> ExprSpan
-subscriptToExpr sub@(SubscriptExpr {}) = subscript_expr sub 
--- this should never happen:
-subscriptToExpr (SubscriptSlice {}) 
-   = error "subscriptToExpr applied to a proper slice"
+subscriptToExpr (SubscriptExpr { subscription = s }) = s
+subscriptToExpr other = error "subscriptToExpr applied to non subscript"
 
+subscriptsToExpr :: [Subscript] -> ExprSpan
+subscriptsToExpr subs
+   | length subs > 1 = Tuple (map subscriptToExpr subs) (getSpan subs)
+   | length subs == 1 = subscriptToExpr $ head subs
+   | otherwise = error "subscriptsToExpr: empty subscript list"
+
 {-
    = TrailerCall { trailer_call_args :: [ArgumentSpan], trailer_span :: SrcSpan }
    | TrailerSubscript { trailer_subs :: [Subscript], trailer_span :: SrcSpan }
@@ -91,7 +95,7 @@
       | any isProperSlice subs
            = SlicedExpr e (map subscriptToSlice subs) (spanning e trail) 
       | otherwise 
-           = Subscript e (map subscriptToExpr subs) (spanning e trail) 
+           = Subscript e (subscriptsToExpr subs) (spanning e trail) 
    trail e trail@(TrailerDot { trailer_dot_ident = ident, dot_span = ds })
       = BinaryOp (AST.Dot ds) e (Var ident (getSpan ident)) (spanning e trail)
 
diff --git a/src/Language/Python/Common/PrettyAST.hs b/src/Language/Python/Common/PrettyAST.hs
--- a/src/Language/Python/Common/PrettyAST.hs
+++ b/src/Language/Python/Common/PrettyAST.hs
@@ -223,8 +223,8 @@
    pretty (ByteStrings { byte_string_strings = bs }) = hcat (map pretty bs)
    pretty (Strings { strings_strings = ss }) = hcat (map prettyString ss)
    pretty (Call { call_fun = f, call_args = args }) = pretty f <> prettyParenList args
-   pretty (Subscript { subscriptee = e, subscript_exprs = subs })
-      = pretty e <> brackets (commaList subs)
+   pretty (Subscript { subscriptee = e, subscript_expr = sub })
+      = pretty e <> brackets (pretty sub)
    pretty (SlicedExpr { slicee = e, slices = ss })
       = pretty e <> brackets (commaList ss) 
    pretty (CondExpr { ce_true_branch = trueBranch, ce_condition = cond, ce_false_branch = falseBranch })
diff --git a/src/Language/Python/Common/SrcLocation.hs b/src/Language/Python/Common/SrcLocation.hs
--- a/src/Language/Python/Common/SrcLocation.hs
+++ b/src/Language/Python/Common/SrcLocation.hs
@@ -185,7 +185,7 @@
 mkSrcSpan _ NoLocation = SpanEmpty 
 mkSrcSpan loc1 loc2
   | line1 == line2 = 
-       if col1 == col2
+       if col2 <= col1 
           then SpanPoint file line1 col1
           else SpanCoLinear file line1 col1 col2
   | otherwise = 
diff --git a/src/Language/Python/Version3/Lexer.hs b/src/Language/Python/Version3/Lexer.hs
--- a/src/Language/Python/Version3/Lexer.hs
+++ b/src/Language/Python/Version3/Lexer.hs
@@ -15,7 +15,9 @@
 module Language.Python.Version3.Lexer (
    -- * Lexical analysis
    lex, 
-   lexOneToken) where
+   lexOneToken,
+   lexer,
+   initLexState ) where
 
 import Prelude hiding (lex)
 import Language.Python.Version3.Parser.Lexer (lexToken, initStartCodeStack)
@@ -24,15 +26,16 @@
 import Language.Python.Common.ParserMonad 
        (ParseState (input), P, runParser, execParser, ParseError, initialState)
 
+initLexState :: String -> String -> ParseState
+initLexState input srcName = 
+   initialState (initialSrcLocation srcName) input initStartCodeStack
+
 -- | Parse a string into a list of Python Tokens, or return an error. 
 lex :: String -- ^ The input stream (python source code). 
     -> String -- ^ The name of the python source (filename or input device).
     -> Either ParseError [Token] -- ^ An error or a list of tokens.
 lex input srcName =
-   execParser lexer state
-   where
-   initLoc = initialSrcLocation srcName
-   state = initialState initLoc input initStartCodeStack
+   execParser lexer $ initLexState input srcName
 
 -- | Try to lex the first token in an input string. Return either a parse error
 -- or a pair containing the next token and the rest of the input after the token.
@@ -44,9 +47,9 @@
       Left err -> Left err
       Right (tok, state) -> Right (tok, input state)
    where
-   initLoc = initialSrcLocation srcName
-   state = initialState initLoc source initStartCodeStack
+   state = initLexState source srcName 
 
+-- | Lex a sequence of tokens.
 lexer :: P [Token]
 lexer = loop []
    where
