diff --git a/reclass/cli.py b/reclass/cli.py
index c3a11a0..f09067d 100644
--- a/reclass/cli.py
+++ b/reclass/cli.py
@@ -8,7 +8,6 @@
 #
 
 import sys, os, posix
-import logging
 
 from reclass import get_storage, output
 from reclass.core import Core
@@ -16,11 +15,9 @@
 from reclass.errors import ReclassException
 from reclass.defaults import *
 from reclass.constants import MODE_NODEINFO
+from reclass.logs import logger
 from reclass.version import *
 
-logger = logging.getLogger(RECLASS_NAME)
-
-
 def main():
     try:
         defaults = {'pretty_print' : OPT_PRETTY_PRINT,
diff --git a/reclass/config.py b/reclass/config.py
index 9aa84cf..572cfed 100644
--- a/reclass/config.py
+++ b/reclass/config.py
@@ -8,14 +8,11 @@
 #
 
 import yaml, os, optparse, posix, sys
-import logging
 
 import errors
 from defaults import *
 from constants import MODE_NODEINFO, MODE_INVENTORY
 
-logger = logging.getLogger(RECLASS_NAME)
-
 def make_db_options_group(parser, defaults={}):
     ret = optparse.OptionGroup(parser, 'Database options',
                                'Configure from where {0} collects data'.format(parser.prog))
@@ -189,12 +186,17 @@
     return options
 
 
+def vvv(msg):
+    #print >>sys.stderr, msg
+    pass
+
+
 def find_and_read_configfile(filename=CONFIG_FILE_NAME,
                              dirs=CONFIG_FILE_SEARCH_PATH):
     for d in dirs:
         f = os.path.join(d, filename)
         if os.access(f, os.R_OK):
-            logger.debug('Using config file: {0}'.format(f))
+            vvv('Using config file: {0}'.format(f))
             return yaml.safe_load(file(f))
         elif os.path.isfile(f):
             raise PermissionsError('cannot read %s' % f)
diff --git a/reclass/logs.py b/reclass/logs.py
index d01c320..41da08e 100644
--- a/reclass/logs.py
+++ b/reclass/logs.py
@@ -14,7 +14,7 @@
 from reclass.version import VERSION, DESCRIPTION
 
 
-RECLASS_LOGGER = RECLASS_NAME
+RECLASS_LOGGER = 'reclass'
 
 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION)
 LOG_LEVEL = 'ERROR'
diff --git a/reclass/storage/yaml_fs/__init__.py b/reclass/storage/yaml_fs/__init__.py
index 01301d9..5a13050 100644
--- a/reclass/storage/yaml_fs/__init__.py
+++ b/reclass/storage/yaml_fs/__init__.py
@@ -8,20 +8,18 @@
 #
 import os, sys
 import fnmatch
-import logging
-
-from reclass.defaults import RECLASS_NAME
 from reclass.storage import NodeStorageBase
 from yamlfile import YamlFile
 from directory import Directory
 from reclass.datatypes import Entity
 import reclass.errors
 
-logger = logging.getLogger(RECLASS_NAME)
-
 FILE_EXTENSION = '.yml'
 STORAGE_NAME = 'yaml_fs'
 
+def vvv(msg):
+    #print >>sys.stderr, msg
+    pass
 
 class ExternalNodeStorage(NodeStorageBase):
 
@@ -59,7 +57,7 @@
         ret = {}
         def register_fn(dirpath, filenames):
             filenames = fnmatch.filter(filenames, '*{0}'.format(FILE_EXTENSION))
-            logger.debug('REGISTER {0} in path {1}'.format(filenames, dirpath))
+            vvv('REGISTER {0} in path {1}'.format(filenames, dirpath))
             for f in filenames:
                 name = os.path.splitext(f)[0]
                 relpath = os.path.relpath(dirpath, basedir)
@@ -79,7 +77,7 @@
         return ret
 
     def get_node(self, name):
-        logger.debug('GET NODE {0}'.format(name))
+        vvv('GET NODE {0}'.format(name))
         try:
             relpath = self._nodes[name]
             path = os.path.join(self.nodes_uri, relpath)
@@ -90,7 +88,7 @@
         return entity
 
     def get_class(self, name, nodename=None):
-        logger.debug('GET CLASS {0}'.format(name))
+        vvv('GET CLASS {0}'.format(name))
         try:
             path = os.path.join(self.classes_uri, self._classes[name])
         except KeyError, e:
diff --git a/reclass/storage/yaml_fs/directory.py b/reclass/storage/yaml_fs/directory.py
index ac8395a..03302b7 100644
--- a/reclass/storage/yaml_fs/directory.py
+++ b/reclass/storage/yaml_fs/directory.py
@@ -8,16 +8,14 @@
 #
 import os
 import sys
-import logging
-
-from reclass.defaults import RECLASS_NAME
 from reclass.errors import NotFoundError
 
-logger = logging.getLogger(RECLASS_NAME)
-
 SKIPDIRS = ( 'CVS', 'SCCS' )
 FILE_EXTENSION = '.yml'
 
+def vvv(msg):
+    #print >>sys.stderr, msg
+    pass
 
 class Directory(object):
 
@@ -33,7 +31,7 @@
 
     def _register_files(self, dirpath, filenames):
         for f in filter(lambda f: f.endswith(FILE_EXTENSION), filenames):
-            logger.debug('REGISTER {0}'.format(f))
+            vvv('REGISTER {0}'.format(f))
             f = os.path.join(dirpath, f)
             ptr = None if not self._fileclass else self._fileclass(f)
             self._files[f] = ptr
@@ -50,11 +48,11 @@
                                                     topdown=True,
                                                     onerror=_error,
                                                     followlinks=True):
-            logger.debug('RECURSE {0}, {1} files, {2} subdirectories'.format(
+            vvv('RECURSE {0}, {1} files, {2} subdirectories'.format(
                 dirpath.replace(os.getcwd(), '.'), len(filenames), len(dirnames)))
             for d in dirnames:
                 if d.startswith('.') or d in SKIPDIRS:
-                    logger.debug('   SKIP subdirectory {0}'.format(d))
+                    vvv('   SKIP subdirectory {0}'.format(d))
                     dirnames.remove(d)
             register_fn(dirpath, filenames)
 
