diff --git a/Makefile.am b/Makefile.am
index 4778d852a8ba23ab084f8ef63084ced86c7b2033..9dc8439c9c30db1570f879b57bdea86d30b90d12 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = mpidep rudeconfig src utils @TESTDIR@ @EXTRAS@ doc @EXAMPLESDIR@ @PYMUSIC_SUBDIR@
+SUBDIRS = mpidep rudeconfig src utils @TESTDIR@ @EXTRAS@ doc @EXAMPLESDIR@ @MUSICCONFIGDIR@ @PYMUSIC_SUBDIR@
 
 debdir=../@PACKAGE_NAME@-@PACKAGE_VERSION@
 
diff --git a/configure.ac b/configure.ac
index 1d551fd389273a093935b2c193dd9853a7c80e75..c49992a170e4109fbdbb708cd2461681814df444 100644
--- a/configure.ac
+++ b/configure.ac
@@ -325,6 +325,7 @@ AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],
 
 # FIXME: this means that --without-python make will not recurse into pymusic subdir
 if test "x$have_python" = "xyes"; then
+    MUSICCONFIGDIR="music-config"
     PYMUSIC_SUBDIR="pymusic"
 else
     PYMUSIC_SUBDIR=""
@@ -340,6 +341,7 @@ fi
 
 
 AC_SUBST([HAVE_PYTHON])
+AC_SUBST([MUSICCONFIGDIR])
 AC_SUBST([PYMUSIC_SUBDIR])
 AC_SUBST([PYEXECDIR], ${pyexecdir})
 
@@ -384,8 +386,8 @@ AC_CONFIG_FILES([
   testsuite/music_tests.sh
   testsuite/unittests/catch/Makefile
   testsuite/sanitytests/Makefile
-  music/Makefile
-  music/predict_rank.py
+  music-config/Makefile
+  music-config/predict_rank.py
   doc/Makefile
   extras/Makefile
 ])
diff --git a/music/.gitignore b/music-config/.gitignore
similarity index 100%
rename from music/.gitignore
rename to music-config/.gitignore
diff --git a/music/ChangeLog b/music-config/ChangeLog
similarity index 100%
rename from music/ChangeLog
rename to music-config/ChangeLog
diff --git a/music/Makefile.am b/music-config/Makefile.am
similarity index 85%
rename from music/Makefile.am
rename to music-config/Makefile.am
index b5bb964ff3925cbb36a93abdc77c1a69af85929d..143220be496498c4aacb5c57273ae028868a9197 100644
--- a/music/Makefile.am
+++ b/music-config/Makefile.am
@@ -2,6 +2,8 @@ edit = sed -e 's|@libdir[@]|$(libdir)|g'
 
 pkgpython_PYTHON = __init__.py predict_rank.py config.py
 
+pkgpythondir = $(pythondir)/music/config
+
 EXTRA_DIST = predict_rank.py.in
 
 predict_rank.py: Makefile predict_rank.py.in
diff --git a/music/__init__.py b/music-config/__init__.py
similarity index 100%
rename from music/__init__.py
rename to music-config/__init__.py
diff --git a/music/get_rank.py b/music-config/get_rank.py
similarity index 100%
rename from music/get_rank.py
rename to music-config/get_rank.py
diff --git a/music/predict_rank.py.in b/music-config/predict_rank.py.in
similarity index 100%
rename from music/predict_rank.py.in
rename to music-config/predict_rank.py.in
diff --git a/music/config.py b/music/config.py
deleted file mode 100644
index e7a3b81722ba1f18f534d4031ec0cd8c90ceb1cd..0000000000000000000000000000000000000000
--- a/music/config.py
+++ /dev/null
@@ -1,250 +0,0 @@
-#
-#  This file is part of MUSIC.
-#  Copyright (C) 2012 Mikael Djurfeldt
-#
-#  MUSIC is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 3 of the License, or
-#  (at your option) any later version.
-#
-#  MUSIC is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# This API allows for querying the MPI rank and specification of the
-# information in MUSIC configuration files
-
-import os
-
-from music.predict_rank import predictRank
-
-# This function now defined in predict_rank.py
-#
-#def predictRank ():
-#    """
-#    Returns the predicted MPI rank of this process
-#    
-#    :rtype: Integer
-#    """
-#    return 0
-
-CONFIGVARNAME = '_MUSIC_CONFIG_'
-
-OUTPUT = '0'
-INPUT = '1'
-
-
-def launchedByMusic ():
-    return CONFIGVARNAME in os.environ
-
-
-def supersedeArgv (argv):
-    """
-    Replace argc and argv before MUSIC initialization
-    """
-    # Should insert escape characters
-    args = argv[0]
-    for arg in argv[1:]:
-        args += ' ' + arg
-    os.environ['MUSIC_ARGV'] = args
-
-
-def postponeSetup ():
-    """
-    Postpones processing of configuration info until the creation of
-    the first port.  Must be called before creation of MUSIC::Setup.
-    """
-    if not thisApp:
-        raise RuntimeError, \
-              'must define Application before calling postponeSetup ()'
-    os.environ[CONFIGVARNAME] = 'POSTPONE:' + str (thisApp.number)
-
-
-portCodes = {}
-code = 0
-
-def portCode (appName, portName):
-    global code
-    key = (appName, portName)
-    if key in portCodes:
-        return portCodes[key]
-    portCodes[key] = code
-    ans = code
-    code += 1
-    return ans
-
-
-class ConnectivityMap (object):
-    def __init__ (self):
-        self.ports = {}
-    
-    def register (self, portName, direction, width, *connection):
-        if portName in self.ports:
-            (direction_, width_, connections) = self.ports[portName]
-            #*fixme* error checks here
-        else:
-            connections = []
-            self.ports[portName] = (direction, width, connections)
-        connections.append (connection)
-
-    def conf (self):
-        conf = str (len (self.ports))
-        for portName in self.ports:
-            (direction, width, connections) = self.ports[portName]
-            conf += ':' + portName + ':' + direction + ':' + width
-            conf += ':' + str (len (connections))
-            for connection in connections:
-                for item in connection:
-                    conf += ':' + item
-        return conf
-
-
-configDict = {}
-appNumber = 0
-rankSum = 0
-thisRank = predictRank ()
-thisApp = None
-
-class Application (object):
-    def __init__ (self, np = None, binary = None, args = None, name = None):
-        global appNumber, rankSum, thisApp
-        self.name = name
-        self.number = appNumber
-        appNumber += 1
-        self.np = np
-        self.leader = rankSum
-        rankSum += np
-        self.this = False
-        if self.leader <= thisRank and thisRank < rankSum:
-            self.this = True
-            thisApp = self
-
-        self.configDict = {}
-        self.connectivityMap = ConnectivityMap ()
-
-        if binary:
-            self.define ('binary', binary)
-        if args:
-            self.define ('args', args)
-
-        applicationMap.register (self)
-
-    def __getitem__ (self, varName):
-        if varName in self.configDict:
-            return self.configDict[varName]
-        return configDict[varName]
-    
-    def define (self, varName, value):
-        """
-        Define configuration variable varName to value value.
-        """
-        self.configDict[varName] = str (value)
-
-    def connect (self, fromPort, toApp, toPort, width):
-        """
-        Connect fromPort to toPort.
-        """
-        connections.append ((self, fromPort, toApp, toPort, str (width)))
-
-
-class ApplicationMap (object):
-    def __init__ (self):
-        self.applications = []
-        self.nameMap = {}
-
-    def register (self, app):
-        if not app.name:
-            app.name = 'application'
-        if app.name in self.nameMap:
-            # Adjust the name to become unique
-            record = self.nameMap[app.name]
-            base, suffix = record
-            if base == app.name:
-                suffix += 1
-                record[1] = suffix
-            else:
-                base = app.name
-                suffix = 0
-                self.nameMap[base] = [base, suffix]
-            app.name += str (suffix)
-        else:
-            self.nameMap[app.name] = [app.name, 0]
-        self.applications.append (app)
-    
-    def conf (self):
-        conf = str (len (self.applications))
-        for app in self.applications:
-            conf += ':' + app.name + ':' + str (app.np)
-        return conf
-
-applicationMap = ApplicationMap ()
-
-
-def define (varName, value):
-    """
-    Define configuration variable varName to value value.
-    """
-    configDict[varName] = str (value)
-
-
-# Communication algorithms
-    
-commAlgorithms =  { 'collective' : 0, 'point-to-point' : 1 }
-
-# Processing methods
-
-procMethods = { 'tree' : 0, 'table' : 1 }
-
-
-def connect (fromApp, fromPort, toApp, toPort, width,
-             commAlgName = 'collective', procMethodName = 'table'):
-    """
-    Connect fromPort to toPort specifying port width width.
-    """
-    width = str (width)
-    commAlg = commAlgorithms[commAlgName]
-    procMethod = procMethods[procMethodName]
-    fromApp.connectivityMap.register (fromPort, OUTPUT, width,
-                                      toApp.name, toPort,
-                                      str (portCode (toApp.name, toPort)),
-                                      str (toApp.leader), str (toApp.np),
-                                      str (commAlg), str (procMethod))
-    toApp.connectivityMap.register (toPort, INPUT, width,
-                                    toApp.name, toPort,
-                                    str (portCode (toApp.name, toPort)),
-                                    str (fromApp.leader), str (fromApp.np),
-                                    str (commAlg), str (procMethod))
-
-
-configured = False
-
-def configure ():
-    """
-    Configure the MUSIC library using the information provided by
-    define and connect.
-    """
-    conf = thisApp.name \
-           + ':' + str (thisApp.number) \
-           + ':' + applicationMap.conf () \
-           + ':' + thisApp.connectivityMap.conf ()
-
-    configDict.update (thisApp.configDict)
-
-    for key in configDict:
-        conf += ':' + key + '=' + configDict[key]
-
-    os.environ[CONFIGVARNAME] = conf
-
-    configured = True
-
-    
-def launch ():
-    if not configured:
-        configure ()
-    binary = thisApp['binary']
-    os.execvp (binary, [binary] + thisApp['args'].split (' '))