diff --git a/CHANGES b/CHANGES
new file mode 100644
--- /dev/null
+++ b/CHANGES
diff --git a/GuiTV.cabal b/GuiTV.cabal
new file mode 100644
--- /dev/null
+++ b/GuiTV.cabal
@@ -0,0 +1,39 @@
+Name:                GuiTV
+Version:             0.2
+Synopsis:	     GUIs for Tangible Values
+Category:            Interfaces, User Interfaces
+Description:
+  GuiTV is a very small library that extends the TV (tangible value)
+  framework with graphical user interfaces, using Phooey.  (See
+  <http://haskell.org/haskellwiki/TV> and
+  <http://haskell.org/haskellwiki/Phooey>.)  The functionality was part of
+  the TV package up to version 0.1.1.  I moved it out to eliminate the
+  dependency of core TV on Phooey and hence on wxHaskell, as the latter
+  can be difficult to install.
+  .
+  Try out the examples in @src\/Examples.hs@.
+  .
+  For more information, including examples, please see the project wiki
+  page <http://haskell.org/haskellwiki/GuiTV>
+  .
+  This page and the module documentation pages have links to colorized
+  source code and to wiki pages where you can read and contribute /user
+  comments/.  Enjoy!
+  .
+  &#169; 2007 by Conal Elliott; BSD3 license.
+Author:              Conal Elliott 
+Maintainer:          conal@conal.net
+Homepage:            http://haskell.org/haskellwiki/GuiTV
+Package-Url:	     http://darcs.haskell.org/packages/GuiTV
+Copyright:           (c) 2007 by Conal Elliott
+License:             BSD3
+Stability:	     experimental
+Hs-Source-Dirs:      src
+Build-Depends:       base, DeepArrow, phooey>=0.1, TV
+tested-with:	     GHC==6.6
+Extensions:          CPP
+Exposed-Modules:     
+                     Interface.TV.UI
+Extra-Source-Files:  
+                     Examples
+ghc-options:         -O -W
diff --git a/Makefile b/Makefile
new file mode 100644
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,13 @@
+# See README for Cabal-based building.  Other fancy stuff (like haddock) here.
+
+user = conal
+
+configure_args=--disable-use-packages --haddock-args="\
+  --read-interface=http://haskell.org/ghc/docs/latest/html/libraries/base,c:/ghc/ghc-6.6/doc/html/libraries/base/base.haddock \
+  --read-interface=http://darcs.haskell.org/packages/DeepArrow/doc/html,c:/Haskell/packages/DeepArrow-0.0.1/doc/html/DeepArrow.haddock \
+  --read-interface=http://darcs.haskell.org/packages/phooey/doc/html,c:/Haskell/packages/phooey-0.2.1/doc/html/phooey.haddock \
+  --read-interface=http://darcs.haskell.org/packages/TV/doc/html,c:/Haskell/packages/TV-0.2/doc/html/TV.haddock \
+  $(source_args)\
+  $(comments_args)\
+  "
+include ../my-cabal-make.inc
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,16 @@
+GuiTV is a small library for GUI-style visualizing functional values.  It
+can also be viewed as an approach to functional GUIs.  It is implemented
+very simply by using Phooey (http://haskell.org/haskellwiki/phooey) in the
+TV framework (http://haskell.org/haskellwiki/TV).  For a fuller
+description and link to documentation, please see the project wiki page:
+
+  http://haskell.org/haskellwiki/GuiTV
+
+You can configure, build, generate haddock docs, and install all in the
+usual way with Cabal commands.
+
+  runhaskell Setup.lhs configure
+  runhaskell Setup.lhs build
+  runhaskell Setup.lhs install
+
+See src/Examples.hs for examples.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/TODO b/TODO
new file mode 100644
--- /dev/null
+++ b/TODO
diff --git a/src/Examples.hs b/src/Examples.hs
new file mode 100644
--- /dev/null
+++ b/src/Examples.hs
@@ -0,0 +1,140 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module Examples where
+
+import Data.List (sort)
+
+import Interface.TV.UI
+
+-- To pick up the FunArr instance for OFun.  GHC bug?
+import Interface.TV.OFun()
+
+main = runBoth shopping
+
+-- Run both UI and IO flavors
+runBoth :: CTV a -> IO ()
+runBoth tv = runUI tv >> runIO tv
+
+tv0 :: CTV String
+tv0 = tv (oTitle "message" stringOut) "Hello World!"
+
+tv1 :: CTV Int
+tv1 = tv (oTitle "answer" showOut) (42 :: Int)
+
+reverseT :: DefaultOut ([a] -> [a]) => CTV ([a] -> [a])
+reverseT = tv (oTitle "reverse" defaultOut) reverse
+
+--  This one reverses twice
+revTwice :: CTV (String -> String)
+revTwice = reverseT ->| reverseT
+
+apples, bananas :: CInput Int
+apples  = iTitle "apples"  defaultIn
+bananas = iTitle "bananas" defaultIn
+
+total :: Show a => COutput a
+total = oTitle "total" showOut
+
+shoppingO :: COutput (Int -> Int -> Int)
+shoppingO = oTitle "shopping list" $
+            oLambda apples (oLambda bananas total)
+
+shopping :: CTV (Int -> Int -> Int)
+shopping = tv shoppingO (+)
+
+shoppingPr :: CTV ((Int,Int) -> Int)
+shoppingPr = tv ( oTitle "shopping list -- curried" $ 
+                  oLambda (iPair apples bananas) total )
+                (uncurry (+))
+
+shoppingPr' :: CTV ((Int,Int) -> Int)
+shoppingPr' = uncurryA $$ shopping
+
+
+applesU, bananasU :: Input UI Int
+applesU  = iTitle "apples"  (islider 3 (0,10))
+bananasU = iTitle "bananas" (islider 7 (0,10))
+
+shoppingUO :: Output UI (Int -> Int -> Int)
+shoppingUO = oTitle "shopping list" $
+             oLambda applesU (oLambda bananasU total)
+
+shoppingU :: TV UI (Int -> Int -> Int)
+shoppingU = tv shoppingUO (+)
+
+shoppingPrU :: TV UI ((Int,Int) -> Int)
+shoppingPrU = uncurryA $$ shoppingU
+
+
+-- This one is polymorphic in value, so say something like
+-- "runBoth (sortT :: CTV ([String] -> [String]))".  If you leave out the type
+-- annotation, a will default to Int.
+sortT :: (Read a, Show a, Ord a) => CTV ([a] -> [a])
+sortT = tv (oTitle "sort" $ interactLineRS []) sort
+
+
+---- Composition.
+
+-- Idea: unwords, sort, words
+
+instance DefaultOut [String] where defaultOut = showOut
+instance DefaultIn  [String] where defaultIn  = readIn []
+
+
+wordsT :: CTV (String -> [String]) 
+wordsT = tv ( oTitle "function: words" $
+              oLambda (iTitle "sentence in" defaultIn)
+                      (oTitle "words out"   defaultOut))
+            words
+
+unwordsT :: CTV ([String] -> String) 
+unwordsT = tv ( oTitle "function: unwords" $
+                oLambda (iTitle "words in"     defaultIn)
+                        (oTitle "sentence out" defaultOut))
+              unwords
+
+sortWordsT :: CTV (String -> String)
+sortWordsT = wordsT ->| sortT ->| unwordsT
+
+
+---- IO examples
+
+testO :: Output KIO (String -> String)
+testO = oLambda (fileIn "test.txt") defaultOut
+
+-- Apply a function on the lines or on the words of a string.
+onLines, onWords :: ([String] -> [String]) -> (String -> String)
+onLines = wrapF unlines lines
+onWords = wrapF unwords words
+
+perLine,perWord :: (String -> String) -> (String -> String)
+perLine f = onLines (map f)
+perWord f = onWords (map f)
+
+-- io3, ... :: TV KIO (String -> String)
+
+io3 = tv testO (onLines reverse)            -- reverse the lines
+io4 = tv testO (onWords reverse)            -- reverse words
+io5 = tv testO (perLine (onWords reverse))  -- reverse words on each line
+
+io3' = tv testO (perLine reverse)           -- reverse each line
+io4' = tv testO (perWord reverse)           -- reverse each word
+io5' = tv testO (perLine (perWord reverse)) -- reverse each word, leaving lines
+
+
+-- Find lines with 0 < length < n
+short :: Int -> [String] -> [String]
+short n = filter (tween 1 n . length)
+  where tween lo hi i = lo <= i && i < hi
+
+-- Extract lines from a file before a function and combine lines after.
+shortO :: FilePath -> Output KIO ([String] -> [String])
+shortO path = oLambda (fmap lines (fileIn path)) (cofmap unlines defaultOut)
+
+-- Nearly equivalent, but retains more Output structure:
+-- shortO path = cofmap (wrapF unlines lines) (oLambda (fileIn path) defaultOut)
+
+shortT :: FilePath -> Int -> TV KIO ([String] -> [String])
+shortT path n = tv (shortO path) (sort . short n)
+
+-- Example: runTV (shortT "c:/conal/Misc/quotes.tw" 100)
diff --git a/src/Interface/TV/UI.hs b/src/Interface/TV/UI.hs
new file mode 100644
--- /dev/null
+++ b/src/Interface/TV/UI.hs
@@ -0,0 +1,60 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+----------------------------------------------------------------------
+-- |
+-- Module      :  Interface.TV.UI
+-- Copyright   :  (c) Conal Elliott 2006
+-- License     :  LGPL
+-- 
+-- Maintainer  :  conal@conal.net
+-- Stability   :  experimental
+-- Portability :  portable
+-- 
+-- Graphical 'UI' instances of TV classes, plus UI-specific tools
+----------------------------------------------------------------------
+
+module Interface.TV.UI
+  (
+     islider , runUI
+   , UI, module Interface.TV            -- re-exports
+  ) where
+
+import Control.Arrow (pure,(>>>))
+
+import Graphics.UI.Phooey hiding (runUI,islider)
+import qualified Graphics.UI.Phooey as Ph (islider)
+
+import Interface.TV
+
+
+{----------------------------------------------------------
+    Instances
+----------------------------------------------------------}
+
+instance Present UI where
+  presentPair    = fromLeft
+  presentLambda  = fromTop
+  presentTitle   = title
+  -- presentCompose = id
+
+-- For the Eros version, I'll want presentCompose to replace all inner
+-- handles with one outer handle.
+
+instance ToIO UI where toIO = runNamedUI "TV + Phooey"
+
+instance CommonInsOuts UI where
+  putString = stringDisplay
+  getString = textEntry
+
+
+-- | Integer-valued slider, given initial value and bounds
+islider :: Int
+        -> (Int,Int)
+        -> Input UI Int
+islider initial bounds =
+  iPrim (pure (const bounds) >>> Ph.islider initial)
+
+
+-- | Type-disambiguating alias for 'runTV'
+runUI :: RunTV UI
+runUI = runTV
