diff --git a/HGamer3D.cabal b/HGamer3D.cabal
new file mode 100644
--- /dev/null
+++ b/HGamer3D.cabal
@@ -0,0 +1,39 @@
+Name:                HGamer3D
+Version:             0.1.7
+Synopsis:            Library to enable 3D game development for Haskell
+Description:         
+	Library, to enable 3D game development for Haskell,
+	based on bindings to 3D Graphics, Audio and GUI libraries.
+	
+	This is the module, which includes all other needed modules and provides
+	an higher level API for primary
+	use.
+	
+    Platform: Windows only
+	License: Apache License, Version 2.0
+	Install: see http://www.althainz.de/HGamer3D/Download-and-Installation.html
+	
+License:             OtherLicense
+License-file:        LICENSE
+Author:              Peter Althainz
+Maintainer:          althainz@googlemail.com
+Build-Type:          Simple
+Cabal-Version:       >=1.2
+Homepage:            http://www.althainz.de/HGamer3D.html
+Category:            Game
+Extra-source-files:  Setup.hs 
+
+Library
+  Build-Depends:     base >= 3 && < 5, text, directory, Win32, mtl, HGamer3D-Data == 0.1.7, HGamer3D-Ogre-Binding == 0.1.7, HGamer3D-SFML-Binding == 0.1.7
+
+  Exposed-modules:   HGamer3D.APIs.Base.Common,HGamer3D.APIs.Base.Audio,HGamer3D.APIs.Base.InputSystem,HGamer3D.APIs.Base.Graphics3D.Engine3D,HGamer3D.APIs.Base.Graphics3D.Light,HGamer3D.APIs.Base.Graphics3D.Object3D,HGamer3D.BaseAPI
+  Other-modules:     
+
+  c-sources:         
+  
+  ghc-options:       
+  cc-options:        -Wno-attributes 
+  hs-source-dirs:    .
+  Include-dirs:      . 
+  build-depends:     haskell98
+  extra-libraries:   stdc++.dll
diff --git a/HGamer3D/APIs/Base/Audio.hs b/HGamer3D/APIs/Base/Audio.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/Audio.hs
@@ -0,0 +1,233 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Audio.hs
+
+-- |This module is one sub module of the second attempt, to provide an 
+-- abstracted interface to the HGamer3D API Bindings. It is named 'Two',
+-- submodule Audio and handles Music and Sound.
+
+module HGamer3D.APIs.Base.Audio
+
+(
+	-- Enums
+	--
+	module HGamer3D.Bindings.SFML.EnumSoundSourceStatus,
+	
+	
+	-- Data
+	--
+	AudioSource (..), 
+	
+	-- Listener Functions
+	setAudioListenerVolume,
+	getAudioListenerVolume,
+	setAudioListenerPosition,
+	setAudioListenerDirection,
+
+	
+	-- Source creation and delete Functions
+	createMusic,
+	createSound,
+	deleteAudioSource,
+	
+	-- Source play function
+	playAudioSource,
+	pauseAudioSource,
+	stopAudioSource,
+	setAudioSourceLoop,
+	getAudioSourceLoop,
+
+	-- Source Functions
+	setAudioSourcePitch,
+	setAudioSourceVolume,
+	setAudioSourcePosition,
+	setAudioSourceAttenuation,
+
+	getAudioSourcePitch,
+	getAudioSourceVolume,
+	getAudioSourceMinDistance,
+	getAudioSourceAttenuation,
+
+	attachAudioSourceToListener,
+	isAudioSourceAttachedToListener,
+	
+)
+
+where
+
+import GHC.Ptr
+
+import HGamer3D.APIs.Base.Common
+import HGamer3D.Bindings.SFML.ClassPtr
+import HGamer3D.Bindings.SFML.Utils
+
+import qualified HGamer3D.Bindings.SFML.ClassListener as Listener
+import qualified HGamer3D.Bindings.SFML.ClassMusic as Music 
+import qualified HGamer3D.Bindings.SFML.ClassSound as Sound
+import qualified HGamer3D.Bindings.SFML.ClassSoundBuffer as SoundBuffer
+import qualified HGamer3D.Bindings.SFML.ClassSoundSource as SoundSource
+import qualified HGamer3D.Bindings.SFML.ClassSoundStream as SoundStream
+import HGamer3D.Bindings.SFML.EnumSoundSourceStatus
+
+import HGamer3D.Data.HG3DClass
+import Control.Monad.Trans
+import Control.Monad.Reader
+import HGamer3D.Data.Vector
+
+-- Source types
+
+data AudioSource = Music HG3DClass | Sound HG3DClass HG3DClass
+
+
+-- Listener Functions
+
+setAudioListenerVolume :: Float -> MHGamer3D ()
+setAudioListenerVolume vol = liftIO $ Listener.setGlobalVolume vol
+
+getAudioListenerVolume :: MHGamer3D Float
+getAudioListenerVolume = liftIO $ Listener.getGlobalVolume
+
+setAudioListenerPosition :: Vec3 -> MHGamer3D ()
+setAudioListenerPosition (Vec3 x y z) = liftIO $ Listener.setPosition x y z
+
+setAudioListenerDirection :: Vec3 -> MHGamer3D ()
+setAudioListenerDirection (Vec3 x y z) = liftIO $ Listener.setDirection x y z
+
+
+-- Music Functions, deletion and cretion of Audio types
+--
+
+-- | Creates music with name
+createMusic :: String -> MHGamer3D (Maybe AudioSource)
+createMusic filename = do
+	music <- liftIO $ Music.new
+	(cs, es) <- ask
+	let dir = (csHG3DPath cs)
+	fOk <- liftIO $ Music.openFromFile music (dir ++ "\\media\\sound\\" ++ filename)
+	if fOk then
+		return (Just (Music music))
+		else do
+			liftIO $ Music.delete music
+			return Nothing
+
+
+createSound :: String -> MHGamer3D (Maybe AudioSource)
+createSound filename = do
+	sound <- liftIO $ Sound.new
+	buffer <- liftIO $ SoundBuffer.new
+	(cs, es) <- ask
+	let dir = (csHG3DPath cs)
+	fOk <- liftIO $ SoundBuffer.loadFromFile buffer (dir ++ "\\media\\sound\\" ++ filename)
+	if fOk then do
+		liftIO $ Sound.setBuffer sound buffer		
+		return (Just (Sound sound buffer))
+		else do
+			liftIO $ Sound.delete sound
+			liftIO $ SoundBuffer.delete buffer
+			return Nothing
+
+deleteAudioSource :: AudioSource -> MHGamer3D ()
+deleteAudioSource (Music music) = do
+	liftIO $ Music.delete music
+deleteSource (Sound sound buffer) = do
+	liftIO $ Sound.delete sound
+	liftIO $ SoundBuffer.delete buffer
+
+
+-- Source play, pause, stop
+--
+
+playAudioSource :: AudioSource -> MHGamer3D ()
+playAudioSource (Music music) = do
+	liftIO $ SoundStream.play music
+playAudioSource (Sound sound buffer) = do
+	liftIO $ Sound.play sound
+
+pauseAudioSource :: AudioSource -> MHGamer3D ()
+pauseAudioSource (Music music) = do
+	liftIO $ SoundStream.pause music
+pauseAudioSource (Sound sound buffer) = do
+	liftIO $ Sound.pause sound
+
+stopAudioSource :: AudioSource -> MHGamer3D ()
+stopAudioSource (Music music) = do
+	liftIO $ SoundStream.stop music
+stopAudioSource (Sound sound buffer) = do
+	liftIO $ Sound.stop sound
+
+getAudioSourceLoop :: AudioSource -> MHGamer3D Bool
+getAudioSourceLoop (Music music) = do
+	fLoop <- liftIO $ SoundStream.getLoop music
+	return fLoop
+getAudioSourceLoop (Sound sound buffer) = do
+	fLoop <- liftIO $ Sound.getLoop sound
+	return fLoop
+
+setAudioSourceLoop :: AudioSource -> Bool -> MHGamer3D ()
+setAudioSourceLoop (Music music) fLoop = do
+	liftIO $ SoundStream.setLoop music fLoop
+setAudioSourceLoop (Sound sound buffer) fLoop = do
+	liftIO $ Sound.setLoop sound fLoop
+
+
+-- Sound Source Functions
+--
+
+setAudioSourcePitch :: AudioSource -> Float -> MHGamer3D ()
+setAudioSourcePitch (Music s) p = liftIO $ SoundSource.setPitch s p
+setAudioSourcePitch (Sound s b) p = liftIO $ SoundSource.setPitch s p
+
+setAudioSourceVolume :: AudioSource -> Float -> MHGamer3D ()
+setAudioSourceVolume (Music s) v = liftIO $ SoundSource.setVolume s v
+setAudioSourceVolume (Sound s b) v = liftIO $ SoundSource.setVolume s v
+
+setAudioSourcePosition :: AudioSource -> Vec3 -> MHGamer3D ()
+setAudioSourcePosition (Music s) (Vec3 x y z) = liftIO $ SoundSource.setPosition s x y z
+setAudioSourcePosition (Sound s b) (Vec3 x y z) = liftIO $ SoundSource.setPosition s x y z
+
+setAudioSourceAttenuation :: AudioSource -> Float -> MHGamer3D ()
+setAudioSourceAttenuation (Music s) a = liftIO $ SoundSource.setAttenuation s a
+setAudioSourceAttenuation (Sound s b) a = liftIO $ SoundSource.setAttenuation s a
+
+getAudioSourcePitch :: AudioSource -> MHGamer3D Float
+getAudioSourcePitch (Music s) = liftIO $ SoundSource.getPitch s
+getAudioSourcePitch (Sound s b) = liftIO $ SoundSource.getPitch s
+
+
+getAudioSourceVolume :: AudioSource -> MHGamer3D Float
+getAudioSourceVolume (Music s) = liftIO $ SoundSource.getVolume s
+getAudioSourceVolume (Sound s b) = liftIO $ SoundSource.getVolume s
+
+getAudioSourceMinDistance :: AudioSource -> MHGamer3D Float
+getAudioSourceMinDistance (Music s) = liftIO $ SoundSource.getMinDistance s
+getAudioSourceMinDistance (Sound s b) = liftIO $ SoundSource.getMinDistance s
+
+getAudioSourceAttenuation :: AudioSource -> MHGamer3D Float
+getAudioSourceAttenuation (Music s) = liftIO $ SoundSource.getAttenuation s
+getAudioSourceAttenuation (Sound s b) = liftIO $ SoundSource.getAttenuation s
+
+attachAudioSourceToListener :: AudioSource -> Bool -> MHGamer3D ()
+attachAudioSourceToListener (Music s) isR = liftIO $ SoundSource.setRelativeToListener s isR
+attachAudioSourceToListener (Sound s b) isR = liftIO $ SoundSource.setRelativeToListener s isR
+
+isAudioSourceAttachedToListener :: AudioSource -> MHGamer3D Bool
+isAudioSourceAttachedToListener (Music s) = liftIO $ SoundSource.isRelativeToListener s
+isAudioSourceAttachedToListener (Sound s b) = liftIO $ SoundSource.isRelativeToListener s
+
+
diff --git a/HGamer3D/APIs/Base/Common.hs b/HGamer3D/APIs/Base/Common.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/Common.hs
@@ -0,0 +1,153 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Engine3D.hs
+--
+
+-- Basic functionality of HGamer3D, Base API
+
+module HGamer3D.APIs.Base.Common (
+
+	MHGamer3D,
+	Position3D (..),
+	Scale3D (..),
+	translate3D,
+	Direction3D (..),
+	Orientation3D (..),
+
+	CommonSystem (..),
+	EngineSystem (..),
+	
+	getUniqueName,
+	initCommon,
+	
+	TimeMS (..),
+	getTimeMS,
+	
+	runMHGamer3D
+)
+
+where 
+
+import HGamer3D.Data.Colour
+import HGamer3D.Data.Vector
+import HGamer3D.Data.Angle
+import HGamer3D.Data.HG3DClass
+
+import qualified Data.Text as T
+import System.Directory
+
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Reader
+import Control.Monad.State
+import Control.Concurrent
+
+import System.Win32.Time
+
+-- identification dll
+--
+hg3ddllname :: String
+hg3ddllname = "HGamer3D-Version-0.1.7-DontDelete.txt"
+
+data CommonSystem = CommonSystem {
+	csHG3DPath::String
+}
+	
+data EngineSystem = EngineSystem {
+	esRoot::HG3DClass,
+	esSceneManager::HG3DClass,
+	esResourceGroupManager::HG3DClass,
+	esTextureManager::HG3DClass,
+	esControllerManager::HG3DClass,
+	esLogManager::HG3DClass,
+	esCamera::HG3DClass,
+	esRenderWindow::HG3DClass,
+	esViewport::HG3DClass
+} 
+
+type MHGamer3D a = (ReaderT (CommonSystem, EngineSystem)) (StateT [Integer] IO) a
+
+class Position3D t where
+
+	position3D :: t -> MHGamer3D Vec3
+	positionTo3D :: t -> Vec3 -> MHGamer3D ()
+	
+translate3D :: Position3D t => t -> Vec3 -> MHGamer3D ()
+translate3D t v = do
+	p <- position3D t
+	positionTo3D t ( v &+ p )
+	return ()
+
+class Scale3D t where	
+	
+	scale3D :: t -> MHGamer3D Vec3
+	scaleTo3D :: t -> Vec3 -> MHGamer3D ()
+
+class Direction3D t where
+	direction3D :: t -> MHGamer3D Vec3
+	directionTo3D :: t -> Vec3 -> MHGamer3D ()
+
+class Orientation3D t where
+	orientation3D :: t -> MHGamer3D UnitQuaternion
+	orientationTo3D :: t -> UnitQuaternion -> MHGamer3D ()
+
+-- unique identifiers, by appending a unique integer to a prefix
+--
+
+getUniqueName :: String -> StateT [Integer] IO String
+getUniqueName prefix = do 
+    (x:xs) <- get
+    put xs
+    return (prefix ++ (show x))
+ 
+
+-- function, which finds installation path of HG3D
+--
+
+getHG3DPath :: IO String
+getHG3DPath = do
+	env <- findExecutable hg3ddllname
+	let path = case env of
+		Just path -> fst (T.breakOn (T.pack $ "\\bin\\" ++ hg3ddllname) (T.pack path))
+		Nothing -> T.pack ""
+	return (T.unpack path)
+
+initCommon :: IO CommonSystem
+initCommon = do
+	csHG3DPath <- getHG3DPath
+	return (CommonSystem csHG3DPath)
+
+-- Milliseconds Timescale
+
+data TimeMS = TimeMS Int			-- time in milliseconds
+
+instance Show TimeMS where
+	show (TimeMS s) = (show s) ++ " Milliseconds"
+
+getTimeMS :: MHGamer3D (TimeMS)
+getTimeMS = do 
+	fr <- liftIO $ queryPerformanceFrequency
+	wt <- liftIO $ queryPerformanceCounter
+	return (TimeMS $ fromIntegral (wt * 1000 `div`  fr))
+	
+runMHGamer3D :: (CommonSystem, EngineSystem) -> [Integer] -> MHGamer3D a -> IO (a, [Integer])
+runMHGamer3D (cs, es) s action = do
+	(actionResult, newState) <- runStateT (runReaderT action (cs, es) ) s
+	return (actionResult, newState)
+
diff --git a/HGamer3D/APIs/Base/Graphics3D/Engine3D.hs b/HGamer3D/APIs/Base/Graphics3D/Engine3D.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/Graphics3D/Engine3D.hs
@@ -0,0 +1,260 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Engine3D.hs
+--
+
+-- Basic functionality of the 3D engine
+
+module HGamer3D.APIs.Base.Graphics3D.Engine3D (
+
+	Camera (..),
+	HGamer3D.APIs.Base.Graphics3D.Engine3D.getCamera,
+	cameraLookAt,
+	HGamer3D.APIs.Base.Graphics3D.Engine3D.setBackgroundColour,
+	
+	initEngine3D,
+	renderLoop
+) 
+
+where
+
+
+import GHC.Ptr
+
+import HGamer3D.Bindings.Ogre.ClassPtr
+import HGamer3D.Bindings.Ogre.Utils
+
+import HGamer3D.Data.Colour
+import HGamer3D.Data.Vector
+import HGamer3D.Data.Angle
+
+import HGamer3D.Bindings.Ogre.StructColour
+import HGamer3D.Bindings.Ogre.StructSharedPtr
+
+import HGamer3D.Bindings.Ogre.EnumSceneType
+import HGamer3D.Bindings.Ogre.EnumNodeTransformSpace
+
+import HGamer3D.Bindings.Ogre.ClassCamera as Camera
+import HGamer3D.Bindings.Ogre.ClassRoot as Root
+import HGamer3D.Bindings.Ogre.ClassLight as Light
+import HGamer3D.Bindings.Ogre.ClassNode as Node
+import HGamer3D.Bindings.Ogre.ClassSceneManager as SceneManager
+import HGamer3D.Bindings.Ogre.ClassSceneNode as SceneNode
+import HGamer3D.Bindings.Ogre.ClassRenderTarget as RenderTarget
+import HGamer3D.Bindings.Ogre.ClassRenderWindow as RenderWindow
+import HGamer3D.Bindings.Ogre.ClassResourceGroupManager as ResourceGroupManager
+import HGamer3D.Bindings.Ogre.ClassTextureManager as TextureManager
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassViewport as Viewport
+import HGamer3D.Bindings.Ogre.ClassFrustum as Frustum
+import HGamer3D.Bindings.Ogre.ClassAnimationState as AnimationState
+import HGamer3D.Bindings.Ogre.ClassEntity as Entity
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassWindowEventUtilities as WindowEventUtilities
+import HGamer3D.Bindings.Ogre.ClassLogManager as LogManager
+import HGamer3D.Bindings.Ogre.ClassLog as Log
+
+import HGamer3D.Bindings.Ogre.ClassManualObject as ManualObject
+import HGamer3D.Bindings.Ogre.EnumRenderOperationOperationType
+import HGamer3D.Bindings.Ogre.StructHG3DClass
+import HGamer3D.Bindings.Ogre.EnumSceneManagerPrefabType
+
+import HGamer3D.Data.HG3DClass
+import HGamer3D.APIs.Base.Common
+
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Reader
+import Control.Monad.State
+import Control.Concurrent
+
+import System.Win32.Process
+import System (getArgs)
+
+
+-- Camera functions
+--
+
+data Camera = Camera HG3DClass
+
+getCamera :: MHGamer3D Camera
+getCamera = do
+	(cs, es) <- ask
+	let cam = Camera (esCamera es)
+	return cam
+	
+instance Position3D Camera where
+
+	position3D (Camera c) = do
+		pos <- liftIO $ Camera.getPosition c
+		return (pos)
+		
+	positionTo3D (Camera c) pos = do
+		liftIO $ Camera.setPosition2 c  pos
+		return ()
+	
+instance Direction3D Camera where
+
+	direction3D (Camera c) = do
+		d <- liftIO $ Camera.getDirection c
+		return d
+		
+	directionTo3D (Camera c) v = do
+		liftIO $ Camera.setDirection2 c v
+	
+instance Orientation3D Camera where
+
+	orientation3D (Camera c) = do
+		q <- liftIO $ Camera.getOrientation c
+		let uq = mkNormal q
+		return uq
+	
+	orientationTo3D (Camera c) uq = do
+		liftIO $ Camera.setOrientation c (fromNormal uq)
+		return ()
+
+cameraLookAt (Camera c) v = do
+	liftIO $ Camera.lookAt c v
+	return ()
+
+-- specific single function
+--
+
+setBackgroundColour :: Colour -> MHGamer3D ()
+setBackgroundColour bgColour = do
+	(cs, es) <- ask
+	liftIO $ Viewport.setBackgroundColour (esViewport es) bgColour
+
+
+	
+initEngine3D :: CommonSystem 
+			-> String -- ^Name of the window, displayed
+			-> String  -- ^SceneManager type used
+			-> IO (EngineSystem)
+			
+initEngine3D cs windowName sceneManagerType = do
+
+	let hg3dpath = (csHG3DPath cs) 
+	
+	-- create a good experience for the user, starting the 
+	-- engine, and also, make sure, we can modify options
+	
+	args <- getArgs
+	let fConfig = foldl (||) False $ map (\arg -> if arg == "--config" then True else False) args
+	let fDX = foldl (||) False $ map (\arg -> if arg == "--directx" then True else False) args
+	let fLog = foldl (||) False $ map (\arg -> if arg == "--logging" then True else False) args
+	let plugins = if fDX then hg3dpath ++ "\\config\\pluginsDX.cfg" else hg3dpath ++ "\\config\\plugins.cfg"
+	let config = if fDX then hg3dpath ++ "\\config\\engineDX.cfg" else hg3dpath ++ "\\config\\engine.cfg"
+	print "Here comes the path info"
+	print plugins
+	print config
+	
+	root <- Root.new plugins config ""
+	lmgr <- LogManager.getSingletonPtr
+	if not fLog then do
+		newlog <- LogManager.createLog lmgr "SilentLog" True False True
+		return ()
+		else do
+			newlog <- LogManager.createLog lmgr "hgamer3d-engine.log" True False False
+			return ()
+			
+	fOk <- if fConfig then
+				Root.showConfigDialog root
+				else do
+					fLoaded <- Root.restoreConfig root
+					if not fLoaded then
+						Root.showConfigDialog root
+						else
+							return True
+								
+	
+--	fUAddResourceLocations "resources.cfg"
+	renderWindow <-Root.initialise root True windowName ""
+	
+	-- Suppress logging unless, fLog
+			
+	sceneManager <- Root.createSceneManager root sceneManagerType "SceneManager"
+	
+	camera <- SceneManager.createCamera sceneManager "SimpleCamera"
+	Frustum.setNearClipDistance camera 5.0
+	Frustum.setFarClipDistance camera 5000.0
+	
+
+	viewport <- RenderTarget.addViewport renderWindow camera 0 0.0 0.0 1.0 1.0
+	let bgColor = Colour 0.0 0.0 0.0 1.0
+	Viewport.setBackgroundColour viewport bgColor
+	
+	height <- Viewport.getActualHeight viewport
+	width <- Viewport.getActualWidth viewport
+	
+	Frustum.setAspectRatio camera ((fromIntegral width) / (fromIntegral height))
+	
+	tm <- TextureManager.getSingletonPtr
+	TextureManager.setDefaultNumMipmaps tm 20
+	
+	rgm <- ResourceGroupManager.getSingletonPtr
+	ResourceGroupManager.addResourceLocation rgm (hg3dpath ++ "\\media\\materials") "FileSystem" "General" False
+	ResourceGroupManager.addResourceLocation rgm (hg3dpath ++ "\\media\\Sinbad.zip") "Zip" "General" False
+	ResourceGroupManager.addResourceLocation rgm (hg3dpath ++ "\\media\\ywing.zip") "Zip" "General" False
+	ResourceGroupManager.initialiseAllResourceGroups rgm
+	
+	
+	cm <- ControllerManager.new
+
+	return (EngineSystem root sceneManager rgm tm cm lmgr camera renderWindow viewport )
+
+
+
+-- renderStep a :: TimeMS -> a -> MHGamer3D (Bool, a)
+-- this function needs to be defined in 
+
+renderInternalStep :: Int -> TimeMS -> MHGamer3D (Bool, TimeMS)
+renderInternalStep frameRate (TimeMS lastTime) = do
+	(cs, es) <- ask
+	-- adapt to framerate, while still doing messagePump
+	(TimeMS time) <- getTimeMS
+	let delta = time - lastTime
+	let waitTimeMS = (1000.0 / (fromIntegral frameRate) ) - (fromIntegral delta) 
+	time <- if waitTimeMS > 0.0 then do
+				liftIO $ sleep (round waitTimeMS)
+				(TimeMS time) <- getTimeMS
+				return (time)
+			else
+				return (time)
+	-- adapt
+	liftIO $ WindowEventUtilities.messagePump
+	closed <- liftIO $ RenderWindow.isClosed (esRenderWindow es)
+	if (closed) then
+		return (False, (TimeMS time))
+		else do
+			liftIO $ Root.renderOneFrame (esRoot es)
+			return (True, (TimeMS time))
+
+renderLoop :: Int -> TimeMS -> a -> (TimeMS -> a -> MHGamer3D (Bool, a)) -> MHGamer3D ()
+renderLoop frameRate t a renderStep = do
+	(cs, es) <- ask
+	(flagStep, time) <- renderInternalStep frameRate t
+	let delta = TimeMS (time' - t') where
+		TimeMS time' = time
+		TimeMS t' = t
+	(flagLoop, a) <- renderStep delta a
+	if (flagStep && flagLoop) then do
+		renderLoop frameRate time a renderStep
+		else return ()
+			
diff --git a/HGamer3D/APIs/Base/Graphics3D/Light.hs b/HGamer3D/APIs/Base/Graphics3D/Light.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/Graphics3D/Light.hs
@@ -0,0 +1,159 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Light.hs
+--
+
+-- Light functionality 
+
+module HGamer3D.APIs.Base.Graphics3D.Light (
+
+	Light (..),
+	HGamer3D.APIs.Base.Graphics3D.Light.setAmbientLight,
+	createPointLight,
+	createSpotLight,
+	createDirectionalLight
+
+) 
+
+where
+
+
+import GHC.Ptr
+
+import HGamer3D.Bindings.Ogre.ClassPtr
+import HGamer3D.Bindings.Ogre.Utils
+
+import HGamer3D.Data.Colour
+import HGamer3D.Data.Vector
+import HGamer3D.Data.Angle
+
+import HGamer3D.Bindings.Ogre.StructColour
+import HGamer3D.Bindings.Ogre.StructSharedPtr
+
+import HGamer3D.Bindings.Ogre.EnumSceneType
+import HGamer3D.Bindings.Ogre.EnumNodeTransformSpace
+import HGamer3D.Bindings.Ogre.EnumLightType
+
+import HGamer3D.Bindings.Ogre.ClassCamera as Camera
+import HGamer3D.Bindings.Ogre.ClassRoot as Root
+import HGamer3D.Bindings.Ogre.ClassLight as Light
+import HGamer3D.Bindings.Ogre.ClassNode as Node
+import HGamer3D.Bindings.Ogre.ClassSceneManager as SceneManager
+import HGamer3D.Bindings.Ogre.ClassSceneNode as SceneNode
+import HGamer3D.Bindings.Ogre.ClassRenderTarget as RenderTarget
+import HGamer3D.Bindings.Ogre.ClassRenderWindow as RenderWindow
+import HGamer3D.Bindings.Ogre.ClassResourceGroupManager as ResourceGroupManager
+import HGamer3D.Bindings.Ogre.ClassTextureManager as TextureManager
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassViewport as Viewport
+import HGamer3D.Bindings.Ogre.ClassFrustum as Frustum
+import HGamer3D.Bindings.Ogre.ClassAnimationState as AnimationState
+import HGamer3D.Bindings.Ogre.ClassEntity as Entity
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassWindowEventUtilities as WindowEventUtilities
+
+import HGamer3D.Bindings.Ogre.ClassManualObject as ManualObject
+import HGamer3D.Bindings.Ogre.EnumRenderOperationOperationType
+import HGamer3D.Bindings.Ogre.StructHG3DClass
+import HGamer3D.Bindings.Ogre.EnumSceneManagerPrefabType
+
+import HGamer3D.Data.HG3DClass
+
+import Control.Monad.Trans
+import Control.Monad.Reader
+import Control.Monad.State
+
+import HGamer3D.APIs.Base.Common
+import HGamer3D.APIs.Base.Graphics3D.Engine3D
+
+data Light = Light HG3DClass deriving (Show)
+
+instance Position3D Light where
+
+	position3D (Light l) = do
+		pos <- liftIO $ Light.getPosition l
+		return (pos)
+		
+	positionTo3D (Light l) pos = do
+		let (Vec3 x y z) = pos
+		liftIO $ Light.setPosition l x y z
+		return ()
+	
+instance Direction3D Light where
+
+	direction3D (Light l)  = do
+		d <- liftIO $ Light.getDirection l
+		return d
+	
+	directionTo3D (Light l) v = do
+		liftIO $ Light.setDirection2 l v
+		return ()
+
+
+-- | creates a light, which fills all the room with similar strength
+setAmbientLight :: Colour -> MHGamer3D () 
+setAmbientLight colour = do
+	(cs, es) <- ask
+	liftIO $ SceneManager.setAmbientLight (esSceneManager es) colour
+	return ()
+	
+
+-- | creates a point light at a specific location
+createPointLight :: Colour -- ^Color of the light
+		-> Vec3 -- ^Position, where light is created
+		-> MHGamer3D (Light) -- ^Return value is a graphics object
+		
+createPointLight colour (Vec3 x y z) = do
+	(cs, es) <- ask
+	lightName <- lift $ getUniqueName "LO"
+	light <- liftIO $ SceneManager.createLight (esSceneManager es) lightName
+	liftIO $ Light.setType light LT_DIRECTIONAL
+	liftIO $ Light.setPosition light x y z
+	let eo = Light light
+	return eo
+
+-- | creates a point light at a specific location
+createSpotLight :: Colour -- ^Color of the light
+		-> Vec3 -- ^Position, where light is created
+		-> MHGamer3D (Light) -- ^Return value is a graphics object
+		
+createSpotLight colour (Vec3 x y z) = do
+	(cs, es) <- ask
+	lightName <- lift $ getUniqueName "LO"
+	light <- liftIO $ SceneManager.createLight (esSceneManager es) lightName
+	liftIO $ Light.setType light LT_SPOTLIGHT
+	liftIO $ Light.setPosition light x y z
+	let eo = Light light
+	return eo
+
+
+-- | creates a point light at a specific location
+createDirectionalLight :: Colour -- ^Color of the light
+		-> Vec3 -- ^Position, where light is created
+		-> MHGamer3D (Light) -- ^Return value is a graphics object
+		
+createDirectionalLight colour (Vec3 x y z) = do
+	(cs, es) <- ask
+	lightName <- lift $ getUniqueName "LO"
+	light <- liftIO $ SceneManager.createLight (esSceneManager es) lightName
+	liftIO $ Light.setType light LT_DIRECTIONAL
+	liftIO $ Light.setPosition light x y z
+	let eo = Light light
+	return eo
+
diff --git a/HGamer3D/APIs/Base/Graphics3D/Object3D.hs b/HGamer3D/APIs/Base/Graphics3D/Object3D.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/Graphics3D/Object3D.hs
@@ -0,0 +1,214 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Object3D.hs
+--
+
+-- Graphics Objects 3D functionality 
+
+module HGamer3D.APIs.Base.Graphics3D.Object3D (
+
+	Object3D (..),
+	Material (..),
+	createSphere,
+	createCube,
+	createPlane,
+	createMesh,
+	createLine,
+	setObjectMaterial,
+	combineObjects
+) 
+
+where
+
+
+import GHC.Ptr
+
+import HGamer3D.Bindings.Ogre.ClassPtr
+import HGamer3D.Bindings.Ogre.Utils
+
+import HGamer3D.Data.Colour
+import HGamer3D.Data.Vector
+import HGamer3D.Data.Angle
+
+import HGamer3D.Bindings.Ogre.StructColour
+import HGamer3D.Bindings.Ogre.StructSharedPtr
+
+import HGamer3D.Bindings.Ogre.EnumSceneType
+import HGamer3D.Bindings.Ogre.EnumNodeTransformSpace
+import HGamer3D.Bindings.Ogre.EnumLightType
+
+import HGamer3D.Bindings.Ogre.ClassCamera as Camera
+import HGamer3D.Bindings.Ogre.ClassRoot as Root
+import HGamer3D.Bindings.Ogre.ClassLight as Light
+import HGamer3D.Bindings.Ogre.ClassNode as Node
+import HGamer3D.Bindings.Ogre.ClassSceneManager as SceneManager
+import HGamer3D.Bindings.Ogre.ClassSceneNode as SceneNode
+import HGamer3D.Bindings.Ogre.ClassRenderTarget as RenderTarget
+import HGamer3D.Bindings.Ogre.ClassRenderWindow as RenderWindow
+import HGamer3D.Bindings.Ogre.ClassResourceGroupManager as ResourceGroupManager
+import HGamer3D.Bindings.Ogre.ClassTextureManager as TextureManager
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassViewport as Viewport
+import HGamer3D.Bindings.Ogre.ClassFrustum as Frustum
+import HGamer3D.Bindings.Ogre.ClassAnimationState as AnimationState
+import HGamer3D.Bindings.Ogre.ClassEntity as Entity
+import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager
+import HGamer3D.Bindings.Ogre.ClassWindowEventUtilities as WindowEventUtilities
+
+import HGamer3D.Bindings.Ogre.ClassManualObject as ManualObject
+import HGamer3D.Bindings.Ogre.EnumRenderOperationOperationType
+import HGamer3D.Bindings.Ogre.StructHG3DClass
+import HGamer3D.Bindings.Ogre.EnumSceneManagerPrefabType
+
+import HGamer3D.Data.HG3DClass
+
+import Control.Monad.Trans
+import Control.Monad.Reader
+import Control.Monad.State
+
+import HGamer3D.APIs.Base.Common
+import HGamer3D.APIs.Base.Graphics3D.Engine3D
+
+
+data Object3D = Object3D HG3DClass HG3DClass | -- node entity 
+				Object3DCombined HG3DClass -- node only
+				
+getNode :: Object3D -> HG3DClass
+getNode (Object3D node entity) = node
+getNode (Object3DCombined node) = node
+
+data Material = NamedMaterial String 
+
+createObjectFromEntity :: HG3DClass -> EngineSystem -> IO Object3D
+createObjectFromEntity entity es = do
+	rootNode <- SceneManager.getRootSceneNode (esSceneManager es)
+	let vzero = Vec3 0.0 0.0 0.0
+	let qident = Q (Vec4 1.0 0.0 0.0 0.0)
+	node <- SceneNode.createChildSceneNode rootNode vzero qident
+	SceneNode.attachObject node entity
+	return (Object3D node entity)
+
+createSphere :: MHGamer3D Object3D
+createSphere = do
+	(cs, es) <- ask
+	entity <- liftIO $ SceneManager.createEntity4 (esSceneManager es) PT_SPHERE
+	ob <- liftIO $ createObjectFromEntity entity es
+	return (ob)
+
+createCube :: MHGamer3D Object3D
+createCube = do
+	(cs, es) <- ask
+	entity <- liftIO $ SceneManager.createEntity4 (esSceneManager es) PT_CUBE
+	ob <- liftIO $ createObjectFromEntity entity es
+	return (ob)
+
+createPlane :: MHGamer3D Object3D
+createPlane = do
+	(cs, es) <- ask
+	entity <- liftIO $ SceneManager.createEntity4 (esSceneManager es) PT_PLANE
+	ob <- liftIO $ createObjectFromEntity entity es
+	return (ob)
+
+createMesh :: String -> MHGamer3D Object3D
+createMesh name = do
+	(cs, es) <- ask
+	entity <- liftIO $ SceneManager.createEntity2 (esSceneManager es) name
+	ob <- liftIO $ createObjectFromEntity entity es
+	return (ob)
+
+createLine :: Vec3 -> Vec3 -> MHGamer3D Object3D
+createLine vStart vEnd = do
+	(cs, es) <- ask
+	lineName <- lift $ getUniqueName "GO"
+	name <- lift $ getUniqueName "GO"
+	let materialName = "BaseWhiteNoLighting"
+	let colour = Colour 1.0 1.0 1.0 1.0
+	mo <- liftIO $ SceneManager.createManualObject (esSceneManager es) lineName
+	liftIO $ ManualObject.begin mo materialName OT_LINE_LIST "General"
+	liftIO $ ManualObject.position mo vStart
+	liftIO $ ManualObject.colour mo colour
+	liftIO $ ManualObject.position mo vEnd
+	liftIO $ ManualObject.colour mo colour
+	liftIO $ ManualObject.end mo
+	mesh <- liftIO $ ManualObject.convertToMesh mo name "General"
+	obj <- createMesh name
+	return (obj)
+
+instance Position3D Object3D where
+
+	position3D obj = do
+		pos <- liftIO $ Node.getPosition (getNode obj)
+		return (pos)
+		
+	positionTo3D obj pos = do
+		liftIO $ Node.setPosition  (getNode obj) pos
+		return ()
+	
+instance Scale3D Object3D where
+
+	scale3D obj = do
+		pos <- liftIO $ Node.getScale  (getNode obj)
+		return (pos)
+		
+	scaleTo3D obj pos = do
+		liftIO $ Node.setScale  (getNode obj) pos
+		return ()
+	
+instance Orientation3D Object3D where
+
+	orientation3D obj = do
+		q <- liftIO $ Node.getOrientation  (getNode obj)
+		let uq = mkNormal q
+		return uq
+	
+	orientationTo3D obj uq = do
+		liftIO $ Node.setOrientation  (getNode obj) (fromNormal uq)
+		return ()
+
+setObjectMaterial :: Object3D -> Material -> MHGamer3D ()
+setObjectMaterial  (Object3D node entity) (NamedMaterial name) = do
+	liftIO $ Entity.setMaterialName entity name "General"
+setObjectMaterial  (Object3DCombined node) (NamedMaterial name) = do
+	liftIO $ print "try to set material of combined object, not possible"
+
+
+-- |This function groups objects into a new object
+-- it is not perfoming any geometric operations, it just groups the 
+-- input objects. Can be used, to move and rotate a group.
+combineObjects :: [Object3D] -- ^A list of objects, to be grouped
+		-> MHGamer3D (Object3D) -- ^The return value is a new GraphicsObject
+combineObjects listObjects = do
+	(cs, es) <- ask
+	rootNode <- liftIO $ SceneManager.getRootSceneNode (esSceneManager es)
+	let vzero = Vec3 0.0 0.0 0.0
+	let qident = Q (Vec4 1.0 0.0 0.0 0.0)
+	node <- liftIO $ SceneNode.createChildSceneNode rootNode vzero qident
+	sequence_ (map ( \(Object3D objectnode object) -> do
+						parent <- liftIO $ Node.getParent objectnode
+						-- currently no check here, if parent exists!
+						-- no parent is only valid for root node and this is not accessible to the
+						-- user of this api (should not be used, at least)
+						liftIO $ Node.removeChild2 parent objectnode
+						liftIO $ Node.addChild node objectnode
+						return ()
+						)
+								listObjects)
+	return ( Object3DCombined node  )
+
+
diff --git a/HGamer3D/APIs/Base/InputSystem.hs b/HGamer3D/APIs/Base/InputSystem.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/APIs/Base/InputSystem.hs
@@ -0,0 +1,154 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- InputSystem.hs
+
+-- |This module is the Input System and handles Mouse, Keyboard and Joystick Input.
+
+module HGamer3D.APIs.Base.InputSystem
+
+(
+	-- Enums
+	--
+	module HGamer3D.Bindings.SFML.EnumJoystickAxis,
+	module HGamer3D.Bindings.SFML.EnumKey,
+	module HGamer3D.Bindings.SFML.EnumMouseButton,
+	
+	-- Joystick Data
+	Joystick (..),
+	JoystickButton (..),
+	
+	-- Joystick Functions
+	updateJoystickStatus,
+	
+	getConnectedJoysticks,
+	getJoystickAxes,
+	getJoystickButtons,
+	
+	isJoystickButtonPressed,
+	getJoystickAxisPosition,
+	
+	-- Keyboard Functions
+	isKeyPressed,
+	
+	-- Mouse Functions
+	isMouseButtonPressed,
+	getMousePosition,
+	
+	
+	
+)
+
+where
+
+import GHC.Ptr
+
+import HGamer3D.Bindings.SFML.ClassPtr
+import HGamer3D.Bindings.SFML.Utils
+
+import qualified HGamer3D.Bindings.SFML.ClassJoystick as Joystick
+import qualified HGamer3D.Bindings.SFML.ClassKeyboard as Keyboard
+import qualified HGamer3D.Bindings.SFML.ClassMouse as Mouse
+import qualified HGamer3D.Bindings.SFML.ClassMouseHG3D as Mouse2
+import HGamer3D.Bindings.SFML.EnumJoystickAxis
+import HGamer3D.Bindings.SFML.EnumKey
+import HGamer3D.Bindings.SFML.EnumMouseButton
+
+import HGamer3D.APIs.Base.Common
+import HGamer3D.Data.HG3DClass
+import Control.Monad.Trans
+import Control.Monad.Reader
+import HGamer3D.Data.Vector
+
+
+-- Joystick Data
+data Joystick = Joystick Int deriving (Eq)
+data JoystickButton = JoystickButton Int deriving (Eq)
+
+instance Show Joystick where
+	show (Joystick j) = show $ "Joystick-" ++ (show j)
+
+instance Show JoystickButton where
+	show (JoystickButton jb) = show $ "JoystickButton-" ++ (show jb)
+
+instance Show EnumJoystickAxis where
+	show axis = "JoystickAxis-" ++ (case axis of
+		JoystickAxisX -> "X"
+		JoystickAxisY -> "Y"
+		JoystickAxisZ -> "Z"
+		JoystickAxisR -> "R"
+		JoystickAxisU -> "U"
+		JoystickAxisV -> "V"
+		JoystickAxisPovX -> "PovX"
+		JoystickAxisPovY -> "PoxY"
+		)
+	
+
+-- Joystick funtions
+--
+
+updateJoystickStatus :: MHGamer3D ()
+updateJoystickStatus = liftIO Joystick.update
+
+getConnectedJoysticks :: MHGamer3D [Joystick]
+getConnectedJoysticks = do
+	let ns = [ x | x <- [0..20]]
+	jns <- filterM (\jn -> do
+		c <- liftIO $ Joystick.isConnected jn
+		return (c) ) ns
+	let js = map Joystick jns
+	return js
+
+getJoystickAxes:: Joystick -> MHGamer3D [EnumJoystickAxis]
+getJoystickAxes (Joystick j) = do
+	axes <- filterM ( \a -> do
+		liftIO $ Joystick.hasAxis j a) [ JoystickAxisX, JoystickAxisY, JoystickAxisZ, 
+			JoystickAxisR, JoystickAxisU, JoystickAxisV, 
+			JoystickAxisPovX, JoystickAxisPovY ]
+	return axes
+
+
+getJoystickButtons :: Joystick -> MHGamer3D [JoystickButton]
+getJoystickButtons (Joystick j) = do
+	jn <- liftIO $ Joystick.getButtonCount j
+	let btns = map JoystickButton [0..(jn-1)]
+	return btns
+
+isJoystickButtonPressed :: Joystick -> JoystickButton -> MHGamer3D Bool
+isJoystickButtonPressed (Joystick j) (JoystickButton b) = liftIO $ Joystick.isButtonPressed j b
+
+getJoystickAxisPosition :: Joystick -> EnumJoystickAxis -> MHGamer3D Float
+getJoystickAxisPosition (Joystick j) ax = liftIO $ Joystick.getAxisPosition j ax
+
+
+-- Keyboard functions
+--
+
+isKeyPressed :: EnumKey -> MHGamer3D Bool
+isKeyPressed key = liftIO $ Keyboard.isKeyPressed key
+
+-- Mouse functions
+--
+
+isMouseButtonPressed :: EnumMouseButton -> MHGamer3D Bool
+isMouseButtonPressed mb = liftIO $ Mouse.isButtonPressed mb
+
+getMousePosition :: MHGamer3D (Int, Int)
+getMousePosition = liftIO Mouse2.getPosition
+
+
diff --git a/HGamer3D/BaseAPI.hs b/HGamer3D/BaseAPI.hs
new file mode 100644
--- /dev/null
+++ b/HGamer3D/BaseAPI.hs
@@ -0,0 +1,60 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- BaseAPI.hs
+
+-- |This module includes the basic API of HGamer3D
+
+module HGamer3D.BaseAPI
+
+(
+	module HGamer3D.Data.Colour,
+	module HGamer3D.Data.Vector,
+	module HGamer3D.Data.Angle,
+
+	module HGamer3D.APIs.Base.Audio,
+	module HGamer3D.APIs.Base.InputSystem,
+	module HGamer3D.APIs.Base.Common,
+	module HGamer3D.APIs.Base.Graphics3D.Engine3D,
+	module HGamer3D.APIs.Base.Graphics3D.Light,
+	module HGamer3D.APIs.Base.Graphics3D.Object3D,
+	
+	initHGamer3D
+
+)
+
+where
+
+import HGamer3D.Data.Colour
+import HGamer3D.Data.Vector
+import HGamer3D.Data.Angle
+
+import HGamer3D.APIs.Base.Audio
+import HGamer3D.APIs.Base.InputSystem
+import HGamer3D.APIs.Base.Common
+import HGamer3D.APIs.Base.Graphics3D.Engine3D
+import HGamer3D.APIs.Base.Graphics3D.Light
+import HGamer3D.APIs.Base.Graphics3D.Object3D
+
+import Control.Monad.Trans (liftIO)
+
+initHGamer3D windowName = do
+	cs <- initCommon
+	es <- initEngine3D cs windowName "OctreeSceneManager"
+	let s = [1..]
+	return ((cs, es), s)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+(c) 2011-2012 Peter Althainz
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,22 @@
+-- This source file is part of HGamer3D
+-- (A project to enable 3D game development in Haskell)
+-- For the latest info, see http://www.althainz.de/HGamer3D.html
+--
+-- (c) 2011 Peter Althainz
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Setup.hs
+
+import Distribution.Simple
+main = defaultMain
