diff --git a/CMakeLists.txt b/CMakeLists.txt
index a80e7d32..399ae965 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,6 +7,32 @@ cmake_minimum_required(VERSION 2.8)
 
 project(colobot C CXX)
 
+##
+# Project version
+##
+set(COLOBOT_VERSION_CODENAME "Gold")
+set(COLOBOT_VERSION_MAJOR    0)
+set(COLOBOT_VERSION_MINOR    1)
+set(COLOBOT_VERSION_REVISION 0)
+
+# Comment out when releasing
+set(COLOBOT_VERSION_UNRELEASED "~pre-alpha")
+
+# Append git characteristics to version
+if(DEFINED COLOBOT_VERSION_UNRELEASED AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
+	find_package(Git)
+	execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
+			OUTPUT_VARIABLE GIT_BRANCH
+			OUTPUT_STRIP_TRAILING_WHITESPACE)
+	execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
+			OUTPUT_VARIABLE GIT_REVISION
+			OUTPUT_STRIP_TRAILING_WHITESPACE)
+	set(COLOBOT_VERSION_UNRELEASED "${COLOBOT_VERSION_UNRELEASED}-git-${GIT_BRANCH}~r${GIT_REVISION}")
+endif()
+
+set(COLOBOT_VERSION_FULL "${COLOBOT_VERSION_MAJOR}.${COLOBOT_VERSION_MINOR}.${COLOBOT_VERSION_REVISION}${COLOBOT_VERSION_UNRELEASED}")
+message(STATUS "Building Colobot \"${COLOBOT_VERSION_CODENAME}\" (${COLOBOT_VERSION_FULL})")
+
 # Include cmake directory with some additional scripts
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${colobot_SOURCE_DIR}/cmake")
 
@@ -127,7 +153,7 @@ if(${TESTS})
     add_definitions(-DTEST_VIRTUAL=virtual)
     enable_testing()
 else()
-    add_definitions(-DTEST_VIRTUAL)
+    add_definitions(-DTEST_VIRTUAL=)
 endif()
 
 
@@ -183,11 +209,11 @@ if(${TESTS})
 endif()
 
 # Installation paths defined before compiling sources
-set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory")
-set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/games/colobot CACHE PATH "Colobot shared data directory")
-set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory")
-set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/colobot CACHE PATH "Colobot documentation directory")
-set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/share/locale CACHE PATH "Colobot translations directory")
+set(COLOBOT_INSTALL_BIN_DIR games CACHE PATH "Colobot binary directory")
+set(COLOBOT_INSTALL_DATA_DIR share/games/colobot CACHE PATH "Colobot shared data directory")
+set(COLOBOT_INSTALL_LIB_DIR lib/colobot CACHE PATH "Colobot libraries directory")
+set(COLOBOT_INSTALL_DOC_DIR share/doc/colobot CACHE PATH "Colobot documentation directory")
+set(COLOBOT_INSTALL_I18N_DIR share/locale CACHE PATH "Colobot translations directory")
 
 # Subdirectory with sources
 add_subdirectory(src bin)
diff --git a/src/CBot/CBotString.cpp b/src/CBot/CBotString.cpp
index 4795b637..b1b5fc46 100644
--- a/src/CBot/CBotString.cpp
+++ b/src/CBot/CBotString.cpp
@@ -127,7 +127,8 @@ CBotString::CBotString()
 
 CBotString::~CBotString()
 {
-    free(m_ptr);            //we can call free on null pointer as it's save
+    delete[] m_ptr;
+    m_ptr = nullptr;
 }
 
 
@@ -138,7 +139,7 @@ CBotString::CBotString(const char* p)
     m_ptr = NULL;
     if (m_lg>0)
     {
-        m_ptr = static_cast<char*>(malloc(m_lg+1));
+        m_ptr = new char[m_lg+1];
         strcpy(m_ptr, p);
     }
 }
@@ -150,7 +151,7 @@ CBotString::CBotString(const CBotString& srcString)
     m_ptr = NULL;
     if (m_lg>0)
     {
-        m_ptr = static_cast<char*>(malloc(m_lg+1));
+        m_ptr = new char[m_lg+1];
         strcpy(m_ptr, srcString.m_ptr);
     }
 }
@@ -285,12 +286,12 @@ CBotString CBotString::Mid(int start, int lg)
 
     if ( lg < 0 ) lg = m_lg - start;
 
-    char* p = static_cast<char*>(malloc(m_lg+1));
+    char* p = new char[m_lg+1];
     strcpy(p, m_ptr+start);
     p[lg] = 0;
 
     res = p;
-    free(p);
+    delete[] p;
     return res;
 }
 
@@ -314,15 +315,16 @@ void CBotString::MakeLower()
 
 bool CBotString::LoadString(unsigned int id)
 {
-    const char * str = NULL;
+    const char * str = nullptr;
     str = MapIdToString(static_cast<EID>(id));
-    if (m_ptr != NULL) free(m_ptr);
+    if (m_ptr != nullptr)
+        delete[] m_ptr;
 
     m_lg = strlen(str);
     m_ptr = NULL;
     if (m_lg > 0)
     {
-        m_ptr = static_cast<char*>(malloc(m_lg+1));
+        m_ptr = new char[m_lg+1];
         strcpy(m_ptr, str);
         return true;
     }
@@ -332,14 +334,14 @@ bool CBotString::LoadString(unsigned int id)
 
 const CBotString& CBotString::operator=(const CBotString& stringSrc)
 {
-    free(m_ptr);
-    m_ptr = NULL;
+    delete[] m_ptr;
+    m_ptr = nullptr;
 
     m_lg = stringSrc.m_lg; 
 
     if (m_lg > 0)
     {
-        m_ptr = static_cast<char*>(malloc(m_lg+1));
+        m_ptr = new char[m_lg+1];
         strcpy(m_ptr, stringSrc.m_ptr);
     }
 
@@ -355,13 +357,13 @@ CBotString operator+(const CBotString& string, const char * lpsz)
 
 const CBotString& CBotString::operator+(const CBotString& stringSrc)
 {
-    char* p = static_cast<char*>(malloc(m_lg+stringSrc.m_lg+1));
+    char* p = new char[m_lg+stringSrc.m_lg+1];
 
     if (m_ptr!=NULL) strcpy(p, m_ptr);
     char* pp = p + m_lg;
     if (stringSrc.m_ptr!=NULL) strcpy(pp, stringSrc.m_ptr);
 
-    free(m_ptr);
+    delete[] m_ptr;
     m_ptr = p;
     m_lg += stringSrc.m_lg;
 
@@ -370,11 +372,11 @@ const CBotString& CBotString::operator+(const CBotString& stringSrc)
 
 const CBotString& CBotString::operator=(const char ch)
 {
-    free(m_ptr);
+    delete[] m_ptr;
 
     m_lg = 1; 
 
-    m_ptr = static_cast<char*>(malloc(2));
+    m_ptr = new char[2];
     m_ptr[0] = ch;
     m_ptr[1] = 0;
 
@@ -383,16 +385,16 @@ const CBotString& CBotString::operator=(const char ch)
 
 const CBotString& CBotString::operator=(const char* pString)
 {
-    free(m_ptr);
-    m_ptr = NULL;
+    delete[] m_ptr;
+    m_ptr = nullptr;
 
-    if (pString != NULL)
+    if (pString != nullptr)
     {
         m_lg = strlen(pString); 
 
         if (m_lg != 0)
         {
-            m_ptr = static_cast<char*>(malloc(m_lg+1));
+            m_ptr = new char[m_lg+1];
             strcpy(m_ptr, pString);
         }
     }
@@ -403,13 +405,13 @@ const CBotString& CBotString::operator=(const char* pString)
 
 const CBotString& CBotString::operator+=(const char ch)
 {
-    char* p = static_cast<char*>(malloc(m_lg+2));
+    char* p = new char[m_lg+2];
 
-    if (m_ptr!=NULL) strcpy(p, m_ptr);
+    if (m_ptr != nullptr) strcpy(p, m_ptr);
     p[m_lg++] = ch;
     p[m_lg]   = 0;
 
-    free(m_ptr);
+    delete[] m_ptr;
 
     m_ptr = p;
 
@@ -418,7 +420,7 @@ const CBotString& CBotString::operator+=(const char ch)
 
 const CBotString& CBotString::operator+=(const CBotString& str)
 {
-    char* p = static_cast<char*>(malloc(m_lg+str.m_lg+1));
+    char* p = new char[m_lg+str.m_lg+1];
 
     strcpy(p, m_ptr);
     char* pp = p + m_lg;
@@ -426,7 +428,7 @@ const CBotString& CBotString::operator+=(const CBotString& str)
 
     m_lg = m_lg + str.m_lg;
 
-    free(m_ptr);
+    delete[] m_ptr;
 
     m_ptr = p;
 
@@ -500,8 +502,8 @@ bool CBotString::IsEmpty() const
 
 void CBotString::Empty()
 {
-    free(m_ptr);
-    m_ptr = NULL;
+    delete[] m_ptr;
+    m_ptr = nullptr;
     m_lg = 0;
 }
 
diff --git a/src/app/app.cpp b/src/app/app.cpp
index 118e1006..c936ac11 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -246,7 +246,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
         else if (arg == "-help")
         {
             GetLogger()->Message("\n");
-            GetLogger()->Message("COLOBOT GOLD pre-alpha\n");
+            GetLogger()->Message("Colobot %s (%s)\n",COLOBOT_CODENAME,COLOBOT_VERSION);
             GetLogger()->Message("\n");
             GetLogger()->Message("List of available options:\n");
             GetLogger()->Message("  -help            this help\n");
@@ -285,67 +285,32 @@ bool CApplication::Create()
         return false;
     }
 
-    /* Gettext initialization */
-
-    std::string locale = "";
-    switch (m_language)
-    {
-        default:
-        case LANGUAGE_ENV:
-            locale = "";
-            break;
-
-        case LANGUAGE_ENGLISH:
-            locale = "en_US.utf8";
-            break;
-
-        case LANGUAGE_GERMAN:
-            locale = "de_DE.utf8";
-            break;
-
-        case LANGUAGE_FRENCH:
-            locale = "fr_FR.utf8";
-            break;
-
-        case LANGUAGE_POLISH:
-            locale = "pl_PL.utf8";
-            break;
-    }
-
-    std::string langStr = "LANGUAGE=";
-    langStr += locale;
-    strcpy(S_LANGUAGE, langStr.c_str());
-    putenv(S_LANGUAGE);
-    setlocale(LC_ALL, locale.c_str());
-    GetLogger()->Debug("Set locale to '%s'\n", locale.c_str());
-
-    bindtextdomain("colobot", COLOBOT_I18N_DIR);
-    bind_textdomain_codeset("colobot", "UTF-8");
-    textdomain("colobot");
-
-    GetLogger()->Debug("Testing gettext translation: '%s'\n", gettext("Colobot rules!"));
+    SetLanguage(m_language);
 
     //Create the sound instance.
-    if (!GetProfile().InitCurrentDirectory()) {
+    if (!GetProfile().InitCurrentDirectory())
+    {
         GetLogger()->Warn("Config not found. Default values will be used!\n");
         m_sound = new CSoundInterface();
-    } else {
+    }
+    else
+    {
         std::string path;
         if (GetProfile().GetLocalProfileString("Resources", "Data", path))
             m_dataPath = path;
 
-	#ifdef OPENAL_SOUND
-	    m_sound = static_cast<CSoundInterface *>(new ALSound());
-	#else
-	    GetLogger()->Info("No sound support.\n");
-	    m_sound = new CSoundInterface();
-	#endif
+        #ifdef OPENAL_SOUND
+        m_sound = static_cast<CSoundInterface *>(new ALSound());
+        #else
+        GetLogger()->Info("No sound support.\n");
+        m_sound = new CSoundInterface();
+        #endif
 
         m_sound->Create(true);
         if (GetProfile().GetLocalProfileString("Resources", "Sound", path))
             m_sound->CacheAll(path);
         else
-            m_sound->CacheAll(m_dataPath);
+            m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND));
     }
 
     std::string standardInfoMessage =
@@ -1418,9 +1383,20 @@ std::string CApplication::GetDataDirPath()
     return m_dataPath;
 }
 
-std::string CApplication::GetDataFilePath(DataDir dataDir, const std::string& subpath)
+std::string CApplication::GetDataSubdirPath(DataDir stdDir)
 {
-    int index = static_cast<int>(dataDir);
+    int index = static_cast<int>(stdDir);
+    assert(index >= 0 && index < DIR_MAX);
+    std::stringstream str;
+    str << m_dataPath;
+    str << "/";
+    str << m_dataDirs[index];
+    return str.str();
+}
+
+std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& subpath)
+{
+    int index = static_cast<int>(stdDir);
     assert(index >= 0 && index < DIR_MAX);
     std::stringstream str;
     str << m_dataPath;
@@ -1431,23 +1407,104 @@ std::string CApplication::GetDataFilePath(DataDir dataDir, const std::string& su
     return str.str();
 }
 
-std::string CApplication::GetDataFilePath(const std::string& subpath)
-{
-    std::stringstream str;
-    str << m_dataPath;
-    str << "/";
-    str << subpath;
-    return str.str();
-}
-
 Language CApplication::GetLanguage()
 {
     return m_language;
 }
 
+char CApplication::GetLanguageChar()
+{
+    char langChar = 'E';
+    switch (m_language)
+    {
+        default:
+        case LANGUAGE_ENV:
+        case LANGUAGE_ENGLISH:
+            langChar = 'E';
+            break;
+
+        case LANGUAGE_GERMAN:
+            langChar = 'D';
+            break;
+
+        case LANGUAGE_FRENCH:
+            langChar = 'F';
+            break;
+
+        case LANGUAGE_POLISH:
+            langChar = 'P';
+            break;
+    }
+    return langChar;
+}
+
 void CApplication::SetLanguage(Language language)
 {
     m_language = language;
+
+    /* Gettext initialization */
+
+    std::string locale = "";
+    switch (m_language)
+    {
+        default:
+        case LANGUAGE_ENV:
+            locale = "";
+            break;
+
+        case LANGUAGE_ENGLISH:
+            locale = "en_US.utf8";
+            break;
+
+        case LANGUAGE_GERMAN:
+            locale = "de_DE.utf8";
+            break;
+
+        case LANGUAGE_FRENCH:
+            locale = "fr_FR.utf8";
+            break;
+
+        case LANGUAGE_POLISH:
+            locale = "pl_PL.utf8";
+            break;
+    }
+
+    if (locale.empty())
+    {
+        char *envLang = getenv("LANGUAGE");
+        if (strncmp(envLang,"en",2) == 0)
+        {
+           m_language = LANGUAGE_ENGLISH;
+        }
+        else if (strncmp(envLang,"de",2) == 0)
+        {
+           m_language = LANGUAGE_GERMAN;
+        }
+        else if (strncmp(envLang,"fr",2) == 0)
+        {
+           m_language = LANGUAGE_FRENCH;
+        }
+        else if (strncmp(envLang,"po",2) == 0)
+        {
+           m_language = LANGUAGE_POLISH;
+        }
+        GetLogger()->Trace("SetLanguage: Inherit LANGUAGE=%s from environment\n", envLang);
+    }
+    else
+    {
+        std::string langStr = "LANGUAGE=";
+        langStr += locale;
+        strcpy(S_LANGUAGE, langStr.c_str());
+        putenv(S_LANGUAGE);
+        GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
+    }
+    setlocale(LC_ALL, "");
+
+    bindtextdomain("colobot", COLOBOT_I18N_DIR);
+    bind_textdomain_codeset("colobot", "UTF-8");
+    textdomain("colobot");
+
+    GetLogger()->Debug("SetLanguage: Test gettext translation: '%s'\n", gettext("Colobot rules!"));
 }
 
 void CApplication::SetLowCPU(bool low)
diff --git a/src/app/app.h b/src/app/app.h
index 5bf68676..2da20d35 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -285,15 +285,16 @@ public:
     //! Returns the full path to data directory
     std::string GetDataDirPath();
 
-    //! Returns the full path to a file in data directory given standard dir and subpath
-    std::string GetDataFilePath(DataDir dir, const std::string &subpath);
+    //! Returns the full path to a standard dir in data directory
+    std::string GetDataSubdirPath(DataDir stdDir);
 
-    //! Returns the full path to a file in data directory given custom subpath in data dir
-    std::string GetDataFilePath(const std::string &subpath);
+    //! Returns the full path to a file in data directory given standard dir and subpath
+    std::string GetDataFilePath(DataDir stdDir, const std::string &subpath);
 
     //! Management of language
     //@{
     Language    GetLanguage();
+    char        GetLanguageChar();
     void        SetLanguage(Language language);
     //@}
 
diff --git a/src/common/config.h.cmake b/src/common/config.h.cmake
index dd280a38..022bb692 100644
--- a/src/common/config.h.cmake
+++ b/src/common/config.h.cmake
@@ -8,6 +8,10 @@
 #cmakedefine USE_GLEW @USE_GLEW@
 #cmakedefine GLEW_STATIC
 
+#define COLOBOT_VERSION "@COLOBOT_VERSION_FULL@"
+#define COLOBOT_CODENAME "@COLOBOT_VERSION_CODENAME@"
+#define COLOBOT_FULLNAME "Colobot @COLOBOT_VERSION_CODENAME@"
+
 #define COLOBOT_DEFAULT_DATADIR "@COLOBOT_INSTALL_DATA_DIR@"
 #define COLOBOT_I18N_DIR "@COLOBOT_INSTALL_I18N_DIR@"
 
diff --git a/src/common/image.cpp b/src/common/image.cpp
index f3cfa347..ef8097ea 100644
--- a/src/common/image.cpp
+++ b/src/common/image.cpp
@@ -124,14 +124,14 @@ bool PNGSaveSurface(const char *filename, SDL_Surface *surf)
     png_write_info(png_ptr, info_ptr);
     png_set_packing(png_ptr);
 
-    row_pointers = static_cast<png_bytep*>( malloc(sizeof(png_bytep)*surf->h) );
+    row_pointers = new png_bytep[surf->h];
     for (i = 0; i < surf->h; i++)
         row_pointers[i] = static_cast<png_bytep>( static_cast<Uint8 *>(surf->pixels) ) + i*surf->pitch;
     png_write_image(png_ptr, row_pointers);
     png_write_end(png_ptr, info_ptr);
 
     /* Cleaning out... */
-    free(row_pointers);
+    delete[] row_pointers;
     png_destroy_write_struct(&png_ptr, &info_ptr);
     fclose(fp);
 
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index da061313..4c56ae5d 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -17,6 +17,8 @@
 
 #include "common/restext.h"
 
+#include "common/config.h"
+
 #include "common/global.h"
 #include "common/event.h"
 #include "common/logger.h"
@@ -39,7 +41,7 @@ const char* stringsCbot[TX_MAX]         = { nullptr };
 
 void InitializeRestext()
 {
-    stringsText[RT_VERSION_ID]       = "Colobot Gold";
+    stringsText[RT_VERSION_ID]       = COLOBOT_FULLNAME;
 
     stringsText[RT_DISINFO_TITLE]    = "SatCom";
     stringsText[RT_WINDOW_MAXIMIZED] = "Maximize";
diff --git a/src/desktop/.gitignore b/src/desktop/.gitignore
new file mode 100644
index 00000000..bade6f32
--- /dev/null
+++ b/src/desktop/.gitignore
@@ -0,0 +1 @@
+lang/
diff --git a/src/desktop/CMakeLists.txt b/src/desktop/CMakeLists.txt
index cc159a9c..ce4f48d5 100644
--- a/src/desktop/CMakeLists.txt
+++ b/src/desktop/CMakeLists.txt
@@ -37,6 +37,41 @@ if(RSVG_CONVERT)
 	endforeach()
 endif()
 
+# Create manpage from pod-formatted file
+find_program(POD2MAN pod2man)
+if(POD2MAN)
+	set(COLOBOT_MANPAGE_SECTION 6)
+
+        macro(podman)
+		cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN})
+		if(PM_LOCALE)
+			# This copes with the fact that english has no "/LANG" in the paths and filenames.
+			set(SLASHLOCALE /${PM_LOCALE})
+		endif()
+		file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE})
+		add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
+                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE}
+                   COMMAND ${POD2MAN} ARGS --section=${COLOBOT_MANPAGE_SECTION}
+                                      --center="Colobot" --stderr --utf8
+                                      --release="${COLOBOT_VERSION_FULL}"
+                                      ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE}
+                                      ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
+		   COMMENT "Create ${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} manpage"
+                  )
+		add_custom_target(man${PM_LOCALE} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION})
+
+		install(
+			FILES ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
+		        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man${SLASHLOCALE}/man${COLOBOT_MANPAGE_SECTION}/ )
+
+		add_dependencies(man man${PM_LOCALE})
+	endmacro()
+
+	# Create the english manpage
+	podman(PODFILE colobot.pod)
+
+endif()
+
 # Translate translatable material
 find_program(PO4A po4a)
 
@@ -46,4 +81,17 @@ if(PO4A)
 		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 	)
 	add_dependencies(desktopfile desktop_po4a)
+
+	if(POD2MAN)
+		add_custom_target(man_po4a
+			COMMAND ${PO4A} po4a.cfg
+			WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+		)
+		add_dependencies(man man_po4a)
+		file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po)
+		string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO})
+		foreach(LOCALE ${LINGUAS})
+			podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE})
+		endforeach()
+	endif()
 endif()
diff --git a/src/desktop/colobot.pod b/src/desktop/colobot.pod
new file mode 100644
index 00000000..2fc3a00c
--- /dev/null
+++ b/src/desktop/colobot.pod
@@ -0,0 +1,47 @@
+=encoding utf8
+
+=head1 COLOBOT
+
+colobot - educational programming strategy game
+
+=head1 SYNOPSIS
+
+B<colobot> [B<-datadir> I<path>] [B<-debug>] [B<-loglevel> I<level>] [B<-language> I<lang>]
+
+=head1 DESCRIPTION
+
+Colobot (Colonize with Bots) is an educational game aiming to teach
+programming through entertainment. You are playing as an astronaut on a
+journey with robot helpers to find a planet for colonization. It features 3D
+real-time graphics and a C++ and Java-like, object-oriented language, CBOT,
+which can be used to program the robots available in the game.
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-help>
+
+Display a short help text
+
+=item B<-datadir> F</path/to/data/>
+
+Set custom data directory path
+
+=item B<-debug>
+
+Enable debug mode (more info printed in logs)
+
+=item B<-loglevel> I<level>
+
+Set log level. Possible choices are: trace, debug, info, warn, error, none.
+
+=item B<-language> I<lang>
+
+Set language. Note that you can also fill the B<LANG> environment variable.
+
+=back
+
+=head1 AUTHOR
+
+This manpage was written by Didier Raboud <S<odyx@debian.org>>.
diff --git a/src/desktop/po/colobot-desktop.pot b/src/desktop/po/colobot-desktop.pot
index e74136a9..17e60c3b 100644
--- a/src/desktop/po/colobot-desktop.pot
+++ b/src/desktop/po/colobot-desktop.pot
@@ -7,13 +7,13 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2012-12-26 15:05+0100\n"
+"POT-Creation-Date: 2012-12-27 10:59+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Language: \n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 #: colobot.ini:1
@@ -30,3 +30,105 @@ msgstr ""
 #, no-wrap
 msgid "Colonize with bots"
 msgstr ""
+
+#. type: =head1
+#: colobot.pod:3
+msgid "COLOBOT"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:5
+msgid "colobot - educational programming strategy game"
+msgstr ""
+
+#. type: =head1
+#: colobot.pod:7
+msgid "SYNOPSIS"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:9
+msgid ""
+"B<colobot> [B<-datadir> I<path>] [B<-debug>] [B<-loglevel> I<level>] "
+"[B<-language> I<lang>]"
+msgstr ""
+
+#. type: =head1
+#: colobot.pod:11
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:13
+msgid ""
+"Colobot (Colonize with Bots) is an educational game aiming to teach "
+"programming through entertainment. You are playing as an astronaut on a "
+"journey with robot helpers to find a planet for colonization. It features 3D "
+"real-time graphics and a C++ and Java-like, object-oriented language, CBOT, "
+"which can be used to program the robots available in the game."
+msgstr ""
+
+#. type: =head1
+#: colobot.pod:19
+msgid "OPTIONS"
+msgstr ""
+
+#. type: =item
+#: colobot.pod:23
+msgid "B<-help>"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:25
+msgid "Display a short help text"
+msgstr ""
+
+#. type: =item
+#: colobot.pod:27
+msgid "B<-datadir> F</path/to/data/>"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:29
+msgid "Set custom data directory path"
+msgstr ""
+
+#. type: =item
+#: colobot.pod:31
+msgid "B<-debug>"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:33
+msgid "Enable debug mode (more info printed in logs)"
+msgstr ""
+
+#. type: =item
+#: colobot.pod:35
+msgid "B<-loglevel> I<level>"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:37
+msgid "Set log level. Possible choices are: trace, debug, info, warn, error, none."
+msgstr ""
+
+#. type: =item
+#: colobot.pod:39
+msgid "B<-language> I<lang>"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:41
+msgid "Set language. Note that you can also fill the B<LANG> environment variable."
+msgstr ""
+
+#. type: =head1
+#: colobot.pod:45
+msgid "AUTHOR"
+msgstr ""
+
+#. type: textblock
+#: colobot.pod:47
+msgid "This manpage was written by Didier Raboud <S<odyx@debian.org>>."
+msgstr ""
diff --git a/src/desktop/po/fr.po b/src/desktop/po/fr.po
index 63dbb239..4709d491 100644
--- a/src/desktop/po/fr.po
+++ b/src/desktop/po/fr.po
@@ -1,13 +1,13 @@
 # French translations for PACKAGE package
 # Copyright (C) 2012 Free Software Foundation, Inc.
 # This file is distributed under the same license as the PACKAGE package.
-# Automatically generated, 2012.
 #
+# Didier Raboud <odyx@debian.org>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2012-12-26 15:05+0100\n"
-"PO-Revision-Date: 2012-12-26 15:05+0100\n"
+"POT-Creation-Date: 2012-12-27 10:55+0100\n"
+"PO-Revision-Date: 2012-12-27 11:00+0100\n"
 "Last-Translator: Didier Raboud <odyx@debian.org>\n"
 "Language-Team: none\n"
 "Language: fr\n"
@@ -30,3 +30,124 @@ msgstr "Apprentissage de la programmation par le jeu"
 #, no-wrap
 msgid "Colonize with bots"
 msgstr "Colonise avec des roBots"
+
+#. type: =head1
+#: colobot.pod:3
+msgid "COLOBOT"
+msgstr "COLOBOT"
+
+#. type: textblock
+#: colobot.pod:5
+msgid "colobot - educational programming strategy game"
+msgstr "colobot - Jeu éducatif de stratégie et de programmation"
+
+#. type: =head1
+#: colobot.pod:7
+msgid "SYNOPSIS"
+msgstr "RÉSUMÉ"
+
+#. type: textblock
+#: colobot.pod:9
+msgid ""
+"B<colobot> [B<-datadir> I<path>] [B<-debug>] [B<-loglevel> I<level>] [B<-"
+"language> I<lang>]"
+msgstr ""
+"B<colobot> [B<-datadir> I<chemin>] [B<-debug>] [B<-loglevel> I<niveau>] [B<-"
+"language> I<code-de-langue>]"
+
+#. type: =head1
+#: colobot.pod:11
+msgid "DESCRIPTION"
+msgstr "DESCRIPTION"
+
+#. type: textblock
+#: colobot.pod:13
+msgid ""
+"Colobot (Colonize with Bots) is an educational game aiming to teach "
+"programming through entertainment. You are playing as an astronaut on a "
+"journey with robot helpers to find a planet for colonization. It features 3D "
+"real-time graphics and a C++ and Java-like, object-oriented language, CBOT, "
+"which can be used to program the robots available in the game."
+msgstr ""
+"Colobot (Colonise avec des roBots) est un jeu éducatif visant à "
+"l'enseignement de la programmation par le jeu. Vous jouez un astronaute en "
+"voyage avec des robots à la recherche d'une planète à coloniser. Son "
+"interface est en trois-dimensions et en temps réel; le language utilisé "
+"(CBOT) ressemble au C++ et à Java et peut être utilisé pour programmer les "
+"robots disponibles dans le jeu."
+
+#. type: =head1
+#: colobot.pod:19
+msgid "OPTIONS"
+msgstr "OPTIONS"
+
+#. type: =item
+#: colobot.pod:23
+msgid "B<-help>"
+msgstr "B<-help>"
+
+#. type: textblock
+#: colobot.pod:25
+msgid "Display a short help text"
+msgstr "Affiche un court texte d'aide"
+
+#. type: =item
+#: colobot.pod:27
+msgid "B<-datadir> F</path/to/data/>"
+msgstr "B<-datadir> F</chemin/vers/les/donnes/>"
+
+#. type: textblock
+#: colobot.pod:29
+msgid "Set custom data directory path"
+msgstr "Définit le chemin vers un répertoire de données spécifique"
+
+#. type: =item
+#: colobot.pod:31
+msgid "B<-debug>"
+msgstr "B<-debug>"
+
+#. type: textblock
+#: colobot.pod:33
+msgid "Enable debug mode (more info printed in logs)"
+msgstr ""
+"Active le mode de déboguage (plus d'informations sont affichées dans le "
+"journal)"
+
+#. type: =item
+#: colobot.pod:35
+msgid "B<-loglevel> I<level>"
+msgstr "B<-loglevel> I<niveau>"
+
+#. type: textblock
+#: colobot.pod:37
+msgid ""
+"Set log level. Possible choices are: trace, debug, info, warn, error, none."
+msgstr ""
+"Définit le niveau de journalisation parmi: trace, debug, info, warn, error, "
+"none."
+
+#. type: =item
+#: colobot.pod:39
+msgid "B<-language> I<lang>"
+msgstr "B<-language> I<langue>"
+
+#. type: textblock
+#: colobot.pod:41
+msgid ""
+"Set language. Note that you can also fill the B<LANG> environment variable."
+msgstr ""
+"Définit la langue. Il est aussi possible d'utiliser la variable "
+"d'environnement B<LANG>."
+
+#. type: =head1
+#: colobot.pod:45
+msgid "AUTHOR"
+msgstr "Auteur"
+
+#. type: textblock
+#: colobot.pod:47
+msgid "This manpage was written by Didier Raboud <S<odyx@debian.org>>."
+msgstr ""
+"Cette page de manuel a été écrite et traduite par Didier Raboud "
+"<S<odyx@debian.org>>."
+
diff --git a/src/desktop/po4a.cfg b/src/desktop/po4a.cfg
index eda29859..c2519590 100644
--- a/src/desktop/po4a.cfg
+++ b/src/desktop/po4a.cfg
@@ -1,3 +1,4 @@
 [po_directory] po/
 
 [type:ini] colobot.ini $lang:lang/$lang/colobot.ini
+[type:pod] colobot.pod $lang:lang/$lang/colobot.pod
diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp
index 66c73a9f..101e01a4 100644
--- a/src/graphics/engine/text.cpp
+++ b/src/graphics/engine/text.cpp
@@ -677,7 +677,7 @@ void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, Math::P
         return;
 
     int width = 1;
-    if (ch.c1 < 32) { // FIXME add support for chars with code 9 10 23
+    if (ch.c1 > 0 && ch.c1 < 32) { // FIXME add support for chars with code 9 10 23
         ch.c1 = ' ';
         ch.c2 = 0;
         ch.c3 = 0;
diff --git a/src/object/brain.cpp b/src/object/brain.cpp
index 4ce1bf88..ef7309d5 100644
--- a/src/object/brain.cpp
+++ b/src/object/brain.cpp
@@ -99,7 +99,7 @@ CBrain::CBrain(CInstanceManager* iMan, CObject* object)
     m_selScript = 0;
 
     m_bTraceRecord = false;
-    m_traceRecordBuffer = 0;
+    m_traceRecordBuffer = nullptr;
 }
 
 // Object's destructor.
@@ -111,12 +111,21 @@ CBrain::~CBrain()
     for ( i=0 ; i<BRAINMAXSCRIPT ; i++ )
     {
         delete m_script[i];
+        m_script[i] = nullptr;
     }
 
     delete m_primaryTask;
+    m_primaryTask = nullptr;
+
     delete m_secondaryTask;
+    m_secondaryTask = nullptr;
+
     delete m_studio;
-    delete m_traceRecordBuffer;
+    m_studio = nullptr;
+
+    delete[] m_traceRecordBuffer;
+    m_traceRecordBuffer = nullptr;
+
     m_iMan->DeleteInstance(CLASS_BRAIN, this);
 }
 
@@ -2791,8 +2800,8 @@ void CBrain::TraceRecordStart()
         m_traceColor = -1;
     }
 
-    delete m_traceRecordBuffer;
-    m_traceRecordBuffer = static_cast<TraceRecord*>(malloc(sizeof(TraceRecord)*MAXTRACERECORD));
+    delete[] m_traceRecordBuffer;
+    m_traceRecordBuffer = new TraceRecord[MAXTRACERECORD];
     m_traceRecordIndex = 0;
 }
 
@@ -2858,10 +2867,10 @@ void CBrain::TraceRecordStop()
     int         max, i;
     char*       buffer;
 
-    if ( m_traceRecordBuffer == 0 )  return;
+    if ( m_traceRecordBuffer == nullptr )  return;
 
     max = 10000;
-    buffer = static_cast<char*>(malloc(max));
+    buffer = new char[max];
     *buffer = 0;
     strncat(buffer, "extern void object::AutoDraw()\n{\n", max-1);
 
@@ -2892,8 +2901,8 @@ void CBrain::TraceRecordStop()
     }
     TraceRecordPut(buffer, max, lastOper, lastParam);
 
-    delete m_traceRecordBuffer;
-    m_traceRecordBuffer = 0;
+    delete[] m_traceRecordBuffer;
+    m_traceRecordBuffer = nullptr;
 
     strncat(buffer, "}\n", max-1);
     buffer[max-1] = 0;
@@ -2904,7 +2913,7 @@ void CBrain::TraceRecordStop()
         m_script[i] = new CScript(m_iMan, m_object, &m_secondaryTask);
     }
     m_script[i]->SendScript(buffer);
-    delete buffer;
+    delete[] buffer;
 }
 
 // Saves an instruction CBOT.
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index d5805d0b..aa2fe225 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -3808,16 +3808,16 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
             }
         }
 
-        // TODO: language letters
-        sprintf(op, "Title.%c", 'E' /*GetLanguageLetter()*/);
+        // TODO: Fallback to an non-localized entry
+        sprintf(op, "Title.%c", m_app->GetLanguageChar());
         if (Cmd(line, op) && !resetObject)
             OpString(line, "text", m_title);
 
-        sprintf(op, "Resume.%c", 'E' /*GetLanguageLetter()*/);
+        sprintf(op, "Resume.%c", m_app->GetLanguageChar());
         if (Cmd(line, op) && !resetObject)
             OpString(line, "text", m_resume);
 
-        sprintf(op, "ScriptName.%c", 'E' /*GetLanguageLetter()*/);
+        sprintf(op, "ScriptName.%c", m_app->GetLanguageChar());
         if (Cmd(line, op) && !resetObject)
             OpString(line, "text", m_scriptName);
 
diff --git a/src/object/task/taskgoto.cpp b/src/object/task/taskgoto.cpp
index ce778ef4..cab57f1c 100644
--- a/src/object/task/taskgoto.cpp
+++ b/src/object/task/taskgoto.cpp
@@ -2119,7 +2119,7 @@ bool CTaskGoto::BitmapOpen()
     BitmapClose();
 
     m_bmSize = static_cast<int>(3200.0f/BM_DIM_STEP);
-    m_bmArray = static_cast<unsigned char*>(malloc(m_bmSize*m_bmSize/8*2));
+    m_bmArray = new unsigned char[m_bmSize*m_bmSize/8*2];
     memset(m_bmArray, 0, m_bmSize*m_bmSize/8*2);
 
     m_bmOffset = m_bmSize/2;
@@ -2137,7 +2137,7 @@ bool CTaskGoto::BitmapOpen()
 
 bool CTaskGoto::BitmapClose()
 {
-    free(m_bmArray);
+    delete[] m_bmArray;
     m_bmArray = 0;
     return true;
 }
diff --git a/src/po/CMakeLists.txt b/src/po/CMakeLists.txt
index 3b26571f..df667dd1 100644
--- a/src/po/CMakeLists.txt
+++ b/src/po/CMakeLists.txt
@@ -6,14 +6,13 @@ find_program(XGETTEXT_CMD xgettext)
 
 add_custom_command(OUTPUT ${_potFile}
     COMMAND ${XGETTEXT_CMD} ../app/app.cpp --output=${_potFile}
-    COMMAND ${XGETTEXT_CMD} ../common/restext_strings.c --output=${_potFile} --join-existing --extract-all --no-location
+    COMMAND ${XGETTEXT_CMD} ../common/restext.cpp --output=${_potFile} --join-existing --extract-all --no-location
 
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
     COMMENT "Extract translatable messages to ${_potFile}"
 )
 
-add_custom_target(_${potFile} ${_all} DEPENDS ${_potFile})
+add_custom_target(update-pot DEPENDS ${_potFile})
 
 file(GLOB _poFiles *.po)
-
 gettext_create_translations(${_potFile} ALL ${_poFiles})
diff --git a/src/po/colobot.pot b/src/po/colobot.pot
index d0a9c128..e1f9dc74 100644
--- a/src/po/colobot.pot
+++ b/src/po/colobot.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-13 21:46+0100\n"
+"POT-Creation-Date: 2012-12-27 17:09+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -20,9 +20,6 @@ msgstr ""
 msgid "Colobot rules!"
 msgstr ""
 
-msgid "Colobot Gold"
-msgstr ""
-
 msgid "SatCom"
 msgstr ""
 
@@ -1436,7 +1433,7 @@ msgstr ""
 msgid "Program infected by a virus"
 msgstr ""
 
-msgid "Infected by a virus, temporarily out of order"
+msgid "Infected by a virus; temporarily out of order"
 msgstr ""
 
 msgid "Impossible when swimming"
@@ -1464,7 +1461,7 @@ msgstr ""
 msgid "Building destroyed"
 msgstr ""
 
-msgid "Can not create this, there are too many objects"
+msgid "Can not create this; there are too many objects"
 msgstr ""
 
 #, c-format
@@ -1528,10 +1525,10 @@ msgstr ""
 msgid "Found a site for a derrick"
 msgstr ""
 
-msgid "<<< Well done, mission accomplished >>>"
+msgid "<<< Well done; mission accomplished >>>"
 msgstr ""
 
-msgid "<<< Sorry, mission failed >>>"
+msgid "<<< Sorry; mission failed >>>"
 msgstr ""
 
 msgid "Current mission saved"
@@ -1612,7 +1609,7 @@ msgstr ""
 msgid "Instruction \"break\" outside a loop"
 msgstr ""
 
-msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\""
+msgid "A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\""
 msgstr ""
 
 msgid "This label does not exist"
@@ -1734,3 +1731,88 @@ msgstr ""
 
 msgid "Write error"
 msgstr ""
+
+msgid "left;"
+msgstr ""
+
+msgid "right;"
+msgstr ""
+
+msgid "up;"
+msgstr ""
+
+msgid "down;"
+msgstr ""
+
+msgid "gup;"
+msgstr ""
+
+msgid "gdown;"
+msgstr ""
+
+msgid "camera;"
+msgstr ""
+
+msgid "desel;"
+msgstr ""
+
+msgid "action;"
+msgstr ""
+
+msgid "near;"
+msgstr ""
+
+msgid "away;"
+msgstr ""
+
+msgid "next;"
+msgstr ""
+
+msgid "human;"
+msgstr ""
+
+msgid "quit;"
+msgstr ""
+
+msgid "help;"
+msgstr ""
+
+msgid "prog;"
+msgstr ""
+
+msgid "cbot;"
+msgstr ""
+
+msgid "visit;"
+msgstr ""
+
+msgid "speed10;"
+msgstr ""
+
+msgid "speed15;"
+msgstr ""
+
+msgid "speed20;"
+msgstr ""
+
+#, c-format
+msgid "GetResource event num out of range: %d\n"
+msgstr ""
+
+msgid "Ctrl"
+msgstr ""
+
+msgid "Shift"
+msgstr ""
+
+msgid "Alt"
+msgstr ""
+
+msgid "Win"
+msgstr ""
+
+msgid "Button %1"
+msgstr ""
+
+msgid "%1"
+msgstr ""
diff --git a/src/po/de.po b/src/po/de.po
index bbd0b776..2992cb1b 100644
--- a/src/po/de.po
+++ b/src/po/de.po
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-13 21:46+0100\n"
+"POT-Creation-Date: 2012-12-27 17:09+0100\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -64,6 +64,9 @@ msgstr "Es fehlt eine geschlossene eckige Klammer \" ] \""
 msgid "\"%s\" missing in this exercise"
 msgstr "Es fehlt \"%s\" in Ihrem Programm"
 
+msgid "%1"
+msgstr ""
+
 msgid "..behind"
 msgstr "..hinten"
 
@@ -85,13 +88,16 @@ msgstr "3D-Geräusche\\Orten der Geräusche im Raum"
 msgid "<<  Back  \\Back to the previous screen"
 msgstr "<<  Zurück  \\Zurück zum Hauptmenü"
 
-msgid "<<< Sorry, mission failed >>>"
+#, fuzzy
+msgid "<<< Sorry; mission failed >>>"
 msgstr "<<< Mission gescheitert >>>"
 
-msgid "<<< Well done, mission accomplished >>>"
+#, fuzzy
+msgid "<<< Well done; mission accomplished >>>"
 msgstr "<<< Bravo, Mission vollendet >>>"
 
-msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\""
+#, fuzzy
+msgid "A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\""
 msgstr ""
 "Ein Label kann nur vor den Anweisungen \"for\", \"while\", \"do\" oder "
 "\"switch\" vorkommen"
@@ -122,6 +128,9 @@ msgstr "Insektenkönigin tödlich verwundet"
 msgid "Already carrying something"
 msgstr "Trägt schon etwas"
 
+msgid "Alt"
+msgstr "Alt"
+
 msgid "Analysis already performed"
 msgstr "Analyse schon durchgeführt"
 
@@ -299,6 +308,9 @@ msgstr "Gebäude zerstört"
 msgid "Building too close"
 msgstr "Gebäude zu nahe"
 
+msgid "Button %1"
+msgstr "Knopf %1"
+
 msgid "COLOBOT"
 msgstr "COLOBOT"
 
@@ -326,7 +338,8 @@ msgstr "Kamera links"
 msgid "Camera to right"
 msgstr "Kamera rechts"
 
-msgid "Can not create this, there are too many objects"
+#, fuzzy
+msgid "Can not create this; there are too many objects"
 msgstr "Kein neues Objekt kann erstellt werden (zu viele vorhanden)"
 
 msgid "Can't open file"
@@ -365,9 +378,6 @@ msgstr "Schließen"
 msgid "Closing bracket missing "
 msgstr "Es fehlt eine geschlossene Klammer \")\""
 
-msgid "Colobot Gold"
-msgstr "Colobot Gold"
-
 msgid "Colobot rules!"
 msgstr "Colobot ist wunderbar!"
 
@@ -404,6 +414,9 @@ msgstr "Kopieren"
 msgid "Copy (Ctrl+c)"
 msgstr "Kopieren (Ctrl+c)"
 
+msgid "Ctrl"
+msgstr "Ctrl"
+
 msgid "Current mission saved"
 msgstr "Mission gespeichert"
 
@@ -610,6 +623,10 @@ msgstr "Spiel\\Gameplay Einstellungen"
 msgid "Gantry crane"
 msgstr "Träger"
 
+#, c-format
+msgid "GetResource event num out of range: %d\n"
+msgstr ""
+
 msgid "Goto: destination occupied"
 msgstr "Ziel ist schon besetzt"
 
@@ -682,7 +699,8 @@ msgstr "Falscher Batterietyp"
 msgid "Incorrect index type"
 msgstr "Falscher Typ für einen Index"
 
-msgid "Infected by a virus, temporarily out of order"
+#, fuzzy
+msgid "Infected by a virus; temporarily out of order"
 msgstr "Von Virus infiziert, zeitweise außer Betrieb"
 
 msgid "Information exchange post"
@@ -1256,6 +1274,9 @@ msgstr "Reichweite Schutzschild"
 msgid "Shielder"
 msgstr "Schutzschild"
 
+msgid "Shift"
+msgstr "Shift"
+
 msgid "Shoot (\\key action;)"
 msgstr "Feuer (\\key action;)"
 
@@ -1565,6 +1586,9 @@ msgstr "Shooter"
 msgid "Wheeled sniffer"
 msgstr "Schnüffler"
 
+msgid "Win"
+msgstr ""
+
 msgid "Winged grabber"
 msgstr "Transporter"
 
@@ -1730,6 +1754,69 @@ msgstr "\\b;Liste der Roboter\n"
 msgid "\\c; (none)\\n;\n"
 msgstr "\\c; (keine)\\n;\n"
 
+msgid "action;"
+msgstr ""
+
+msgid "away;"
+msgstr ""
+
+msgid "camera;"
+msgstr ""
+
+msgid "cbot;"
+msgstr ""
+
+msgid "desel;"
+msgstr ""
+
+msgid "down;"
+msgstr ""
+
+msgid "gdown;"
+msgstr ""
+
+msgid "gup;"
+msgstr ""
+
+msgid "help;"
+msgstr ""
+
+msgid "human;"
+msgstr ""
+
+msgid "left;"
+msgstr ""
+
+msgid "near;"
+msgstr ""
+
+msgid "next;"
+msgstr ""
+
+msgid "prog;"
+msgstr ""
+
+msgid "quit;"
+msgstr ""
+
+msgid "right;"
+msgstr ""
+
+msgid "speed10;"
+msgstr ""
+
+msgid "speed15;"
+msgstr ""
+
+msgid "speed20;"
+msgstr ""
+
+msgid "up;"
+msgstr ""
+
+msgid "visit;"
+msgstr ""
+
 msgid "www.epsitec.com"
 msgstr "www.epsitec.com"
 
@@ -1739,9 +1826,6 @@ msgstr "www.epsitec.com"
 #~ msgid "<--"
 #~ msgstr "<--"
 
-#~ msgid "Alt"
-#~ msgstr "Alt"
-
 #~ msgid "Application key"
 #~ msgstr "Application key"
 
@@ -1760,9 +1844,6 @@ msgstr "www.epsitec.com"
 #~ msgid "Attn"
 #~ msgstr "Attn"
 
-#~ msgid "Button %1"
-#~ msgstr "Knopf %1"
-
 #~ msgid "Caps Lock"
 #~ msgstr "Caps Lock"
 
@@ -1775,9 +1856,6 @@ msgstr "www.epsitec.com"
 #~ msgid "CrSel"
 #~ msgstr "CrSel"
 
-#~ msgid "Ctrl"
-#~ msgstr "Ctrl"
-
 #~ msgid "Delete Key"
 #~ msgstr "Delete"
 
@@ -1961,9 +2039,6 @@ msgstr "www.epsitec.com"
 #~ msgid "Select"
 #~ msgstr "Select"
 
-#~ msgid "Shift"
-#~ msgstr "Shift"
-
 #~ msgid "Space"
 #~ msgstr "Leertaste"
 
diff --git a/src/po/fr.po b/src/po/fr.po
index bda683d6..662fb93b 100644
--- a/src/po/fr.po
+++ b/src/po/fr.po
@@ -1,13 +1,18 @@
+# Didier Raboud <odyx@debian.org>, 2012.
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-13 21:46+0100\n"
+"POT-Creation-Date: 2012-12-27 17:09+0100\n"
+"PO-Revision-Date: 2012-12-27 14:07+0100\n"
+"Last-Translator: Didier Raboud <odyx@debian.org>\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "X-Language: fr_FR\n"
 "X-Source-Language: en_US\n"
+"X-Generator: Lokalize 1.4\n"
 
 msgid " "
 msgstr " "
@@ -37,7 +42,7 @@ msgid " Missions on this planet:"
 msgstr " Liste des missions du chapitre :"
 
 msgid " Planets:"
-msgstr " Liste des plančtes :"
+msgstr " Liste des planètes :"
 
 msgid " Prototypes on this planet:"
 msgstr " Liste des prototypes du chapitre :"
@@ -64,8 +69,11 @@ msgstr "\" ] \" attendu"
 msgid "\"%s\" missing in this exercise"
 msgstr "Il manque \"%s\" dans le programme"
 
+msgid "%1"
+msgstr "%1"
+
 msgid "..behind"
-msgstr "..derričre"
+msgstr "..derrière"
 
 msgid "..in front"
 msgstr "..devant"
@@ -74,7 +82,7 @@ msgid "..power cell"
 msgstr "..pile"
 
 msgid "1) First click on the key you want to redefine."
-msgstr "1) Cliquez d'abord sur la touche ŕ redéfinir."
+msgstr "1) Cliquez d'abord sur la touche à redéfinir."
 
 msgid "2) Then press the key you want to use instead."
 msgstr "2) Appuyez ensuite sur la nouvelle touche souhaitée."
@@ -85,15 +93,15 @@ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace"
 msgid "<<  Back  \\Back to the previous screen"
 msgstr "<<  Retour  \\Retour au niveau précédent"
 
-msgid "<<< Sorry, mission failed >>>"
-msgstr "<<< Désolé, mission échouée >>>"
+msgid "<<< Sorry; mission failed >>>"
+msgstr "<<< Désolé; mission échouée >>>"
 
-msgid "<<< Well done, mission accomplished >>>"
-msgstr "<<< Bravo, mission terminée >>>"
+msgid "<<< Well done; mission accomplished >>>"
+msgstr "<<< Bravo; mission terminée >>>"
 
-msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\""
+msgid "A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\""
 msgstr ""
-"Un label ne peut se placer que devant un \"for\", un \"while\", un \"do\" ou "
+"Un label ne peut se placer que devant un \"for\"; un \"while\"; un \"do\" ou "
 "un \"switch\""
 
 msgid "A variable can not be declared twice"
@@ -103,14 +111,14 @@ msgid "Abort\\Abort the current mission"
 msgstr "Abandonner\\Abandonner la mission en cours"
 
 msgid "Access beyond array limit"
-msgstr "Accčs hors du tableau"
+msgstr "Accès hors du tableau"
 
 msgid ""
 "Access to solution\\Shows the solution (detailed instructions for missions)"
-msgstr "Accčs ŕ la solution\\Donne la solution"
+msgstr "Accès à la solution\\Donne la solution"
 
 msgid "Access to solutions\\Show program \"4: Solution\" in the exercises"
-msgstr "Accčs aux solutions\\Programme \"4: Solution\" dans les exercices"
+msgstr "Accès aux solutions\\Programme \"4: Solution\" dans les exercices"
 
 msgid "Alien Queen"
 msgstr "Pondeuse"
@@ -119,16 +127,19 @@ msgid "Alien Queen killed"
 msgstr "Pondeuse mortellement touchée"
 
 msgid "Already carrying something"
-msgstr "Porte déjŕ quelque chose"
+msgstr "Porte déjà quelque chose"
+
+msgid "Alt"
+msgstr "Alt"
 
 msgid "Analysis already performed"
-msgstr "Analyse déjŕ effectuée"
+msgstr "Analyse déjà effectuée"
 
 msgid "Analysis performed"
 msgstr "Analyse terminée"
 
 msgid "Analyzes only organic matter"
-msgstr "N'analyse que la matičre organique"
+msgstr "N'analyse que la matière organique"
 
 msgid "Ant"
 msgstr "Fourmi"
@@ -149,7 +160,7 @@ msgid "Assignment impossible"
 msgstr "Assignation impossible"
 
 msgid "Autolab"
-msgstr "Laboratoire de matičres organiques"
+msgstr "Laboratoire de matières organiques"
 
 msgid "Automatic indent\\When program editing"
 msgstr "Indentation automatique\\Pendant l'édition d'un programme"
@@ -164,7 +175,7 @@ msgid "Backward (\\key down;)"
 msgstr "Recule (\\key down;)"
 
 msgid "Backward\\Moves backward"
-msgstr "Reculer\\Moteur en arričre"
+msgstr "Reculer\\Moteur en arrière"
 
 msgid "Bad argument for \"new\""
 msgstr "Mauvais argument pour \"new\""
@@ -203,16 +214,16 @@ msgid "Build a exchange post"
 msgstr "Construit une borne d'information"
 
 msgid "Build a legged grabber"
-msgstr "Fabrique un déménageur ŕ pattes"
+msgstr "Fabrique un déménageur à pattes"
 
 msgid "Build a legged orga shooter"
-msgstr "Fabrique un orgaShooter ŕ pattes"
+msgstr "Fabrique un orgaShooter à pattes"
 
 msgid "Build a legged shooter"
-msgstr "Fabrique un shooter ŕ pattes"
+msgstr "Fabrique un shooter à pattes"
 
 msgid "Build a legged sniffer"
-msgstr "Fabrique un renifleur ŕ pattes"
+msgstr "Fabrique un renifleur à pattes"
 
 msgid "Build a lightning conductor"
 msgstr "Construit un paratonnerre"
@@ -251,28 +262,28 @@ msgid "Build a thumper"
 msgstr "Fabrique un robot secoueur"
 
 msgid "Build a tracked grabber"
-msgstr "Fabrique un déménageur ŕ chenilles"
+msgstr "Fabrique un déménageur à chenilles"
 
 msgid "Build a tracked orga shooter"
-msgstr "Fabrique un orgaShooter ŕ chenilles"
+msgstr "Fabrique un orgaShooter à chenilles"
 
 msgid "Build a tracked shooter"
-msgstr "Fabrique un shooter ŕ chenilles"
+msgstr "Fabrique un shooter à chenilles"
 
 msgid "Build a tracked sniffer"
-msgstr "Fabrique un renifleur ŕ chenilles"
+msgstr "Fabrique un renifleur à chenilles"
 
 msgid "Build a wheeled grabber"
-msgstr "Fabrique un déménageur ŕ roues"
+msgstr "Fabrique un déménageur à roues"
 
 msgid "Build a wheeled orga shooter"
-msgstr "Fabrique un orgaShooter ŕ roues"
+msgstr "Fabrique un orgaShooter à roues"
 
 msgid "Build a wheeled shooter"
-msgstr "Fabrique un shooter ŕ roues"
+msgstr "Fabrique un shooter à roues"
 
 msgid "Build a wheeled sniffer"
-msgstr "Fabrique un renifleur ŕ roues"
+msgstr "Fabrique un renifleur à roues"
 
 msgid "Build a winged grabber"
 msgstr "Fabrique un déménageur volant"
@@ -298,6 +309,9 @@ msgstr "Bâtiment détruit"
 msgid "Building too close"
 msgstr "Bâtiment trop proche"
 
+msgid "Button %1"
+msgstr "Bouton %1"
+
 msgid "COLOBOT"
 msgstr "COLOBOT"
 
@@ -320,13 +334,13 @@ msgid "Camera nearest"
 msgstr "Caméra plus proche"
 
 msgid "Camera to left"
-msgstr "Caméra ŕ gauche"
+msgstr "Caméra à gauche"
 
 msgid "Camera to right"
-msgstr "Caméra ŕ droite"
+msgstr "Caméra à droite"
 
-msgid "Can not create this, there are too many objects"
-msgstr "Création impossible, il y a trop d'objets"
+msgid "Can not create this; there are too many objects"
+msgstr "Création impossible; il y a trop d'objets"
 
 msgid "Can't open file"
 msgstr "Ouverture du fichier impossible"
@@ -362,10 +376,7 @@ msgid "Close"
 msgstr "Fermer"
 
 msgid "Closing bracket missing "
-msgstr "Il manque une parenthčse fermante"
-
-msgid "Colobot Gold"
-msgstr "Colobot Gold"
+msgstr "Il manque une parenthèse fermante"
 
 msgid "Colobot rules!"
 msgstr "Colobot est super!"
@@ -403,6 +414,9 @@ msgstr "Copier"
 msgid "Copy (Ctrl+c)"
 msgstr "Copier (Ctrl+c)"
 
+msgid "Ctrl"
+msgstr "Ctrl"
+
 msgid "Current mission saved"
 msgstr "Enregistrement effectué"
 
@@ -477,10 +491,10 @@ msgid "Dust\\Dust and dirt on bots and buildings"
 msgstr "Salissures\\Salissures des robots et bâtiments"
 
 msgid "Dynamic lighting\\Mobile light sources"
-msgstr "Lumičres dynamiques\\Eclairages mobiles"
+msgstr "Lumières dynamiques\\Éclairages mobiles"
 
 msgid "Edit the selected program"
-msgstr "Edite le programme sélectionné"
+msgstr "Édite le programme sélectionné"
 
 msgid "Egg"
 msgstr "Oeuf"
@@ -531,7 +545,7 @@ msgid "Filename:"
 msgstr "Nom du fichier :"
 
 msgid "Film sequences\\Films before and after the missions"
-msgstr "Séquences cinématiques\\Films avant ou aprčs une mission"
+msgstr "Séquences cinématiques\\Films avant ou après une mission"
 
 msgid "Finish"
 msgstr "But"
@@ -553,7 +567,7 @@ msgid "Folder: %s"
 msgstr "Dossier: %s"
 
 msgid "Font size"
-msgstr "Taille des caractčres"
+msgstr "Taille des caractères"
 
 msgid "Forward"
 msgstr "Page suivante"
@@ -589,13 +603,13 @@ msgid "Free game\\Free game without a specific goal"
 msgstr "Jeu libre\\Jeu libre sans but précis"
 
 msgid "Friendly fire\\Your shooting can damage your own objects "
-msgstr "Dégâts ŕ soi-męme\\Vos tirs infligent des dommages ŕ vos unités"
+msgstr "Dégâts à soi-même\\Vos tirs infligent des dommages à vos unités"
 
 msgid "Full screen\\Full screen or window mode"
-msgstr "Plein écran\\Plein écran ou fenętré"
+msgstr "Plein écran\\Plein écran ou fenêtré"
 
 msgid "Function already exists"
-msgstr "Cette fonction existe déjŕ"
+msgstr "Cette fonction existe déjà"
 
 msgid "Function name missing"
 msgstr "Nom de la fonction attendu"
@@ -609,8 +623,12 @@ msgstr "Jeu\\Options de jouabilité"
 msgid "Gantry crane"
 msgstr "Portique"
 
+#, c-format
+msgid "GetResource event num out of range: %d\n"
+msgstr ""
+
 msgid "Goto: destination occupied"
-msgstr "Destination occupée"
+msgstr "Goto: Destination occupée"
 
 msgid "Goto: inaccessible destination"
 msgstr "Chemin introuvable"
@@ -637,7 +655,7 @@ msgid "Hair color:"
 msgstr "Couleur des cheveux :"
 
 msgid "Head\\Face and hair"
-msgstr "Tęte\\Visage et cheveux"
+msgstr "Tête\\Visage et cheveux"
 
 msgid "Help about selected object"
 msgstr "Instructions sur la sélection"
@@ -681,8 +699,8 @@ msgstr "Pas le bon type de pile"
 msgid "Incorrect index type"
 msgstr "Mauvais type d'index"
 
-msgid "Infected by a virus, temporarily out of order"
-msgstr "Infecté par un virus, ne fonctionne plus temporairement"
+msgid "Infected by a virus; temporarily out of order"
+msgstr "Infecté par un virus; ne fonctionne plus temporairement"
 
 msgid "Information exchange post"
 msgstr "Borne d'information"
@@ -703,7 +721,7 @@ msgid "Instructions (\\key help;)"
 msgstr "Instructions (\\key help;)"
 
 msgid "Instructions after the final closing brace"
-msgstr "Instructions aprčs la fin"
+msgstr "Instructions après la fin"
 
 msgid "Instructions for the mission (\\key help;)"
 msgstr "Instructions sur la mission (\\key help;)"
@@ -712,7 +730,7 @@ msgid "Instructions from Houston"
 msgstr "Instructions de Houston"
 
 msgid "Instructions\\Shows the instructions for the current mission"
-msgstr "Instructions mission\\Marche ŕ suivre"
+msgstr "Instructions mission\\Marche à suivre"
 
 msgid "Jet temperature"
 msgstr "Température du réacteur"
@@ -843,16 +861,16 @@ msgid "No energy in the subsoil"
 msgstr "Pas d'énergie en sous-sol"
 
 msgid "No flag nearby"
-msgstr "Aucun drapeau ŕ proximité"
+msgstr "Aucun drapeau à proximité"
 
 msgid "No function running"
 msgstr "Pas de fonction en exécution"
 
 msgid "No function with this name accepts this kind of parameter"
-msgstr "Aucune fonction de ce nom n'accepte ce(s) type(s) de paramčtre(s)"
+msgstr "Aucune fonction de ce nom n'accepte ce(s) type(s) de paramètre(s)"
 
 msgid "No function with this name accepts this number of parameters"
-msgstr "Aucune fonction de ce nom n'accepte ce nombre de paramčtres"
+msgstr "Aucune fonction de ce nom n'accepte ce nombre de paramètres"
 
 msgid "No information exchange post within range"
 msgstr "Pas trouvé de borne d'information"
@@ -876,13 +894,13 @@ msgid "No titanium around"
 msgstr "Titanium inexistant"
 
 msgid "No titanium ore to convert"
-msgstr "Pas de minerai de titanium ŕ convertir"
+msgstr "Pas de minerai de titanium à convertir"
 
 msgid "No titanium to transform"
-msgstr "Pas de titanium ŕ transformer"
+msgstr "Pas de titanium à transformer"
 
 msgid "No uranium to transform"
-msgstr "Pas d'uranium ŕ transformer"
+msgstr "Pas d'uranium à transformer"
 
 msgid "Normal size"
 msgstr "Taille normale"
@@ -903,16 +921,16 @@ msgid "Not yet enough energy"
 msgstr "Pas encore assez d'énergie"
 
 msgid "Nothing to analyze"
-msgstr "Rien ŕ analyser"
+msgstr "Rien à analyser"
 
 msgid "Nothing to drop"
-msgstr "Rien ŕ déposer"
+msgstr "Rien à déposer"
 
 msgid "Nothing to grab"
-msgstr "Rien ŕ prendre"
+msgstr "Rien à prendre"
 
 msgid "Nothing to recycle"
-msgstr "Rien ŕ recycler"
+msgstr "Rien à recycler"
 
 msgid "Nuclear power cell"
 msgstr "Pile nucléaire"
@@ -933,7 +951,7 @@ msgid "Number of insects detected"
 msgstr "Nombre d'insectes détectés"
 
 msgid "Number of particles\\Explosions, dust, reflections, etc."
-msgstr "Quantité de particules\\Explosions, poussičres, reflets, etc."
+msgstr "Quantité de particules\\Explosions, poussières, reflets, etc."
 
 msgid "OK"
 msgstr "D'accord"
@@ -963,7 +981,7 @@ msgid "Opening brace missing "
 msgstr "Début d'un bloc attendu"
 
 msgid "Opening bracket missing"
-msgstr "Il manque une parenthčse ouvrante"
+msgstr "Il manque une parenthèse ouvrante"
 
 msgid "Operation impossible with value \"nan\""
 msgstr "Opération sur un \"nan\""
@@ -975,13 +993,13 @@ msgid "Options\\Preferences"
 msgstr "Options\\Réglages"
 
 msgid "Organic matter"
-msgstr "Matičre organique"
+msgstr "Matière organique"
 
 msgid "Origin of last message\\Shows where the last message was sent from"
 msgstr "Montrer le lieu d'un message\\Montrer le lieu du dernier message"
 
 msgid "Parameters missing "
-msgstr "Pas assez de paramčtres"
+msgstr "Pas assez de paramètres"
 
 msgid "Particles in the interface\\Steam clouds and sparks in the interface"
 msgstr "Particules dans l'interface\\Pluie de particules"
@@ -1002,7 +1020,7 @@ msgid "Place occupied"
 msgstr "Emplacement occupé"
 
 msgid "Planets and stars\\Astronomical objects in the sky"
-msgstr "Plančtes et étoiles\\Motifs mobiles dans le ciel"
+msgstr "Planètes et étoiles\\Motifs mobiles dans le ciel"
 
 msgid "Plans for defense tower available"
 msgstr "Construction d'une tour de défense possible"
@@ -1023,7 +1041,7 @@ msgid "Plans for thumper available"
 msgstr "Fabrication d'un robot secoueur possible"
 
 msgid "Plans for tracked robots available "
-msgstr "Fabrication d'un robot ŕ chenilles possible"
+msgstr "Fabrication d'un robot à chenilles possible"
 
 msgid "Plant a flag"
 msgstr "Pose un drapeau de couleur"
@@ -1086,10 +1104,10 @@ msgid "Programming exercises"
 msgstr "Programmation"
 
 msgid "Programming help"
-msgstr "Aide ŕ la programmation"
+msgstr "Aide à la programmation"
 
 msgid "Programming help  (\\key prog;)"
-msgstr "Aide ŕ la programmation (\\key prog;)"
+msgstr "Aide à la programmation (\\key prog;)"
 
 msgid "Programming help\\Gives more detailed help with programming"
 msgstr "Instructions programmation\\Explication sur la programmation"
@@ -1107,7 +1125,7 @@ msgid "Public required"
 msgstr "Public requis"
 
 msgid "Public\\Common folder"
-msgstr "Public\\Dossier commun ŕ tous les joueurs"
+msgstr "Public\\Dossier commun à tous les joueurs"
 
 msgid "Quake at explosions\\The screen shakes at explosions"
 msgstr "Secousses lors d'explosions\\L'écran vibre lors d'une explosion"
@@ -1125,7 +1143,7 @@ msgid "Radar station"
 msgstr "Radar"
 
 msgid "Read error"
-msgstr "Erreur ŕ la lecture"
+msgstr "Erreur à la lecture"
 
 msgid "Recorder"
 msgstr "Enregistreur"
@@ -1149,7 +1167,7 @@ msgid "Remains of Apollo mission"
 msgstr "Vestige d'une mission Apollo"
 
 msgid "Remove a flag"
-msgstr "Enlčve un drapeau"
+msgstr "Enlève un drapeau"
 
 msgid "Repair center"
 msgstr "Centre de réparation"
@@ -1158,7 +1176,7 @@ msgid "Research center"
 msgstr "Centre de recherches"
 
 msgid "Research program already performed"
-msgstr "Recherche déjŕ effectuée"
+msgstr "Recherche déjà effectuée"
 
 msgid "Research program completed"
 msgstr "Recherche terminée"
@@ -1258,6 +1276,9 @@ msgstr "Rayon du bouclier"
 msgid "Shielder"
 msgstr "Robot bouclier"
 
+msgid "Shift"
+msgstr "Shift"
+
 msgid "Shoot (\\key action;)"
 msgstr "Tir (\\key action;)"
 
@@ -1350,7 +1371,7 @@ msgid "Still working ..."
 msgstr "Travail en cours ..."
 
 msgid "String missing"
-msgstr "Une chaîne de caractčre est attendue"
+msgstr "Une chaîne de caractère est attendue"
 
 msgid "Strip color:"
 msgstr "Couleur des bandes :"
@@ -1405,7 +1426,7 @@ msgid "The types of the two operands are incompatible "
 msgstr "Les deux opérandes ne sont pas de types compatibles"
 
 msgid "This class already exists"
-msgstr "Cette classe existe déjŕ"
+msgstr "Cette classe existe déjà"
 
 msgid "This class does not exist"
 msgstr "Cette classe n'existe pas"
@@ -1456,7 +1477,7 @@ msgid "Too many flags of this color (maximum 5)"
 msgstr "Trop de drapeaux de cette couleur (maximum 5)"
 
 msgid "Too many parameters"
-msgstr "Trop de paramčtres"
+msgstr "Trop de paramètres"
 
 msgid "Tracked grabber"
 msgstr "Robot déménageur"
@@ -1480,16 +1501,16 @@ msgid "Transmitted information"
 msgstr "Informations diffusées"
 
 msgid "Turn left (\\key left;)"
-msgstr "Tourne ŕ gauche (\\key left;)"
+msgstr "Tourne à gauche (\\key left;)"
 
 msgid "Turn left\\turns the bot to the left"
-msgstr "Tourner ŕ gauche\\Moteur ŕ gauche"
+msgstr "Tourner à gauche\\Moteur à gauche"
 
 msgid "Turn right (\\key right;)"
-msgstr "Tourne ŕ droite (\\key right;)"
+msgstr "Tourne à droite (\\key right;)"
 
 msgid "Turn right\\turns the bot to the right"
-msgstr "Tourner ŕ droite\\Moteur ŕ droite"
+msgstr "Tourner à droite\\Moteur à droite"
 
 msgid "Type declaration missing"
 msgstr "Déclaration de type attendu"
@@ -1543,7 +1564,7 @@ msgid "Violet flag"
 msgstr "Drapeau violet"
 
 msgid "Void parameter"
-msgstr "Paramčtre void"
+msgstr "Paramètre void"
 
 msgid "Wasp"
 msgstr "Guępe"
@@ -1566,6 +1587,9 @@ msgstr "Robot shooter"
 msgid "Wheeled sniffer"
 msgstr "Robot renifleur"
 
+msgid "Win"
+msgstr "Gagné"
+
 msgid "Winged grabber"
 msgstr "Robot déménageur"
 
@@ -1591,7 +1615,7 @@ msgid "Wreckage"
 msgstr "Epave de robot"
 
 msgid "Write error"
-msgstr "Erreur ŕ l'écriture"
+msgstr "Erreur à l'écriture"
 
 msgid "Wrong type for the assignment"
 msgstr "Mauvais type de résultat pour l'assignation"
@@ -1652,13 +1676,13 @@ msgid "\\Green flags"
 msgstr "\\Drapeaux verts"
 
 msgid "\\New player name"
-msgstr "\\Nom du joueur ŕ créer"
+msgstr "\\Nom du joueur à créer"
 
 msgid "\\No eyeglasses"
 msgstr "\\Pas de lunettes"
 
 msgid "\\Raise the pencil"
-msgstr "\\Relčve le crayon"
+msgstr "\\Relève le crayon"
 
 msgid "\\Red flags"
 msgstr "\\Drapeaux rouges"
@@ -1676,10 +1700,10 @@ msgid "\\Stop recording"
 msgstr "\\Stoppe l'enregistrement"
 
 msgid "\\Turn left"
-msgstr "\\Rotation ŕ gauche"
+msgstr "\\Rotation à gauche"
 
 msgid "\\Turn right"
-msgstr "\\Rotation ŕ droite"
+msgstr "\\Rotation à droite"
 
 msgid "\\Use the black pencil"
 msgstr "\\Abaisse le crayon noir"
@@ -1732,6 +1756,69 @@ msgstr "\\b;Listes des robots\n"
 msgid "\\c; (none)\\n;\n"
 msgstr "\\c; (aucun)\\n;\n"
 
+msgid "action;"
+msgstr ""
+
+msgid "away;"
+msgstr ""
+
+msgid "camera;"
+msgstr ""
+
+msgid "cbot;"
+msgstr ""
+
+msgid "desel;"
+msgstr ""
+
+msgid "down;"
+msgstr ""
+
+msgid "gdown;"
+msgstr ""
+
+msgid "gup;"
+msgstr ""
+
+msgid "help;"
+msgstr ""
+
+msgid "human;"
+msgstr ""
+
+msgid "left;"
+msgstr ""
+
+msgid "near;"
+msgstr ""
+
+msgid "next;"
+msgstr ""
+
+msgid "prog;"
+msgstr ""
+
+msgid "quit;"
+msgstr ""
+
+msgid "right;"
+msgstr ""
+
+msgid "speed10;"
+msgstr ""
+
+msgid "speed15;"
+msgstr ""
+
+msgid "speed20;"
+msgstr ""
+
+msgid "up;"
+msgstr ""
+
+msgid "visit;"
+msgstr ""
+
 msgid "www.epsitec.com"
 msgstr "www.epsitec.com"
 
@@ -1741,30 +1828,24 @@ msgstr "www.epsitec.com"
 #~ msgid "<--"
 #~ msgstr "<--"
 
-#~ msgid "Alt"
-#~ msgstr "Alt"
-
 #~ msgid "Application key"
 #~ msgstr "Application key"
 
 #~ msgid "Arrow down"
-#~ msgstr "Flčche Bas"
+#~ msgstr "Flèche Bas"
 
 #~ msgid "Arrow left"
-#~ msgstr "Flčche Gauche"
+#~ msgstr "Flèche Gauche"
 
 #~ msgid "Arrow right"
-#~ msgstr "Flčche Droite"
+#~ msgstr "Flèche Droite"
 
 #~ msgid "Arrow up"
-#~ msgstr "Flčche Haut"
+#~ msgstr "Flèche Haut"
 
 #~ msgid "Attn"
 #~ msgstr "Attn"
 
-#~ msgid "Button %1"
-#~ msgstr "Bouton %1"
-
 #~ msgid "Caps Lock"
 #~ msgstr "Caps Lock"
 
@@ -1777,9 +1858,6 @@ msgstr "www.epsitec.com"
 #~ msgid "CrSel"
 #~ msgstr "CrSel"
 
-#~ msgid "Ctrl"
-#~ msgstr "Ctrl"
-
 #~ msgid "Delete Key"
 #~ msgstr "Delete"
 
@@ -1963,9 +2041,6 @@ msgstr "www.epsitec.com"
 #~ msgid "Select"
 #~ msgstr "Select"
 
-#~ msgid "Shift"
-#~ msgstr "Shift"
-
 #~ msgid "Space"
 #~ msgstr "Espace"
 
diff --git a/src/po/pl.po b/src/po/pl.po
index 700ee9ea..9bab529d 100644
--- a/src/po/pl.po
+++ b/src/po/pl.po
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-12-13 21:46+0100\n"
+"POT-Creation-Date: 2012-12-27 17:09+0100\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -65,6 +65,9 @@ msgstr "Brak \" ] \""
 msgid "\"%s\" missing in this exercise"
 msgstr "It misses \"%s\" in this exercise"
 
+msgid "%1"
+msgstr ""
+
 msgid "..behind"
 msgstr "..za"
 
@@ -86,13 +89,16 @@ msgstr "Dźwięk 3D\\Przestrzenne pozycjonowanie dźwięków"
 msgid "<<  Back  \\Back to the previous screen"
 msgstr "<<  Wstecz  \\Wraca do poprzedniego ekranu"
 
-msgid "<<< Sorry, mission failed >>>"
+#, fuzzy
+msgid "<<< Sorry; mission failed >>>"
 msgstr "<<< Niestety, misja nie powiodła się >>>"
 
-msgid "<<< Well done, mission accomplished >>>"
+#, fuzzy
+msgid "<<< Well done; mission accomplished >>>"
 msgstr "<<< Dobra robota, misja wypełniona >>>"
 
-msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\""
+#, fuzzy
+msgid "A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\""
 msgstr "Po etykiecie musi wystąpić \"for\", \"while\", \"do\" lub \"switch\""
 
 msgid "A variable can not be declared twice"
@@ -122,6 +128,9 @@ msgstr "Królowa Obcych została zabita"
 msgid "Already carrying something"
 msgstr "Nie można nieść więcej przedmiotów"
 
+msgid "Alt"
+msgstr "Alt"
+
 msgid "Analysis already performed"
 msgstr "Analiza została już wykonana"
 
@@ -301,6 +310,9 @@ msgstr "Budynek zniszczony"
 msgid "Building too close"
 msgstr "Budynek za blisko"
 
+msgid "Button %1"
+msgstr "Przycisk %1"
+
 msgid "COLOBOT"
 msgstr "COLOBOT"
 
@@ -328,7 +340,8 @@ msgstr "Camera to left"
 msgid "Camera to right"
 msgstr "Camera to right"
 
-msgid "Can not create this, there are too many objects"
+#, fuzzy
+msgid "Can not create this; there are too many objects"
 msgstr "Nie można tego utworzyć, za dużo obiektów"
 
 msgid "Can't open file"
@@ -367,9 +380,6 @@ msgstr "Zamknij"
 msgid "Closing bracket missing "
 msgstr "Brak nawiasu zamykającego"
 
-msgid "Colobot Gold"
-msgstr "Colobot Gold"
-
 msgid "Colobot rules!"
 msgstr "Colobot rządzi!"
 
@@ -406,6 +416,9 @@ msgstr "Kopiuj"
 msgid "Copy (Ctrl+c)"
 msgstr "Kopiuj (Ctrl+C)"
 
+msgid "Ctrl"
+msgstr "Ctrl"
+
 msgid "Current mission saved"
 msgstr "Bieżąca misja zapisana"
 
@@ -612,6 +625,10 @@ msgstr "Gra\\Ustawienia gry"
 msgid "Gantry crane"
 msgstr "Żuraw przesuwalny"
 
+#, c-format
+msgid "GetResource event num out of range: %d\n"
+msgstr ""
+
 msgid "Goto: destination occupied"
 msgstr "Goto: miejsce docelowe zajęte"
 
@@ -685,7 +702,8 @@ msgstr "Nieodpowiedni rodzaj ogniw"
 msgid "Incorrect index type"
 msgstr "Nieprawidłowy typ indeksu"
 
-msgid "Infected by a virus, temporarily out of order"
+#, fuzzy
+msgid "Infected by a virus; temporarily out of order"
 msgstr "Zainfekowane wirusem, chwilowo niesprawne"
 
 msgid "Information exchange post"
@@ -1264,6 +1282,9 @@ msgstr "Zasięg osłony"
 msgid "Shielder"
 msgstr "Osłaniacz"
 
+msgid "Shift"
+msgstr "Shift"
+
 msgid "Shoot (\\key action;)"
 msgstr "Strzelaj (\\key action;)"
 
@@ -1575,6 +1596,9 @@ msgstr "Działo na kołach"
 msgid "Wheeled sniffer"
 msgstr "Szperacz na kołach"
 
+msgid "Win"
+msgstr ""
+
 msgid "Winged grabber"
 msgstr "Transporter latający"
 
@@ -1740,6 +1764,69 @@ msgstr "\\b;Roboty\n"
 msgid "\\c; (none)\\n;\n"
 msgstr "\\c; (brak)\\n;\n"
 
+msgid "action;"
+msgstr ""
+
+msgid "away;"
+msgstr ""
+
+msgid "camera;"
+msgstr ""
+
+msgid "cbot;"
+msgstr ""
+
+msgid "desel;"
+msgstr ""
+
+msgid "down;"
+msgstr ""
+
+msgid "gdown;"
+msgstr ""
+
+msgid "gup;"
+msgstr ""
+
+msgid "help;"
+msgstr ""
+
+msgid "human;"
+msgstr ""
+
+msgid "left;"
+msgstr ""
+
+msgid "near;"
+msgstr ""
+
+msgid "next;"
+msgstr ""
+
+msgid "prog;"
+msgstr ""
+
+msgid "quit;"
+msgstr ""
+
+msgid "right;"
+msgstr ""
+
+msgid "speed10;"
+msgstr ""
+
+msgid "speed15;"
+msgstr ""
+
+msgid "speed20;"
+msgstr ""
+
+msgid "up;"
+msgstr ""
+
+msgid "visit;"
+msgstr ""
+
 msgid "www.epsitec.com"
 msgstr "www.epsitec.com"
 
@@ -1749,9 +1836,6 @@ msgstr "www.epsitec.com"
 #~ msgid "<--"
 #~ msgstr "<--"
 
-#~ msgid "Alt"
-#~ msgstr "Alt"
-
 #~ msgid "Application key"
 #~ msgstr "Klawisz menu kontekstowego"
 
@@ -1770,9 +1854,6 @@ msgstr "www.epsitec.com"
 #~ msgid "Attn"
 #~ msgstr "Attn"
 
-#~ msgid "Button %1"
-#~ msgstr "Przycisk %1"
-
 #~ msgid "Caps Lock"
 #~ msgstr "Caps Lock"
 
@@ -1785,9 +1866,6 @@ msgstr "www.epsitec.com"
 #~ msgid "CrSel"
 #~ msgstr "CrSel"
 
-#~ msgid "Ctrl"
-#~ msgstr "Ctrl"
-
 #~ msgid "Delete Key"
 #~ msgstr "Delete"
 
@@ -1971,9 +2049,6 @@ msgstr "www.epsitec.com"
 #~ msgid "Select"
 #~ msgstr "Zaznacz"
 
-#~ msgid "Shift"
-#~ msgstr "Shift"
-
 #~ msgid "Space"
 #~ msgstr "Spacja"
 
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 8471df54..57d638eb 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -1571,7 +1571,7 @@ bool CScript::rGrab(CBotVar* var, CBotVar* result, int& exception, void* user)
     if ( script->m_primaryTask == 0 )  // no task in progress?
     {
         script->m_primaryTask = new CTaskManager(script->m_iMan, script->m_object);
-        if ( var == 0 )  
+        if ( var == 0 )
         {
             type = TMA_FFRONT;
         }
@@ -2753,9 +2753,14 @@ void CScript::InitFonctions()
 CScript::~CScript()
 {
     delete m_botProg;
+    m_botProg = nullptr;
+
     delete m_primaryTask;
-    delete m_script;
-    m_script = 0;
+    m_primaryTask = nullptr;
+
+    delete[] m_script;
+    m_script = nullptr;
+
     m_len = 0;
 
     m_iMan->DeleteInstance(CLASS_SCRIPT, this);
@@ -2766,7 +2771,7 @@ CScript::~CScript()
 
 void CScript::PutScript(Ui::CEdit* edit, const char* name)
 {
-    if ( m_script == 0 )
+    if ( m_script == nullptr )
     {
         New(edit, name);
     }
@@ -2785,11 +2790,11 @@ bool CScript::GetScript(Ui::CEdit* edit)
 {
     int     len;
 
-    delete m_script;
-    m_script = 0;
+    delete[] m_script;
+    m_script = nullptr;
 
     len = edit->GetTextLength();
-    m_script = static_cast<char*>(malloc(sizeof(char)*(len+1)));
+    m_script = new char[len+1];
 
     edit->GetText(m_script, len+1);
     edit->GetCursor(m_cursor2, m_cursor1);
@@ -2997,7 +3002,7 @@ void CScript::SetStepMode(bool bStep)
 bool CScript::Run()
 {
     if( m_botProg == 0 )  return false;
-    if ( m_script == 0 || m_len == 0 )  return false;
+    if ( m_script == nullptr || m_len == 0 )  return false;
 
     if ( !m_botProg->Start(m_title) )  return false;
 
@@ -3475,9 +3480,9 @@ bool CScript::IntroduceVirus()
     start = found[i+1];
     i     = found[i+0];
 
-    newScript = static_cast<char*>(malloc(sizeof(char)*(m_len+strlen(names[i+1])+1)));
+    newScript = new char[m_len+strlen(names[i+1])+1];
     strcpy(newScript, m_script);
-    delete m_script;
+    delete[] m_script;
     m_script = newScript;
 
     DeleteToken(m_script, start, strlen(names[i]));
@@ -3638,7 +3643,7 @@ void CScript::New(Ui::CEdit* edit, const char* name)
 bool CScript::SendScript(char* text)
 {
     m_len = strlen(text);
-    m_script = static_cast<char*>(malloc(sizeof(char)*(m_len+1)));
+    m_script = new char[m_len+1];
     strcpy(m_script, text);
     if ( !CheckToken() )  return false;
     if ( !Compile() )  return false;
@@ -3669,8 +3674,8 @@ bool CScript::ReadScript(const char* filename)
     if ( file == NULL )  return false;
     fclose(file);
 
-    delete m_script;
-    m_script = 0;
+    delete[] m_script;
+    m_script = nullptr;
 
     edit = m_interface->CreateEdit(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 0, EVENT_EDIT9);
     edit->SetMaxChar(Ui::EDITSTUDIOMAX);
@@ -3697,7 +3702,7 @@ bool CScript::WriteScript(const char* filename)
         name = filename;
     }
 
-    if ( m_script == 0 )
+    if ( m_script == nullptr )
     {
         remove(filename);
         return false;
diff --git a/src/sound/oalsound/alsound.cpp b/src/sound/oalsound/alsound.cpp
index 02014174..f683a62d 100644
--- a/src/sound/oalsound/alsound.cpp
+++ b/src/sound/oalsound/alsound.cpp
@@ -296,6 +296,8 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc
         GetLogger()->Warn("Sound %d was not loaded!\n", sound);
         return -1;
     }
+    
+    GetLogger()->Trace("ALSound::Play sound: %d volume: %f frequency: %f\n", sound, amplitude, frequency);
 
     int channel;
     bool bAlreadyLoaded;
@@ -308,12 +310,12 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc
     Position(channel, pos);
 
     // setting initial values
-    mChannels[channel]->SetStartAmplitude(amplitude);
+    mChannels[channel]->SetStartAmplitude(mAudioVolume);
     mChannels[channel]->SetStartFrequency(frequency);
     mChannels[channel]->SetChangeFrequency(1.0f);
     mChannels[channel]->ResetOper();
-    mChannels[channel]->AdjustFrequency(frequency);
-    mChannels[channel]->AdjustVolume(mAudioVolume);
+    mChannels[channel]->AdjustFrequency(frequency);    
+    mChannels[channel]->AdjustVolume(amplitude * mAudioVolume);
     mChannels[channel]->Play();
     return channel;
 }
@@ -451,17 +453,17 @@ void ALSound::FrameMove(float delta)
         it.second->AdjustVolume(volume * mAudioVolume);
 
         // setting frequency
-        frequency = progress * (oper.finalFrequency - it.second->GetStartFrequency()) * it.second->GetStartFrequency() * it.second->GetChangeFrequency();
+        frequency = progress * abs(oper.finalFrequency - it.second->GetStartFrequency()) * it.second->GetStartFrequency() * it.second->GetChangeFrequency();
         it.second->AdjustFrequency(frequency);
 
         if (it.second->GetEnvelope().totalTime <= it.second->GetCurrentTime()) {
 
             if (oper.nextOper == SOPER_LOOP) {
-                GetLogger()->Trace("Sound oper: replay.\n");
+                GetLogger()->Trace("ALSound::FrameMove oper: replay.\n");
                 it.second->SetCurrentTime(0.0f);
                 it.second->Play();
             } else {
-                GetLogger()->Trace("Sound oper: next.\n");
+                GetLogger()->Trace("ALSound::FrameMove oper: next.\n");
                 it.second->SetStartAmplitude(oper.finalAmplitude);
                 it.second->SetStartFrequency(oper.finalFrequency);
                 it.second->PopEnvelope();
diff --git a/src/sound/oalsound/channel.cpp b/src/sound/oalsound/channel.cpp
index 2285414a..7d8244b9 100644
--- a/src/sound/oalsound/channel.cpp
+++ b/src/sound/oalsound/channel.cpp
@@ -39,7 +39,7 @@ Channel::~Channel() {
         alSourcei(mSource, AL_BUFFER, 0);
         alDeleteSources(1, &mSource);
         if (alCheck())
-            GetLogger()->Warn("Failed to delete sound source. Code: %s\n", alGetCode());
+            GetLogger()->Warn("Failed to delete sound source. Code: %d\n", alGetCode());
     }
 }
 
@@ -50,7 +50,7 @@ bool Channel::Play() {
     
     alSourcePlay(mSource);
     if (alCheck())
-        GetLogger()->Warn("Could not play audio sound source. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not play audio sound source. Code: %d\n", alGetCode());
     return true;
 }
 
@@ -61,7 +61,7 @@ bool Channel::SetPosition(Math::Vector pos) {
     
     alSource3f(mSource, AL_POSITION, pos.x, pos.y, pos.z);
     if (alCheck()) {
-        GetLogger()->Warn("Could not set sound position. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not set sound position. Code: %d\n", alGetCode());
         return false;
     }
     return true;
@@ -75,7 +75,7 @@ bool Channel::SetFrequency(float freq)
 
     alSourcef(mSource, AL_PITCH, freq);
     if (alCheck()) {
-        GetLogger()->Warn("Could not set sound pitch. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not set sound pitch to '%f'. Code: %d\n", freq, alGetCode());
         return false;
     }
     return true;
@@ -90,7 +90,7 @@ float Channel::GetFrequency()
     
     alGetSourcef(mSource, AL_PITCH, &freq);
     if (alCheck()) {
-        GetLogger()->Warn("Could not get sound pitch. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not get sound pitch. Code: %d\n", alGetCode());
         return 0;
     }
 
@@ -105,7 +105,7 @@ bool Channel::SetVolume(float vol)
     
     alSourcef(mSource, AL_GAIN, vol / MAXVOLUME);
     if (alCheck()) {
-        GetLogger()->Warn("Could not set sound volume. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not set sound volume to '%f'. Code: %d\n", vol, alGetCode());
         return false;
     }
     return true;
@@ -120,7 +120,7 @@ float Channel::GetVolume()
     
     alGetSourcef(mSource, AL_GAIN, &vol);
     if (alCheck()) {
-        GetLogger()->Warn("Could not get sound volume. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not get sound volume. Code: %d\n", alGetCode());
         return 0;
     }
 
@@ -213,7 +213,7 @@ bool Channel::SetBuffer(Buffer *buffer) {
     mBuffer = buffer;
     alSourcei(mSource, AL_BUFFER, buffer->GetBuffer());
     if (alCheck()) {
-        GetLogger()->Warn("Could not set sound buffer. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not set sound buffer. Code: %d\n", alGetCode());
         return false;
     }
     mInitFrequency = GetFrequency();
@@ -237,7 +237,7 @@ bool Channel::IsPlaying() {
     
     alGetSourcei(mSource, AL_SOURCE_STATE, &status);
     if (alCheck()) {
-        GetLogger()->Warn("Could not get sound status. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not get sound status. Code: %d\n", alGetCode());
         return false;
     }
 
@@ -253,7 +253,7 @@ bool Channel::IsReady() {
 bool Channel::Stop() {
     alSourceStop(mSource);
     if (alCheck()) {
-        GetLogger()->Warn("Could not stop sound. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not stop sound. Code: %d\n", alGetCode());
         return false;
     }
     return true;
@@ -265,7 +265,7 @@ float Channel::GetCurrentTime()
     ALfloat current;
     alGetSourcef(mSource, AL_SEC_OFFSET, &current);
     if (alCheck()) {
-        GetLogger()->Warn("Could not get source current play time. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not get source current play time. Code: %d\n", alGetCode());
         return 0.0f;
     }
     return current;
@@ -276,7 +276,7 @@ void Channel::SetCurrentTime(float current)
 {
     alSourcef(mSource, AL_SEC_OFFSET, current);
     if (alCheck())
-        GetLogger()->Warn("Could not get source current play time. Code: %s\n", alGetCode());
+        GetLogger()->Warn("Could not get source current play time. Code: %d\n", alGetCode());
 }
 
 
diff --git a/src/sound/sound.h b/src/sound/sound.h
index 566f4150..518e2ada 100644
--- a/src/sound/sound.h
+++ b/src/sound/sound.h
@@ -168,7 +168,7 @@ class CSoundInterface
      *  Function calls \link CSoundInterface::Cache() \endlink for each file
      */
     inline void CacheAll(std::string path) {
-        for ( int i = 1; i < 69; i++ ) {
+        for ( int i = 1; i <= 81; i++ ) {
             std::stringstream filename;
             filename << path << "/sound" << std::setfill('0') << std::setw(3) << i << ".wav";
             if ( !Cache(static_cast<Sound>(i), filename.str()) )
diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp
index e14b19df..639215ae 100644
--- a/src/ui/edit.cpp
+++ b/src/ui/edit.cpp
@@ -243,7 +243,7 @@ bool CEdit::EventProcess(const Event &event)
         Scroll(m_lineFirst-3, true);
         return true;
     }
-    if (event.type == EVENT_KEY_DOWN  &&
+    if (event.type == EVENT_MOUSE_WHEEL  &&
         event.mouseWheel.dir == WHEEL_DOWN  &&
         Detect(event.mousePos)            )
     {
@@ -282,7 +282,7 @@ bool CEdit::EventProcess(const Event &event)
         }
     }
 
-    if ( m_scroll != 0 && !m_bGeneric )
+    if ( m_scroll != nullptr && !m_bGeneric )
     {
         m_scroll->EventProcess(event);
 
@@ -1248,7 +1248,7 @@ void CEdit::SetText(const char *text, bool bNew)
 {
     int     i, j, font;
     bool    bBOL;
-
+    
     if ( !bNew )  UndoMemorize(OPERUNDO_SPEC);
 
     m_len = strlen(text);
@@ -2172,11 +2172,11 @@ void CEdit::Scroll()
 {
     float   value;
 
-    if ( m_scroll != 0 )
+    if ( m_scroll != nullptr )
     {
         value = m_scroll->GetVisibleValue();
-        value *= m_lineTotal-m_lineVisible;
-        Scroll(static_cast<int>(value+0.5f), true);
+        value *= m_lineTotal - m_lineVisible;
+        Scroll(static_cast<int>(value + 0.5f), true);
     }
 }
 
@@ -3048,7 +3048,7 @@ bool CEdit::MinMaj(bool bMaj)
 
 void CEdit::Justif()
 {
-    float   width, value, size, indentLength;
+    float   width, size, indentLength;
     int     i, j, line, indent;
     bool    bDual, bString, bRem;
 
@@ -3176,26 +3176,7 @@ void CEdit::Justif()
         m_lineFirst = 0;
     }
 
-    if ( m_scroll != 0 )
-    {
-        if ( m_lineTotal <= m_lineVisible )
-        {
-            m_scroll->SetVisibleRatio(1.0f);
-            m_scroll->SetVisibleValue(0.0f);
-            m_scroll->SetArrowStep(0.0f);
-        }
-        else
-        {
-            value = static_cast<float>(m_lineVisible/m_lineTotal);
-            m_scroll->SetVisibleRatio(value);
-
-            value = static_cast<float>(m_lineFirst/(m_lineTotal-m_lineVisible));
-            m_scroll->SetVisibleValue(value);
-
-            value = static_cast<float>(1.0f/(m_lineTotal-m_lineVisible));
-            m_scroll->SetArrowStep(value);
-        }
-    }
+    UpdateScroll();
 
     m_timeBlink = 0.0f;  // lights the cursor immediately
 }
@@ -3326,5 +3307,30 @@ bool CEdit::SetFormat(int cursor1, int cursor2, int format)
     return true;
 }
 
+void CEdit::UpdateScroll()
+{
+    float value;
+    
+    if ( m_scroll != nullptr )
+    {
+        if ( m_lineTotal <= m_lineVisible )
+        {
+            m_scroll->SetVisibleRatio(1.0f);
+            m_scroll->SetVisibleValue(0.0f);
+            m_scroll->SetArrowStep(0.0f);
+        }
+        else
+        {
+            value = static_cast<float>(m_lineVisible) / m_lineTotal;
+            m_scroll->SetVisibleRatio(value);
+
+            value = static_cast<float>(m_lineFirst) / (m_lineTotal - m_lineVisible);
+            m_scroll->SetVisibleValue(value);
+
+            value = 1.0f / (m_lineTotal - m_lineVisible);
+            m_scroll->SetArrowStep(value);
+        }
+    }
+}
 
 }
diff --git a/src/ui/edit.h b/src/ui/edit.h
index 35d8b2c3..72471812 100644
--- a/src/ui/edit.h
+++ b/src/ui/edit.h
@@ -234,6 +234,8 @@ protected:
     void        UndoFlush();
     void        UndoMemorize(OperUndo oper);
     bool        UndoRecall();
+    
+    void        UpdateScroll();
 
 protected:
     CScroll*    m_scroll;           // vertical scrollbar on the right
diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp
index ebf7d106..68e78546 100644
--- a/src/ui/maindialog.cpp
+++ b/src/ui/maindialog.cpp
@@ -4305,8 +4305,8 @@ void CMainDialog::IOReadName()
                 }
             }
 
-            // TODO: language letters
-            sprintf(op, "Title.%c", 'E' /*MAX_FNAME()*/ );
+            // TODO: Fallback to an non-localized entry
+            sprintf(op, "Title.%c", m_app->GetLanguageChar() );
             if ( Cmd(line, op) )
             {
                 OpString(line, "resume", resume);
@@ -4701,8 +4701,8 @@ void CMainDialog::UpdateSceneChap(int &chap)
                         }
                     }
 
-                    /* TODO: language letters */
-                    sprintf(op, "Title.%c", 'E' /*GetLanguageLetter()*/);
+                    // TODO: Fallback to an non-localized entry
+                    sprintf(op, "Title.%c", m_app->GetLanguageChar());
                     if ( Cmd(line, op) )
                     {
                         OpString(line, "text", name);
@@ -4748,8 +4748,8 @@ void CMainDialog::UpdateSceneChap(int &chap)
                     }
                 }
 
-                // TODO: language letters
-                sprintf(op, "Title.%c", 'E'/*GetLanguageLetter()*/);
+                // TODO: Fallback to an non-localized entry
+                sprintf(op, "Title.%c", m_app->GetLanguageChar());
                 if ( Cmd(line, op) )
                 {
                     OpString(line, "text", name);
@@ -4851,8 +4851,8 @@ void CMainDialog::UpdateSceneList(int chap, int &sel)
                 }
             }
 
-            // TODO: language letters
-            sprintf(op, "Title.%c", 'E' /*MAX_FNAME()*/);
+            // TODO: Fallback to an non-localized entry
+            sprintf(op, "Title.%c", m_app->GetLanguageChar());
             if ( Cmd(line, op) )
             {
                 OpString(line, "text", name);
@@ -4996,8 +4996,8 @@ void CMainDialog::UpdateSceneResume(int rank)
             }
         }
 
-        // TODO: language letters
-        sprintf(op, "Resume.%c", 'E' /*MAX_FNAME()*/);
+        // TODO: Fallback to an non-localized entry
+        sprintf(op, "Resume.%c", m_app->GetLanguageChar());
         if ( Cmd(line, op) )
         {
             OpString(line, "text", name);