diff --git a/browser/lessons/lesson_01-base/lexical-analyzer.js b/browser/lessons/lesson_01-base/lexical-analyzer.js
index 59abb9c..c41e943 100755
--- a/browser/lessons/lesson_01-base/lexical-analyzer.js
+++ b/browser/lessons/lesson_01-base/lexical-analyzer.js
@@ -1,6 +1,7 @@
 /** A simple lexical analyzer
  */
 
+ 
 /** tokenize a string = split it into words
  *
  * Note : space separated only for now
@@ -10,6 +11,8 @@
  */
 export function tokenize(str) {
   // Write code here so that it passes the tests
+  var allTokens = str.split(" ");
+  return allTokens.filter(item => item.length != 0);
 }
 
 /** stem a string = turn several variants into the same
@@ -20,6 +23,7 @@ export function tokenize(str) {
  */
 export function stem(str) {
   // Write code here so that it passes the tests
+  return str.toLowerCase(str);
 }
 
 /** parse a string into a list of stemmed token
@@ -30,6 +34,7 @@ export function stem(str) {
  */
 export function parse(str) {
   // Write code here so that it passes the tests
+  return tokenize(stem(str));
 }
 
 /** index a string into a hash {'token' : <frequency of appearance>}
@@ -39,6 +44,15 @@ export function parse(str) {
  */
 export function index(str) {
   // Write code here so that it passes the tests
+  let rawList = parse(str);
+  let result = {};
+  rawList.forEach(function (item) {
+    if (result[item] == undefined)
+      result[item] = 1;
+    else
+      result[item] += 1;
+  });
+  return result;
 }
 
 
diff --git a/browser/lessons/lesson_03-type_detection/boolean-converter.js b/browser/lessons/lesson_03-type_detection/boolean-converter.js
index 08d58f7..5eb9aba 100755
--- a/browser/lessons/lesson_03-type_detection/boolean-converter.js
+++ b/browser/lessons/lesson_03-type_detection/boolean-converter.js
@@ -5,6 +5,15 @@
  */
 export default function convertToBoolean(value) {
   // TODO write the function so it passes the tests below !
+  if (typeof value == 'boolean')
+  	return value;
+  if (value == 'true')
+  	return true;
+  if (value == 'false')
+  	return false;
+  if (typeof value == 'string' && value.length > 0)
+  	return false;
+  return new Boolean(value).valueOf();
 }
 
 
diff --git a/browser/lessons/lesson_04-logger/logger.js b/browser/lessons/lesson_04-logger/logger.js
index d14ebaa..f431032 100755
--- a/browser/lessons/lesson_04-logger/logger.js
+++ b/browser/lessons/lesson_04-logger/logger.js
@@ -1,22 +1,34 @@
 import _ from 'lodash';
 
 function createFancyLogger(id) {
-  id = (id || 'default').toUpperCase();
+  id = (id || 'default');
 
   function logBetter(level) {
     const originalArgs = Array.from(arguments);
 
     // TODO implement !
-    let newArgs = originalArgs;
+    let newArgs = originalArgs.slice(1);
     // TODO....
+    let callerParams = newArgs.slice(0);
+
+    let prefix = getTimestamp(new Date(0)) + " - " + id + " - ";
+    newArgs.unshift(prefix);
+
+    let output = prefix;
+    //if (! (callerParams[0].includes("%s") || callerParams[0].includes("%d")))
+      output = prefix + callerParams[callerParams.length - 1];
+    //else
+      //output = prefix +
+    
+    console[originalArgs[0]](output);
   }
 
   /* eslint-disable no-undefined */
   return {
-    log: undefined,
-    info: undefined,
-    warn: undefined,
-    error: undefined,
+    log: logBetter.bind(undefined, 'log'),
+    info: logBetter.bind(undefined, 'info'),
+    warn: logBetter.bind(undefined, 'warn'),
+    error: logBetter.bind(undefined, 'error'),
   };
 }