From 01290cc5965abc6c9ed0bc79e06ae965d5a81db9 Mon Sep 17 00:00:00 2001
From: Dilawar Singh <dilawars@ncbs.res.in>
Date: Sun, 21 May 2017 10:20:24 +0530
Subject: [PATCH] Squashed 'moose-core/' changes from 52eeb541e..3498c1801

3498c1801 Bumped version to 3.1.2
fc1492094 Added AUTHOR and bumped the version up.
b5898ac30 Added missing 'moose.chemUtil' module.
d7c938283 Fixed revision issue.
1c1bbe059 Added GetRevision macro to get current timestamp.
ba9ec990e Write the version to VERSION file so setup.py file can use it.
4e9aa317f Not reading version file anymore.
315837d77 Changes from master branch.
557184389 Packaging related changes from master branch to chamcham branch.
4d5c6a5d8 NO version file should be in-source.
de2531056 Merge commit 'efa006c92c20b22cb9003c0036ebf9a9ca8cf429' into chamcham
9df1ba7fa Merge commit 'efc1324a17375675b6c0a23113c4248e76aa579b' into chamcham
726e71c06 cleanup in demo, filemenu links
d5c539194 adding missing files
5291f7c4f missing folder/files
760274cbc Changes made to gui to work with moose-core
be92816c8 Merge commit '36ca236de199e79c95af5c1a0956f0c7799fb4df' into chamcham
a6a05eff7 Merge commit '41be11d50616e2a2865256ed36972771ef7c68af' into chamcham
65c371c70 Fixes to BhallaLab/moose#204.

git-subtree-dir: moose-core
git-subtree-split: 3498c1801a8ae24e210a19137634a02ca480c944
---
 AUTHROS                                       |   9 +
 CMakeLists.txt                                |  23 +-
 basecode/global.h                             |   6 +-
 cmake_modules/GetRevision.cmake               |  20 +
 python/moose/SBML/readSBML.py                 | 139 ++--
 python/moose/SBML/validation.py               |  95 +++
 python/moose/SBML/writeSBML.py                | 602 ++++--------------
 python/moose/chemUtil/__init__.py             |   3 +
 .../add_Delete_ChemicalSolver.py              |   9 +-
 python/moose/chemUtil/chemConnectUtil.py      | 181 ++++++
 python/moose/chemUtil/graphUtils.py           |  87 +++
 python/moose/genesis/writeKkit.py             | 428 +++++--------
 python/moose/moose.py                         |  49 +-
 python/setup.py                               |  24 +-
 14 files changed, 806 insertions(+), 869 deletions(-)
 create mode 100644 AUTHROS
 create mode 100644 cmake_modules/GetRevision.cmake
 create mode 100644 python/moose/SBML/validation.py
 create mode 100644 python/moose/chemUtil/__init__.py
 rename python/moose/{ => chemUtil}/add_Delete_ChemicalSolver.py (94%)
 create mode 100644 python/moose/chemUtil/chemConnectUtil.py
 create mode 100644 python/moose/chemUtil/graphUtils.py

diff --git a/AUTHROS b/AUTHROS
new file mode 100644
index 00000000..f568c742
--- /dev/null
+++ b/AUTHROS
@@ -0,0 +1,9 @@
+Upinder S. Bhalla 	Primary Architect
+Niraj Dudani 	        Neuronal solver
+Subhasis Ray 	        Python interface
+Aditya Gilra 	        NeuroML support	 
+Aviral Goel 	        Moogli
+HarshaRani. G.V         Designing of Website,read and write SBML and 
+                        Graphical User Interface for moose 	
+Dilawar Singh    	Packaging, BOOST solvers
+Dharma Teja 	        GPU parallelization using CUDA 	
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 390904c5..916c0117 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
 set(CMAKE_LEGACY_CYGWIN_WIN32 0)
-cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
 if(COMMAND cmake_policy)
     cmake_policy(SET CMP0003 NEW)
@@ -11,9 +11,11 @@ endif(COMMAND cmake_policy)
 
 project(MOOSE)
 
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
 include(CheckCXXCompiler.cmake)
 include(CheckIncludeFileCXX)
 include(FindPkgConfig)
+include(GetRevision)
 
 # If from command line, version info is not passed, use the git to generate a
 # version file. If GIT fails, use the previous known version.
@@ -27,14 +29,14 @@ if( (NOT MOOSE_VERSION) AND GIT_EXEC)
         OUTPUT_VARIABLE MOOSE_VERSION
         OUTPUT_STRIP_TRAILING_WHITESPACE
         )
-    message(STATUS "+ Writing ${MOOSE_VERSION} to ${VERSION_FILE}" )
-    file(WRITE ${VERSION_FILE} ${MOOSE_VERSION})
-elseif( (NOT MOOSE_VERSION) AND (NOT GIT_EXEC) )
-    message(STATUS "+ Reading ${VERSION_FILE}" )
-    file(READ ${VERSION_FILE} GIT_VERSION_OUTPUT )
+endif( )
+
+# Default to current date.
+if( (NOT MOOSE_VERSION)  )
+    NOW(TIMESTAMP)
+    set(MOOSE_VERSION "nightly-${TIMESTAMP}" )
 elseif(MOOSE_VERSION)
     message(STATUS "+ Using user specified VERSION = ${MOOSE_VERSION}" )
-    file(WRITE ${VERSION_FILE} ${MOOSE_VERSION})
 else()
     message(FATAL_ERROR "Could not determine MOOSE_VERSION" )
 endif( )
@@ -42,6 +44,10 @@ endif( )
 add_definitions( -DMOOSE_VERSION="${MOOSE_VERSION}")
 message( STATUS "MOOSE Version ${MOOSE_VERSION}" )
 
+# Write VERSION to a file VERSION so that setup.py can use it.
+message(STATUS "+ Writing ${MOOSE_VERSION} to ${VERSION_FILE}" )
+file(WRITE ${VERSION_FILE} ${MOOSE_VERSION} )
+
 # This snippet is from LLVM project.
 # Sanity check our source directory to make sure that we are not trying to
 # generate an in-tree build (unless on MSVC_IDE, where it is ok), and to make
@@ -98,9 +104,6 @@ option(WITH_MPI  "Enable Openmpi support" OFF)
 option(WITH_BOOST "Use boost library instead of GSL" OFF)
 option(WITH_GSL  "Use gsl-library. Alternative is WITH_BOOST" ON)
 
-################################# CMKAE MACROS #################################
-
-set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
 
 ############################ BUILD CONFIGURATION #################################
 
diff --git a/basecode/global.h b/basecode/global.h
index 9b06b282..692bb71c 100644
--- a/basecode/global.h
+++ b/basecode/global.h
@@ -48,9 +48,6 @@ extern unsigned int totalTests;
 #define TEST_END totalTests++; \
     cout << std::right <<  setw(20) << "test of " << SIMPLE_CURRENT_FUNCTION << " finished."; 
 
-/*-----------------------------------------------------------------------------
- *  Global functions in namespace moose
- *-----------------------------------------------------------------------------*/
 #define MISSING_BRACKET_AT_END                  -1
 #define EMPTY_PATH                              -2
 #define SPACES_AT_THE_BEGINING                  -3
@@ -59,6 +56,9 @@ extern unsigned int totalTests;
 #define BAD_CHARACTER_IN_PATH                   -6
 
 
+/*-----------------------------------------------------------------------------
+ *  Global functions in namespace moose
+ *-----------------------------------------------------------------------------*/
 namespace moose
 {
 
diff --git a/cmake_modules/GetRevision.cmake b/cmake_modules/GetRevision.cmake
new file mode 100644
index 00000000..41c991cb
--- /dev/null
+++ b/cmake_modules/GetRevision.cmake
@@ -0,0 +1,20 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3)
+
+MACRO(NOW RESULT)
+  IF(CMAKE_VERSION VERSION_GREATER "2.8.10")
+    STRING(TIMESTAMP ${RESULT} "%Y%m%d")
+  ELSE()
+    IF(WIN32)
+      EXECUTE_PROCESS(COMMAND "wmic" "os" "get" "localdatetime" OUTPUT_VARIABLE DATETIME)
+      IF(NOT DATETIME MATCHES "ERROR")
+        STRING(REGEX REPLACE ".*\n([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9]).*" "\\1-\\2-\\3 \\4:\\5:\\6" ${RESULT} "${DATETIME}")
+      ENDIF()
+    ELSEIF(UNIX)
+      EXECUTE_PROCESS(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE DATETIME)
+      STRING(REGEX REPLACE "([0-9: -]+).*" "\\1" ${RESULT} "${DATETIME}")
+    ELSE()
+      MESSAGE(SEND_ERROR "date not implemented")
+      SET(${RESULT} "00000000")
+    ENDIF()
+  ENDIF()
+ENDMACRO()
diff --git a/python/moose/SBML/readSBML.py b/python/moose/SBML/readSBML.py
index 2765c5e0..6a627054 100644
--- a/python/moose/SBML/readSBML.py
+++ b/python/moose/SBML/readSBML.py
@@ -10,10 +10,10 @@
 ** This program is part of 'MOOSE', the
 ** Messaging Object Oriented Simulation Environment,
 ** also known as GENESIS 3 base code.
-**           copyright (C) 2003-2016 Upinder S. Bhalla. and NCBS
+**           copyright (C) 2003-2017 Upinder S. Bhalla. and NCBS
 Created : Thu May 12 10:19:00 2016(+0530)
 Version
-Last-Updated: Wed Sep 28
+Last-Updated: Tue Feb 10 2017
           By:
 **********************************************************************/
 
@@ -23,8 +23,8 @@ import sys
 import os.path
 import collections
 import moose
-
-
+from validation import validateModel
+import re
 '''
    TODO in
     -Compartment
@@ -57,13 +57,13 @@ try:
 except ImportError:
     pass
 
-
 def mooseReadSBML(filepath, loadpath, solver="ee"):
     global foundLibSBML_
     if not foundLibSBML_:
         print('No python-libsbml found.' 
             '\nThis module can be installed by following command in terminal:'
-            '\n\t easy_install python-libsbl'
+            '\n\t easy_install python-libsbml'
+            '\n\t apt-get install python-libsbml'
             )
         return None
 
@@ -74,12 +74,9 @@ def mooseReadSBML(filepath, loadpath, solver="ee"):
     with open(filepath, "r") as filep:
         filep = open(filepath, "r")
         document = libsbml.readSBML(filepath)
-        num_errors = document.getNumErrors()
-        if (num_errors > 0):
-            print("Encountered the following SBML errors:")
-            document.printErrors()
-            return moose.element('/')
-        else:
+        tobecontinue = False
+        tobecontinue = validateModel(document)
+        if tobecontinue:
             level = document.getLevel()
             version = document.getVersion()
             print(("\n" + "File: " + filepath + " (Level " +
@@ -120,17 +117,19 @@ def mooseReadSBML(filepath, loadpath, solver="ee"):
                     return moose.element('/')
                 else:
                     baseId = moose.Neutral(loadpath)
+                    basePath = baseId
                     # All the model will be created under model as
                     # a thumbrule
-                    basePath = moose.Neutral(
-                        baseId.path + '/model')
+                    basePath = moose.Neutral(baseId.path + '/model')
                     # Map Compartment's SBML id as key and value is
                     # list of[ Moose ID and SpatialDimensions ]
                     global comptSbmlidMooseIdMap
                     global warning
                     warning = " "
+                    global msg
+                    msg = " "
                     comptSbmlidMooseIdMap = {}
-                    print(("modelPath:" + basePath.path))
+                    #print(("modelPath:" + basePath.path))
                     globparameterIdValue = {}
                     modelAnnotaInfo = {}
                     mapParameter(model, globparameterIdValue)
@@ -138,8 +137,10 @@ def mooseReadSBML(filepath, loadpath, solver="ee"):
                         basePath, model, comptSbmlidMooseIdMap)
                     if errorFlag:
                         specInfoMap = {}
-                        errorFlag = createSpecies(
+                        errorFlag,warning = createSpecies(
                             basePath, model, comptSbmlidMooseIdMap, specInfoMap, modelAnnotaInfo)
+                        #print(errorFlag,warning)
+                        
                         if errorFlag:
                             errorFlag = createRules(
                                 model, specInfoMap, globparameterIdValue)
@@ -148,7 +149,7 @@ def mooseReadSBML(filepath, loadpath, solver="ee"):
                                     model, specInfoMap, modelAnnotaInfo, globparameterIdValue)
                         getModelAnnotation(
                             model, baseId, basePath)
-
+                        
                     if not errorFlag:
                         print(msg)
                         # Any time in the middle if SBML does not read then I
@@ -157,7 +158,11 @@ def mooseReadSBML(filepath, loadpath, solver="ee"):
                         # built which is not correct print "Deleted rest of the
                         # model"
                         moose.delete(basePath)
-            return baseId
+                        basePath = moose.Shell('/')
+            return basePath
+        else:
+            print("Validation failed while reading the model.")
+            return moose.element('/')
 
 
 def setupEnzymaticReaction(enz, groupName, enzName,
@@ -168,7 +173,6 @@ def setupEnzymaticReaction(enz, groupName, enzName,
     cplx = (modelAnnotaInfo[groupName]["complex"])
     cplx = str(idBeginWith(cplx))
     complx = moose.element(specInfoMap[cplx]["Mpath"].path)
-
     enzyme_ = moose.Enz(enzParent.path + '/' + enzName)
     moose.move(complx, enzyme_)
     moose.connect(enzyme_, "cplx", complx, "reac")
@@ -284,7 +288,7 @@ def getModelAnnotation(obj, baseId, basepath):
                                 for plots in plotlist:
                                     plots = plots.replace(" ", "")
                                     plotorg = plots
-                                    if moose.exists(basepath.path + plotorg):
+                                    if( moose.exists(basepath.path + plotorg) and isinstance(moose.element(basepath.path+plotorg),moose.PoolBase)) :
                                         plotSId = moose.element(
                                             basepath.path + plotorg)
                                         # plotorg = convertSpecialChar(plotorg)
@@ -299,8 +303,7 @@ def getModelAnnotation(obj, baseId, basepath):
                                         if not fullPath in tablelistname:
                                             tab = moose.Table2(fullPath)
                                             tablelistname.append(fullPath)
-                                            moose.connect(
-                                                tab, "requestOut", plotSId, "getConc")
+                                            moose.connect(tab, "requestOut", plotSId, "getConc")
 
 
 def getObjAnnotation(obj, modelAnnotationInfo):
@@ -333,6 +336,8 @@ def getObjAnnotation(obj, modelAnnotationInfo):
                         annotateMap[nodeName] = nodeValue
                     if nodeName == "textColor":
                         annotateMap[nodeName] = nodeValue
+                    if nodeName == "Group":
+                        annotateMap[nodeName] = nodeValue
     return annotateMap
 
 
@@ -457,7 +462,14 @@ def createReaction(model, specInfoMap, modelAnnotaInfo, globparameterIdValue):
     for ritem in range(0, model.getNumReactions()):
         reactionCreated = False
         groupName = ""
+
         reac = model.getReaction(ritem)
+        group = ""
+        reacAnnoInfo = {}
+        reacAnnoInfo = getObjAnnotation(reac, modelAnnotaInfo)
+        if "Group" in reacAnnoInfo:
+            group = reacAnnoInfo["Group"]
+
         if (reac.isSetId()):
             rId = reac.getId()
         if (reac.isSetName()):
@@ -509,9 +521,7 @@ def createReaction(model, specInfoMap, modelAnnotaInfo, globparameterIdValue):
             nummodifiers = reac.getNumModifiers()
 
             if not (numRcts and numPdts):
-                print(
-                    rName,
-                    " : Substrate and Product is missing, we will be skiping creating this reaction in MOOSE")
+                print("Warning: %s" %(rName)," : Substrate or Product is missing, we will be skiping creating this reaction in MOOSE")
                 reactionCreated = False
             elif (reac.getNumModifiers() > 0):
                 reactionCreated, reaction_ = setupMMEnzymeReaction(
@@ -529,6 +539,11 @@ def createReaction(model, specInfoMap, modelAnnotaInfo, globparameterIdValue):
                     sp = react.getSpecies()
                     sp = str(idBeginWith(sp))
                     speCompt = specInfoMap[sp]["comptId"].path
+                    if group:
+                        if moose.exists(speCompt+'/'+group):
+                            speCompt = speCompt+'/'+group
+                        else:
+                            speCompt = (moose.Neutral(speCompt+'/'+group)).path
                     reaction_ = moose.Reac(speCompt + '/' + rName)
                     reactionCreated = True
                     reactSBMLIdMooseId[rName] = {
@@ -758,10 +773,12 @@ def createRules(model, specInfoMap, globparameterIdValue):
             exp = rule.getFormula()
             for mem in ruleMemlist:
                 if (mem in specInfoMap):
-                    exp1 = exp.replace(mem, str(speFunXterm[mem]))
+                    #exp1 = exp.replace(mem, str(speFunXterm[mem]))
+                    exp1 = re.sub(r'\b%s\b'% (mem), speFunXterm[mem], exp)
                     exp = exp1
                 elif(mem in globparameterIdValue):
-                    exp1 = exp.replace(mem, str(globparameterIdValue[mem]))
+                    #exp1 = exp.replace(mem, str(globparameterIdValue[mem]))
+                    exp1 = re.sub(r'\b%s\b'% (mem), globparameterIdValue[mem], exp)
                     exp = exp1
                 else:
                     print("Math expression need to be checked")
@@ -805,12 +822,17 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
     # - Need to add group name if exist in pool
     # - Notes
     # print "species "
-
     if not (model.getNumSpecies()):
-        return False
+        return (False,"number of species is zero")
     else:
         for sindex in range(0, model.getNumSpecies()):
             spe = model.getSpecies(sindex)
+            group = ""
+            specAnnoInfo = {}
+            specAnnoInfo = getObjAnnotation(spe, modelAnnotaInfo)
+            if "Group" in specAnnoInfo:
+                group = specAnnoInfo["Group"]
+            
             sName = None
             sId = spe.getId()
             if spe.isSetName():
@@ -829,7 +851,11 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
             hasonlySubUnit = spe.getHasOnlySubstanceUnits()
             # "false": is {unit of amount}/{unit of size} (i.e., concentration or density).
             # "true": then the value is interpreted as having a unit of amount only.
-
+            if group:
+                if moose.exists(comptEl+'/'+group):
+                    comptEl = comptEl+'/'+group
+                else:
+                    comptEl = (moose.Neutral(comptEl+'/'+group)).path
             if (boundaryCondition):
                 poolId = moose.BufPool(comptEl + '/' + sName)
             else:
@@ -837,13 +863,13 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
 
             if (spe.isSetNotes):
                 pullnotes(spe, poolId)
-            specAnnoInfo = {}
-            specAnnoInfo = getObjAnnotation(spe, modelAnnotaInfo)
+            
             if specAnnoInfo:
                 if not moose.exists(poolId.path + '/info'):
                     poolInfo = moose.Annotator(poolId.path + '/info')
                 else:
                     poolInfo = moose.element(poolId.path + '/info')
+
                 for k, v in list(specAnnoInfo.items()):
                     if k == 'xCord':
                         poolInfo.x = float(v)
@@ -876,8 +902,7 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
                     initvalue = initvalue * unitfactor
                 elif spe.isSetInitialConcentration():
                     initvalue = spe.getInitialConcentration()
-                    print(
-                        " Since hasonlySubUnit is true and concentration is set units are not checked")
+                    print(" Since hasonlySubUnit is true and concentration is set units are not checked")
                 poolId.nInit = initvalue
 
             elif hasonlySubUnit == False:
@@ -885,8 +910,7 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
                 if spe.isSetInitialAmount():
                     initvalue = spe.getInitialAmount()
                     # initAmount is set we need to convert to concentration
-                    initvalue = initvalue / \
-                        comptSbmlidMooseIdMap[comptId]["size"]
+                    initvalue = initvalue / comptSbmlidMooseIdMap[comptId]["size"]
 
                 elif spe.isSetInitialConcentration():
                     initvalue = spe.getInitialConcentration()
@@ -907,13 +931,14 @@ def createSpecies(basePath, model, comptSbmlidMooseIdMap,
                         if (rule_variable == sId):
                             found = True
                             break
+                
                 if not (found):
                     print(
                         "Invalid SBML: Either initialConcentration or initialAmount must be set or it should be found in assignmentRule but non happening for ",
                         sName)
-                    return False
+                    return (False,"Invalid SBML: Either initialConcentration or initialAmount must be set or it should be found in assignmentRule but non happening for ",sName)
 
-    return True
+    return (True," ")
 
 
 def transformUnit(unitForObject, hasonlySubUnit=False):
@@ -995,7 +1020,7 @@ def createCompartment(basePath, model, comptSbmlidMooseIdMap):
     # ToDoList : Check what should be done for the spaitialdimension is 2 or
     # 1, area or length
     if not(model.getNumCompartments()):
-        return False
+        return False,
     else:
         for c in range(0, model.getNumCompartments()):
             compt = model.getCompartment(c)
@@ -1115,19 +1140,25 @@ def findCompartment(element):
     return element
 
 if __name__ == "__main__":
-
-    filepath = sys.argv[1]
-    path = sys.argv[2]
-
-    f = open(filepath, 'r')
-
-    if path == '':
-        loadpath = filepath[filepath.rfind('/'):filepath.find('.')]
-    else:
-        loadpath = path
-
-    read = mooseReadSBML(filepath, loadpath)
-    if read:
-        print(" Read to path", loadpath)
+    try:
+        sys.argv[1]
+    except IndexError:
+        print("Filename or path not given")
+        exit(0)
     else:
-        print(" could not read  SBML to MOOSE")
+        filepath = sys.argv[1]
+        if not os.path.exists(filepath):
+            print("Filename or path does not exist",filepath)
+            
+        else:
+            try:
+                sys.argv[2]
+            except :
+                modelpath = filepath[filepath.rfind('/'):filepath.find('.')]
+            else:
+                modelpath = sys.argv[2]
+            read = mooseReadSBML(filepath, modelpath)
+            if read:
+                print(" Model read to moose path "+ modelpath)
+            else:
+                print(" could not read  SBML to MOOSE")
\ No newline at end of file
diff --git a/python/moose/SBML/validation.py b/python/moose/SBML/validation.py
new file mode 100644
index 00000000..41ab4140
--- /dev/null
+++ b/python/moose/SBML/validation.py
@@ -0,0 +1,95 @@
+foundLibSBML_ = False
+try:
+    from libsbml import *
+    foundLibSBML_ = True
+except Exception as e:
+    pass
+
+def validateModel(sbmlDoc):
+    if sbmlDoc.getNumErrors() > 0:
+        tobecontinued = False
+        for i in range(0,sbmlDoc.getNumErrors()):
+            print (sbmlDoc.getError(i).getMessage())
+            return False        
+
+    if (not sbmlDoc):
+        print("validateModel: given a null SBML Document")
+        return False
+
+    consistencyMessages = ""
+    validationMessages = ""
+    noProblems = True
+    numCheckFailures = 0
+    numConsistencyErrors = 0
+    numConsistencyWarnings = 0
+    numValidationErrors = 0
+    numValidationWarnings = 0
+    # Once the whole model is done and before it gets written out,
+    # it's important to check that the whole model is in fact complete,
+    # consistent and valid.
+    numCheckFailures = sbmlDoc.checkInternalConsistency()
+    if (numCheckFailures > 0):
+        for i in range(0, numCheckFailures):
+            sbmlErr = sbmlDoc.getError(i)
+            if (sbmlErr.isFatal() or sbmlErr.isError()):
+                noProblems = False
+                numConsistencyErrors += 1
+            else:
+                numConsistencyWarnings += 1
+        constStr = sbmlDoc.printErrors()
+        if sbmlDoc.printErrors():
+            consistencyMessages = constStr
+    
+    # If the internal checks fail, it makes little sense to attempt
+    # further validation, because the model may be too compromised to
+    # be properly interpreted.
+    
+    if (numConsistencyErrors > 0):
+        consistencyMessages += "Further validation aborted."
+    else:
+        numCheckFailures = sbmlDoc.checkConsistency()
+        validationMessages;
+        #numCheckFailures = sbmlDoc.checkL3v1Compatibility()
+        if (numCheckFailures > 0):
+            for i in range(0, (numCheckFailures)):
+                consistencyMessages = sbmlDoc.getErrorLog().toString()
+                sbmlErr = sbmlDoc.getError(i)
+                if (sbmlErr.isFatal() or sbmlErr.isError()):
+                    noProblems = False
+                    numValidationErrors += 1
+                else:
+                    numValidationWarnings += 1
+
+        warning = sbmlDoc.getErrorLog().toString()
+        oss = sbmlDoc.printErrors()
+        validationMessages = oss
+    
+    if (noProblems):
+        return True
+    else:
+        if consistencyMessages is None:
+            consistencyMessages = ""
+        if consistencyMessages != "":
+            print("consistency Warning: " + consistencyMessages)
+
+        if (numConsistencyErrors > 0):
+            print("ERROR: encountered " +str(numConsistencyErrors) +" consistency error in model " +sbmlDoc.getModel().getId() +"'.")
+
+    if (numConsistencyWarnings > 0):
+        print("Notice: encountered " +str(numConsistencyWarnings) +" consistency warning in model " +sbmlDoc.getModel().getId() +"'.")
+
+    if (numValidationErrors > 0):
+        print("ERROR: encountered " + str(numValidationErrors) + " validation error in model " +sbmlDoc.getModel().getId() + "'.")
+        if (numValidationWarnings > 0):
+            print("Notice: encountered " +str(numValidationWarnings) +" validation warning in model " +sbmlDoc.getModel().getId() +"'.")
+
+    if validationMessages:
+        print(validationMessages)
+
+    return False
+    # return ( numConsistencyErrors == 0 and numValidationErrors == 0,
+    # consistencyMessages)
+
+if __name__ == '__main__':
+    sbmlDoc = libsbml.readSBML('00001-sbml-l3v1.xml')
+    validateModel(sbmlDoc)
diff --git a/python/moose/SBML/writeSBML.py b/python/moose/SBML/writeSBML.py
index 3057f100..90400306 100644
--- a/python/moose/SBML/writeSBML.py
+++ b/python/moose/SBML/writeSBML.py
@@ -9,26 +9,28 @@
 ** This program is part of 'MOOSE', the
 ** Messaging Object Oriented Simulation Environment,
 ** also known as GENESIS 3 base code.
-**           copyright (C) 2003-2016 Upinder S. Bhalla. and NCBS
+**           copyright (C) 2003-2017 Upinder S. Bhalla. and NCBS
 Created : Friday May 27 12:19:00 2016(+0530)
 Version
-Last-Updated: Thursday Oct 27 11:20:00 2016(+0530)
-		  By:
+Last-Updated: Wed Jan 11 15:20:00 2017(+0530)
+          By:
 **********************************************************************/
 /****************************
 
 '''
-
-import moose
+import sys
 import re
 from collections import Counter
-import networkx as nx
-import matplotlib.pyplot as plt
-import sys
+
+import moose
+from validation import validateModel
+from moose.chemUtil.chemConnectUtil import *
+from moose.chemUtil.graphUtils import *
+
 
 # ToDo:
-#	Table should be written
-#	Group's should be added
+#   Table should be written
+#   Group's should be added
 # boundary condition for buffer pool having assignment statment constant
 # shd be false
 
@@ -41,12 +43,14 @@ except Exception as e:
 
 def mooseWriteSBML(modelpath, filename, sceneitems={}):
     global foundLibSBML_ 
+    msg = " "
     if not foundLibSBML_:
         print('No python-libsbml found.' 
             '\nThis module can be installed by following command in terminal:'
-            '\n\t easy_install python-libsbl'
+            '\n\t easy_install python-libsbml or'
+            '\n\t apt-get install python-libsbml'
             )
-        return -1, msg
+        return -2, "Could not save the model in to SBML file. \nThis module can be installed by following command in terminal: \n\t easy_install python-libsbml or \n\t apt-get install python-libsbml",''
 
     sbmlDoc = SBMLDocument(3, 1)
     filepath, filenameExt = os.path.split(filename)
@@ -57,12 +61,11 @@ def mooseWriteSBML(modelpath, filename, sceneitems={}):
 
     # validatemodel
     sbmlOk = False
-    global spe_constTrue, cmin, cmax
+    global spe_constTrue
     spe_constTrue = []
     global nameList_
     nameList_ = []
-
-    autoCoordinateslayout = False
+    positionInfoexist = False
     xmlns = XMLNamespaces()
     xmlns.add("http://www.sbml.org/sbml/level3/version1")
     xmlns.add("http://www.moose.ncbs.res.in", "moose")
@@ -74,55 +77,57 @@ def mooseWriteSBML(modelpath, filename, sceneitems={}):
     cremodel_.setExtentUnits("substance")
     cremodel_.setSubstanceUnits("substance")
     neutralNotes = ""
+
     specieslist = moose.wildcardFind(modelpath + '/##[ISA=PoolBase]')
-    neutralPath = getGroupinfo(specieslist[0])
-    if moose.exists(neutralPath.path + '/info'):
-        neutralInfo = moose.element(neutralPath.path + '/info')
-        neutralNotes = neutralInfo.notes
-    if neutralNotes != "":
-        cleanNotes = convertNotesSpecialChar(neutralNotes)
-        notesString = "<body xmlns=\"http://www.w3.org/1999/xhtml\">\n \t \t" + \
-            neutralNotes + "\n\t </body>"
-        cremodel_.setNotes(notesString)
-    srcdesConnection = {}
-    cmin, cmax = 0, 1
+    if specieslist:
+        neutralPath = getGroupinfo(specieslist[0])
+        if moose.exists(neutralPath.path + '/info'):
+            neutralInfo = moose.element(neutralPath.path + '/info')
+            neutralNotes = neutralInfo.notes
+        if neutralNotes != "":
+            cleanNotes = convertNotesSpecialChar(neutralNotes)
+            notesString = "<body xmlns=\"http://www.w3.org/1999/xhtml\">\n \t \t" + \
+                neutralNotes + "\n\t </body>"
+            cremodel_.setNotes(notesString)
 
+    srcdesConnection = {}
     if not bool(sceneitems):
-        autoCoordinateslayout = True
-        srcdesConnection = setupItem(modelpath)
-        meshEntry = setupMeshObj(modelpath)
-        cmin, cmax, sceneitems = autoCoordinates(
-            meshEntry, srcdesConnection)
-
+        meshEntry,xmin,xmax,ymin,ymax,positionInfoexist,sitem = setupMeshObj(modelpath)
+        #moose.coordinateUtil.setupItem(modelpath,srcdesConnection)
+        setupItem(modelpath,srcdesConnection)
+        if not positionInfoexist:
+            autoCoordinates(meshEntry,srcdesConnection)
+    
     writeUnits(cremodel_)
     modelAnno = writeSimulationAnnotation(modelpath)
     if modelAnno:
         cremodel_.setAnnotation(modelAnno)
+
     compartexist = writeCompt(modelpath, cremodel_)
-    species = writeSpecies(
-        modelpath,
-        cremodel_,
-        sbmlDoc,
-        sceneitems,
-        autoCoordinateslayout)
-    if species:
-        writeFunc(modelpath, cremodel_)
-    writeReac(modelpath, cremodel_, sceneitems, autoCoordinateslayout)
-    writeEnz(modelpath, cremodel_, sceneitems, autoCoordinateslayout)
-
-    consistencyMessages = ""
-    SBMLok = validateModel(sbmlDoc)
-    if (SBMLok):
-        writeTofile = filepath + "/" + filename + '.xml'
-        writeSBMLToFile(sbmlDoc, writeTofile)
-        return True, consistencyMessages, writeTofile
-
-    if (not SBMLok):
-        cerr << "Errors encountered " << endl
-        return -1, consistencyMessages
-
-
-def writeEnz(modelpath, cremodel_, sceneitems, autoCoordinateslayout):
+    if compartexist == True:
+        species = writeSpecies( modelpath,cremodel_,sbmlDoc,sceneitems)
+        if species:
+            writeFunc(modelpath, cremodel_)
+        writeReac(modelpath, cremodel_, sceneitems)
+        writeEnz(modelpath, cremodel_, sceneitems)
+        consistencyMessages = ""
+        SBMLok = validateModel(sbmlDoc)
+        if (SBMLok):
+            writeTofile = filepath + "/" + filename + '.xml'
+            writeSBMLToFile(sbmlDoc, writeTofile)
+            return True, consistencyMessages, writeTofile
+
+        if (not SBMLok):
+            cerr << "Errors encountered " << endl
+            return -1, consistencyMessages
+    else:
+        return False, "Atleast one compartment should exist to write SBML"
+
+def calPrime(x):
+    prime = int((20 * (float(x - cmin) / float(cmax - cmin))) - 10)
+    return prime
+
+def writeEnz(modelpath, cremodel_, sceneitems):
     for enz in moose.wildcardFind(modelpath + '/##[ISA=EnzBase]'):
         enzannoexist = False
         enzGpnCorCol = " "
@@ -135,25 +140,26 @@ def writeEnz(modelpath, cremodel_, sceneitems, autoCoordinateslayout):
             notesE = Anno.notes
             element = moose.element(enz)
             ele = getGroupinfo(element)
-            if ele.className == "Neutral" or sceneitems[
-                    element] or Anno.color or Anno.textColor:
-                enzannoexist = True
-
+            if element.className == "Neutral" or sceneitems or Anno.x or Anno.y:
+                    enzannoexist = True
             if enzannoexist:
+                enzAnno = "<moose:ModelAnnotation>\n"
                 if ele.className == "Neutral":
-                    enzGpnCorCol = "<moose:Group> " + ele.name + " </moose:Group>\n"
-                if sceneitems[element]:
-                    v = sceneitems[element]
-                    if autoCoordinateslayout == False:
-                        enzGpnCorCol = enzGpnCorCol + "<moose:xCord>" + \
-                            str(v['x']) + "</moose:xCord>\n" + \
-                            "<moose:yCord>" + str(v['y']) + "</moose:yCord>\n"
-                    elif autoCoordinateslayout == True:
-                        x = calPrime(v['x'])
-                        y = calPrime(v['y'])
-                        enzGpnCorCol = enzGpnCorCol + "<moose:xCord>" + \
-                            str(x) + "</moose:xCord>\n" + \
-                            "<moose:yCord>" + str(y) + "</moose:yCord>\n"
+                    enzGpnCorCol =  "<moose:Group>" + ele.name + "</moose:Group>\n"
+                if sceneitems:
+                    #Saved from GUI, then scene co-ordinates are passed
+                    enzGpnCorCol = enzGpnCorCol + "<moose:xCord>" + \
+                            str(sceneitems[enz]['x']) + "</moose:xCord>\n" + \
+                            "<moose:yCord>" + \
+                            str(sceneitems[enz]['y'])+ "</moose:yCord>\n"
+                else:
+                    #Saved from cmdline,genesis coordinates are kept as its
+                    # SBML, cspace, python, then auto-coordinates are done
+                    #and coordinates are updated in moose Annotation field
+                    enzGpnCorCol = enzGpnCorCol + "<moose:xCord>" + \
+                            str(Anno.x) + "</moose:xCord>\n" + \
+                            "<moose:yCord>" + \
+                            str(Anno.y)+ "</moose:yCord>\n"
                 if Anno.color:
                     enzGpnCorCol = enzGpnCorCol + "<moose:bgColor>" + Anno.color + "</moose:bgColor>\n"
                 if Anno.textColor:
@@ -501,7 +507,7 @@ def listofname(reacSub, mobjEnz):
             nameList_.append(clean_name)
 
 
-def writeReac(modelpath, cremodel_, sceneitems, autoCoordinateslayout):
+def writeReac(modelpath, cremodel_, sceneitems):
     for reac in moose.wildcardFind(modelpath + '/##[ISA=ReacBase]'):
         reacSub = reac.neighbors["sub"]
         reacPrd = reac.neighbors["prd"]
@@ -537,34 +543,34 @@ def writeReac(modelpath, cremodel_, sceneitems, autoCoordinateslayout):
                     reaction.setNotes(notesStringR)
                 element = moose.element(reac)
                 ele = getGroupinfo(element)
-                if ele.className == "Neutral" or sceneitems[
-                        element] or Anno.color or Anno.textColor:
+                if element.className == "Neutral" or sceneitems or Anno.x or Anno.y:
                     reacannoexist = True
                 if reacannoexist:
                     reacAnno = "<moose:ModelAnnotation>\n"
                     if ele.className == "Neutral":
                         reacAnno = reacAnno + "<moose:Group>" + ele.name + "</moose:Group>\n"
-                    if sceneitems[element]:
-                        v = sceneitems[element]
-                        if autoCoordinateslayout == False:
-                            reacAnno = reacAnno + "<moose:xCord>" + \
-                                str(v['x']) + "</moose:xCord>\n" + \
+                    if sceneitems:
+                        #Saved from GUI, then scene co-ordinates are passed
+                        reacAnno = reacAnno + "<moose:xCord>" + \
+                                str(sceneitems[reac]['x']) + "</moose:xCord>\n" + \
+                                "<moose:yCord>" + \
+                                str(sceneitems[reac]['y'])+ "</moose:yCord>\n"
+                    else:
+                        #Saved from cmdline,genesis coordinates are kept as its
+                        # SBML, cspace, python, then auto-coordinates are done
+                        #and coordinates are updated in moose Annotation field
+                        reacAnno = reacAnno + "<moose:xCord>" + \
+                                str(Anno.x) + "</moose:xCord>\n" + \
                                 "<moose:yCord>" + \
-                                str(v['y']) + "</moose:yCord>\n"
-                        elif autoCoordinateslayout == True:
-                            x = calPrime(v['x'])
-                            y = calPrime(v['y'])
-                            reacAnno = reacAnno + "<moose:xCord>" + \
-                                str(x) + "</moose:xCord>\n" + \
-                                "<moose:yCord>" + str(y) + "</moose:yCord>\n"
+                                str(Anno.y)+ "</moose:yCord>\n"
                     if Anno.color:
                         reacAnno = reacAnno + "<moose:bgColor>" + Anno.color + "</moose:bgColor>\n"
                     if Anno.textColor:
                         reacAnno = reacAnno + "<moose:textColor>" + \
                             Anno.textColor + "</moose:textColor>\n"
                     reacAnno = reacAnno + "</moose:ModelAnnotation>"
-                    # s1.appendAnnotation(XMLNode.convertStringToXMLNode(speciAnno))
                     reaction.setAnnotation(reacAnno)
+
             kl_s, sRL, pRL, compt = "", "", "", ""
 
             if not reacSub and not reacPrd:
@@ -712,8 +718,7 @@ def convertSpecialChar(str1):
     return str1
 
 
-def writeSpecies(modelpath, cremodel_, sbmlDoc,
-                 sceneitems, autoCoordinateslayout):
+def writeSpecies(modelpath, cremodel_, sbmlDoc, sceneitems):
     # getting all the species
     for spe in moose.wildcardFind(modelpath + '/##[ISA=PoolBase]'):
         sName = convertSpecialChar(spe.name)
@@ -785,28 +790,29 @@ def writeSpecies(modelpath, cremodel_, sbmlDoc,
                         cleanNotesS + "\n\t </body>"
                     s1.setNotes(notesStringS)
 
+
                 element = moose.element(spe)
                 ele = getGroupinfo(element)
-                if ele.className == "Neutral" or sceneitems[
-                        element] or Anno.color or Anno.textColor:
+                if element.className == "Neutral" or Anno.color or Anno.textColor or sceneitems or Anno.x or Anno.y:
                     speciannoexist = True
                 if speciannoexist:
                     speciAnno = "<moose:ModelAnnotation>\n"
                     if ele.className == "Neutral":
                         speciAnno = speciAnno + "<moose:Group>" + ele.name + "</moose:Group>\n"
-                    if sceneitems[element]:
-                        v = sceneitems[element]
-                        if autoCoordinateslayout == False:
-                            speciAnno = speciAnno + "<moose:xCord>" + \
-                                str(v['x']) + "</moose:xCord>\n" + \
+                    if sceneitems:
+                        #Saved from GUI, then scene co-ordinates are passed
+                        speciAnno = speciAnno + "<moose:xCord>" + \
+                                str(sceneitems[spe]['x']) + "</moose:xCord>\n" + \
+                                "<moose:yCord>" + \
+                                str(sceneitems[spe]['y'])+ "</moose:yCord>\n"
+                    else:
+                        #Saved from cmdline,genesis coordinates are kept as its
+                        # SBML, cspace, python, then auto-coordinates are done
+                        #and coordinates are updated in moose Annotation field
+                        speciAnno = speciAnno + "<moose:xCord>" + \
+                                str(Anno.x) + "</moose:xCord>\n" + \
                                 "<moose:yCord>" + \
-                                str(v['y']) + "</moose:yCord>\n"
-                        elif autoCoordinateslayout == True:
-                            x = calPrime(v['x'])
-                            y = calPrime(v['y'])
-                            speciAnno = speciAnno + "<moose:xCord>" + \
-                                str(x) + "</moose:xCord>\n" + \
-                                "<moose:yCord>" + str(y) + "</moose:yCord>\n"
+                                str(Anno.y)+ "</moose:yCord>\n"
                     if Anno.color:
                         speciAnno = speciAnno + "<moose:bgColor>" + Anno.color + "</moose:bgColor>\n"
                     if Anno.textColor:
@@ -819,7 +825,8 @@ def writeSpecies(modelpath, cremodel_, sbmlDoc,
 
 def writeCompt(modelpath, cremodel_):
     # getting all the compartments
-    for compt in moose.wildcardFind(modelpath + '/##[ISA=ChemCompt]'):
+    compts = moose.wildcardFind(modelpath + '/##[ISA=ChemCompt]')
+    for compt in compts:
         comptName = convertSpecialChar(compt.name)
         # converting m3 to litre
         size = compt.volume * pow(10, 3)
@@ -836,7 +843,10 @@ def writeCompt(modelpath, cremodel_):
         c1.setSize(size)
         c1.setSpatialDimensions(ndim)
         c1.setUnits('volume')
-
+    if compts:
+        return True
+    else:
+        return False
 # write Simulation runtime,simdt,plotdt
 def writeSimulationAnnotation(modelpath):
     modelAnno = ""
@@ -867,18 +877,17 @@ def writeSimulationAnnotation(modelpath):
                     graphSpefound = True
                 if graphSpefound:
                     if not plots:
-                        #plots = ori[ori.find(q.name)-1:len(ori)]
-                        plots = '/' + q.name + '/' + name
+                        plots = ori[ori.find(q.name)-1:len(ori)]
+                        #plots = '/' + q.name + '/' + name
 
                     else:
-                        #plots = plots + "; "+ori[ori.find(q.name)-1:len(ori)]
-                        plots = plots + "; /" + q.name + '/' + name
+                        plots = plots + "; "+ori[ori.find(q.name)-1:len(ori)]
+                        #plots = plots + "; /" + q.name + '/' + name
         if plots != " ":
             modelAnno = modelAnno + "<moose:plots> " + plots + "</moose:plots>\n"
         modelAnno = modelAnno + "</moose:ModelAnnotation>"
     return modelAnno
 
-
 def writeUnits(cremodel_):
     unitVol = cremodel_.createUnitDefinition()
     unitVol.setId("volume")
@@ -896,357 +905,28 @@ def writeUnits(cremodel_):
     unit.setExponent(1.0)
     unit.setScale(-3)
 
-
-def validateModel(sbmlDoc):
-    # print " sbmlDoc ",sbmlDoc.toSBML()
-    if (not sbmlDoc):
-        print("validateModel: given a null SBML Document")
-        return False
-    consistencyMessages = ""
-    validationMessages = ""
-    noProblems = True
-    numCheckFailures = 0
-    numConsistencyErrors = 0
-    numConsistencyWarnings = 0
-    numValidationErrors = 0
-    numValidationWarnings = 0
-    # Once the whole model is done and before it gets written out,
-    # it's important to check that the whole model is in fact complete,
-    # consistent and valid.
-    numCheckFailures = sbmlDoc.checkInternalConsistency()
-    if (numCheckFailures > 0):
-        noProblems = False
-        for i in range(0, numCheckFailures):
-            sbmlErr = sbmlDoc.getError(i)
-            if (sbmlErr.isFatal() or sbmlErr.isError()):
-                numConsistencyErrors += 1
-            else:
-                numConsistencyWarnings += 1
-        constStr = sbmlDoc.printErrors()
-        consistencyMessages = constStr
-
-    # If the internal checks fail, it makes little sense to attempt
-    # further validation, because the model may be too compromised to
-    # be properly interpreted.
-    if (numConsistencyErrors > 0):
-        consistencyMessages += "Further validation aborted."
-    else:
-        numCheckFailures = sbmlDoc.checkConsistency()
-        #numCheckFailures = sbmlDoc.checkL3v1Compatibility()
-        if (numCheckFailures > 0):
-            noProblems = False
-            for i in range(0, (numCheckFailures)):
-                consistencyMessages = sbmlDoc.getErrorLog().toString()
-                sbmlErr = sbmlDoc.getError(i)
-                if (sbmlErr.isFatal() or sbmlErr.isError()):
-                    numValidationErrors += 1
-                else:
-                    numValidationWarnings += 1
-        warning = sbmlDoc.getErrorLog().toString()
-        oss = sbmlDoc.printErrors()
-        validationMessages = oss
-    if (noProblems):
-        return True
-    else:
-        if consistencyMessages is None:
-            consistencyMessages = ""
-        if consistencyMessages != "":
-            print(" consistency Warning: " + consistencyMessages)
-
-        if (numConsistencyErrors > 0):
-            if numConsistencyErrors == 1:
-                t = ""
-            else:
-                t = "s"
-            print(
-                "ERROR: encountered " +
-                numConsistencyErrors +
-                " consistency error" +
-                t +
-                " in model '" +
-                sbmlDoc.getModel().getId() +
-                "'.")
-    if (numConsistencyWarnings > 0):
-        if numConsistencyWarnings == 1:
-            t1 = ""
-        else:
-            t1 = "s"
-        print(
-            "Notice: encountered " +
-            numConsistencyWarnings +
-            " consistency warning" +
-            t +
-            " in model '" +
-            sbmlDoc.getModel().getId() +
-            "'.")
-
-    if (numValidationErrors > 0):
-        if numValidationErrors == 1:
-            t2 = ""
-        else:
-            t2 = "s"
-        print(
-            "ERROR: encountered " +
-            numValidationErrors +
-            " validation error" +
-            t2 +
-            " in model '" +
-            sbmlDoc.getModel().getId() +
-            "'.")
-        if (numValidationWarnings > 0):
-            if numValidationWarnings == 1:
-                t3 = ""
-            else:
-                t3 = "s"
-
-            print(
-                "Notice: encountered " +
-                numValidationWarnings +
-                " validation warning" +
-                t3 +
-                " in model '" +
-                sbmlDoc.getModel().getId() +
-                "'.")
-
-        print(validationMessages)
-    return (numConsistencyErrors == 0 and numValidationErrors == 0)
-    # return ( numConsistencyErrors == 0 and numValidationErrors == 0,
-    # consistencyMessages)
-
-
-def setupItem(modelPath):
-    '''This function collects information of what is connected to what. \
-    eg. substrate and product connectivity to reaction's and enzyme's \
-    sumtotal connectivity to its pool are collected '''
-    # print " setupItem"
-    sublist = []
-    prdlist = []
-    cntDict = {}
-    zombieType = ['ReacBase', 'EnzBase', 'Function', 'StimulusTable']
-    for baseObj in zombieType:
-        path = '/##[ISA=' + baseObj + ']'
-        if modelPath != '/':
-            path = modelPath + path
-        if ((baseObj == 'ReacBase') or (baseObj == 'EnzBase')):
-            for items in moose.wildcardFind(path):
-                sublist = []
-                prdlist = []
-                uniqItem, countuniqItem = countitems(items, 'subOut')
-                subNo = uniqItem
-                for sub in uniqItem:
-                    sublist.append((moose.element(sub), 's', countuniqItem[sub]))
-
-                uniqItem, countuniqItem = countitems(items, 'prd')
-                prdNo = uniqItem
-                if (len(subNo) == 0 or len(prdNo) == 0):
-                    print("Substrate Product is empty ", " ", items)
-                for prd in uniqItem:
-                    prdlist.append((moose.element(prd), 'p', countuniqItem[prd]))
-
-                if (baseObj == 'CplxEnzBase'):
-                    uniqItem, countuniqItem = countitems(items, 'toEnz')
-                    for enzpar in uniqItem:
-                        sublist.append(
-                            (moose.element(enzpar), 't', countuniqItem[enzpar]))
-
-                    uniqItem, countuniqItem = countitems(items, 'cplxDest')
-                    for cplx in uniqItem:
-                        prdlist.append(
-                            (moose.element(cplx), 'cplx', countuniqItem[cplx]))
-
-                if (baseObj == 'EnzBase'):
-                    uniqItem, countuniqItem = countitems(items, 'enzDest')
-                    for enzpar in uniqItem:
-                        sublist.append(
-                            (moose.element(enzpar), 't', countuniqItem[enzpar]))
-                cntDict[items] = sublist, prdlist
-        elif baseObj == 'Function':
-            for items in moose.wildcardFind(path):
-                sublist = []
-                prdlist = []
-                item = items.path + '/x[0]'
-                uniqItem, countuniqItem = countitems(item, 'input')
-                for funcpar in uniqItem:
-                    sublist.append(
-                        (moose.element(funcpar), 'sts', countuniqItem[funcpar]))
-
-                uniqItem, countuniqItem = countitems(items, 'valueOut')
-                for funcpar in uniqItem:
-                    prdlist.append(
-                        (moose.element(funcpar), 'stp', countuniqItem[funcpar]))
-                cntDict[items] = sublist, prdlist
-        else:
-            for tab in moose.wildcardFind(path):
-                tablist = []
-                uniqItem, countuniqItem = countitems(tab, 'output')
-                for tabconnect in uniqItem:
-                    tablist.append(
-                        (moose.element(tabconnect), 'tab', countuniqItem[tabconnect]))
-                cntDict[tab] = tablist
-    return cntDict
-
-
-def countitems(mitems, objtype):
-    items = []
-    # print "mitems in countitems ",mitems,objtype
-    items = moose.element(mitems).neighbors[objtype]
-    uniqItems = set(items)
-    countuniqItems = Counter(items)
-    return(uniqItems, countuniqItems)
-
-
-def setupMeshObj(modelRoot):
-    ''' Setup compartment and its members pool,reaction,enz cplx under self.meshEntry dictionaries \
-    self.meshEntry with "key" as compartment,
-    value is key2:list where key2 represents moose object type,list of objects of a perticular type
-    e.g self.meshEntry[meshEnt] = { 'reaction': reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist }
-    '''
-    meshEntry = {}
-    if meshEntry:
-        meshEntry.clear()
+if __name__ == "__main__":
+    try:
+        sys.argv[1]
+    except IndexError:
+        print("Filename or path not given")
+        exit(0)
     else:
-        meshEntry = {}
-    meshEntryWildcard = '/##[ISA=ChemCompt]'
-    if modelRoot != '/':
-        meshEntryWildcard = modelRoot + meshEntryWildcard
-    for meshEnt in moose.wildcardFind(meshEntryWildcard):
-        mollist = []
-        cplxlist = []
-        mol_cpl = moose.wildcardFind(meshEnt.path + '/##[ISA=PoolBase]')
-        funclist = moose.wildcardFind(meshEnt.path + '/##[ISA=Function]')
-        enzlist = moose.wildcardFind(meshEnt.path + '/##[ISA=EnzBase]')
-        realist = moose.wildcardFind(meshEnt.path + '/##[ISA=ReacBase]')
-        tablist = moose.wildcardFind(meshEnt.path + '/##[ISA=StimulusTable]')
-        if mol_cpl or funclist or enzlist or realist or tablist:
-            for m in mol_cpl:
-                if isinstance(moose.element(m.parent), moose.CplxEnzBase):
-                    cplxlist.append(m)
-                elif isinstance(moose.element(m), moose.PoolBase):
-                    mollist.append(m)
-
-            meshEntry[meshEnt] = {'enzyme': enzlist,
-                                  'reaction': realist,
-                                  'pool': mollist,
-                                  'cplx': cplxlist,
-                                  'table': tablist,
-                                  'function': funclist
-                                  }
-    return(meshEntry)
-
-
-def autoCoordinates(meshEntry, srcdesConnection):
-    G = nx.Graph()
-    for cmpt, memb in list(meshEntry.items()):
-        for enzObj in find_index(memb, 'enzyme'):
-            G.add_node(
-                enzObj.path,
-                label='',
-                shape='ellipse',
-                color='',
-                style='filled',
-                fontname='Helvetica',
-                fontsize=12,
-                fontcolor='blue')
-    for cmpt, memb in list(meshEntry.items()):
-        for poolObj in find_index(memb, 'pool'):
-            #poolinfo = moose.element(poolObj.path+'/info')
-            G.add_node(
-                poolObj.path,
-                label=poolObj.name,
-                shape='box',
-                color='',
-                style='filled',
-                fontname='Helvetica',
-                fontsize=12,
-                fontcolor='blue')
-        for cplxObj in find_index(memb, 'cplx'):
-            pass
-        for reaObj in find_index(memb, 'reaction'):
-            G.add_node(reaObj.path, label='', shape='record', color='')
-
-    for inn, out in list(srcdesConnection.items()):
-        if (inn.className == 'ZombieReac'):
-            arrowcolor = 'green'
-        elif(inn.className == 'ZombieEnz'):
-            arrowcolor = 'red'
+        filepath = sys.argv[1]
+        if not os.path.exists(filepath):
+            print("Filename or path does not exist",filepath)
         else:
-            arrowcolor = 'blue'
-        if isinstance(out, tuple):
-            if len(out[0]) == 0:
-                print(
-                    inn.className +
-                    ':' +
-                    inn.name +
-                    "  doesn't have input message")
+            try:
+                sys.argv[2]
+            except :
+                modelpath = filepath[filepath.rfind('/'):filepath.find('.')]
             else:
-                for items in (items for items in out[0]):
-                    G.add_edge(moose.element(items[0]).path, inn.path)
-
-            if len(out[1]) == 0:
-                print(
-                    inn.className +
-                    ':' +
-                    inn.name +
-                    "doesn't have output mssg")
-            else:
-                for items in (items for items in out[1]):
-                    G.add_edge(inn.path, moose.element(items[0]).path)
+                modelpath = sys.argv[2]
+    
+            moose.loadModel(filepath, modelpath, "gsl")
 
-        elif isinstance(out, list):
-            if len(out) == 0:
-                print("Func pool doesn't have sumtotal")
+            written, c, writtentofile = mooseWriteSBML(modelpath, filepath)
+            if written:
+                print(" File written to ", writtentofile)
             else:
-                for items in (items for items in out):
-                    G.add_edge(moose.element(items[0]).path, inn.path)
-    #from networkx.drawing.nx_agraph import graphviz_layout
-    #position = graphviz_layout(G,prog='dot')
-
-    position = nx.pygraphviz_layout(G, prog='dot')
-    position = nx.spring_layout(G)
-    #agraph = nx.to_agraph(G)
-    #agraph.draw("~/out.png", format = 'png', prog = 'dot')
-
-    sceneitems = {}
-    xycord = []
-    cmin = 0
-    cmax = 0
-    for key, value in list(position.items()):
-        xycord.append(value[0])
-        xycord.append(value[1])
-        sceneitems[moose.element(key)] = {'x': value[0], 'y': value[1]}
-    if len(xycord) > 0:
-        cmin = min(xycord)
-        cmax = max(xycord)
-    return cmin, cmax, sceneitems
-
-
-def calPrime(x):
-    prime = int((20 * (float(x - cmin) / float(cmax - cmin))) - 10)
-    return prime
-
-
-def find_index(value, key):
-    """ Value.get(key) to avoid expection which would raise if empty value in dictionary for a given key """
-    if value.get(key) is not None:
-        return value.get(key)
-    else:
-        raise ValueError('no dict with the key found')
-if __name__ == "__main__":
-
-    filepath = sys.argv[1]
-    path = sys.argv[2]
-
-    f = open(filepath, 'r')
-
-    if path == '':
-        loadpath = filepath[filepath.rfind('/'):filepath.find('.')]
-    else:
-        loadpath = path
-
-    moose.loadModel(filepath, loadpath, "gsl")
-
-    written, c, writtentofile = mooseWriteSBML(loadpath, filepath)
-    if written:
-        print(" File written to ", writtentofile)
-    else:
-        print(" could not write model to SBML file")
+                print(" could not write model to SBML file")
diff --git a/python/moose/chemUtil/__init__.py b/python/moose/chemUtil/__init__.py
new file mode 100644
index 00000000..dce7080f
--- /dev/null
+++ b/python/moose/chemUtil/__init__.py
@@ -0,0 +1,3 @@
+from .add_Delete_ChemicalSolver import *
+from .chemConnectUtil import *
+from .graphUtils import autoCoordinates
diff --git a/python/moose/add_Delete_ChemicalSolver.py b/python/moose/chemUtil/add_Delete_ChemicalSolver.py
similarity index 94%
rename from python/moose/add_Delete_ChemicalSolver.py
rename to python/moose/chemUtil/add_Delete_ChemicalSolver.py
index f788118b..af9437b9 100644
--- a/python/moose/add_Delete_ChemicalSolver.py
+++ b/python/moose/chemUtil/add_Delete_ChemicalSolver.py
@@ -1,5 +1,4 @@
-from . import _moose as moose
-
+import moose
 
 def moosedeleteChemSolver(modelRoot):
     """Delete solvers from Chemical Compartment
@@ -25,11 +24,11 @@ def mooseaddChemSolver(modelRoot, solver):
         comptinfo = moose.Annotator(moose.element(compt[0]).path + '/info')
         previousSolver = comptinfo.solver
         currentSolver = previousSolver
-        if solver == "Gillespie":
+        if solver == "Gillespie" or solver == "gssa":
             currentSolver = "gssa"
-        elif solver == "Runge Kutta":
+        elif solver == "Runge Kutta" or solver == "gsl":
             currentSolver = "gsl"
-        elif solver == "Exponential Euler":
+        elif solver == "Exponential Euler" or solver == "ee":
             currentSolver = "ee"
 
         if previousSolver != currentSolver:
diff --git a/python/moose/chemUtil/chemConnectUtil.py b/python/moose/chemUtil/chemConnectUtil.py
new file mode 100644
index 00000000..93d8be9d
--- /dev/null
+++ b/python/moose/chemUtil/chemConnectUtil.py
@@ -0,0 +1,181 @@
+import moose
+import numpy as np
+from collections import Counter
+
+def xyPosition(objInfo,xory):
+    try:
+        return(float(moose.element(objInfo).getField(xory)))
+    except ValueError:
+        return (float(0))
+
+def setupMeshObj(modelRoot):
+    ''' Setup compartment and its members pool,reaction,enz cplx under self.meshEntry dictionaries \ 
+    self.meshEntry with "key" as compartment, 
+    value is key2:list where key2 represents moose object type,list of objects of a perticular type
+    e.g self.meshEntry[meshEnt] = { 'reaction': reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist }
+    '''
+    xmin = 0.0
+    xmax = 1.0
+    ymin = 0.0
+    ymax = 1.0
+    listOfitems = {}
+    positionInfoExist = True
+    meshEntry = {}
+    if meshEntry:
+        meshEntry.clear()
+    else:
+        meshEntry = {}
+    xcord = []
+    ycord = []
+    meshEntryWildcard = '/##[ISA=ChemCompt]'
+    if modelRoot != '/':
+        meshEntryWildcard = modelRoot+meshEntryWildcard
+    for meshEnt in moose.wildcardFind(meshEntryWildcard):
+        mollist  = []
+        realist  = []
+        enzlist  = []
+        cplxlist = []
+        tablist  = []
+        funclist = []
+
+        mol_cpl  = moose.wildcardFind(meshEnt.path+'/##[ISA=PoolBase]')
+        funclist = moose.wildcardFind(meshEnt.path+'/##[ISA=Function]')
+        enzlist  = moose.wildcardFind(meshEnt.path+'/##[ISA=EnzBase]')
+        realist  = moose.wildcardFind(meshEnt.path+'/##[ISA=ReacBase]')
+        tablist  = moose.wildcardFind(meshEnt.path+'/##[ISA=StimulusTable]')
+        if mol_cpl or funclist or enzlist or realist or tablist:
+            for m in mol_cpl:
+                if isinstance(moose.element(m.parent),moose.CplxEnzBase):
+                    cplxlist.append(m)
+                    objInfo = m.parent.path+'/info'
+                elif isinstance(moose.element(m),moose.PoolBase):
+                    mollist.append(m)
+                    objInfo =m.path+'/info'
+                if moose.exists(objInfo):
+                    listOfitems[moose.element(moose.element(objInfo).parent)]={'x':xyPosition(objInfo,'x'),'y':xyPosition(objInfo,'y')}
+                
+                xcord.append(xyPosition(objInfo,'x'))
+                ycord.append(xyPosition(objInfo,'y')) 
+
+            getxyCord(xcord,ycord,funclist,listOfitems)
+            getxyCord(xcord,ycord,enzlist,listOfitems)
+            getxyCord(xcord,ycord,realist,listOfitems)
+            getxyCord(xcord,ycord,tablist,listOfitems)
+
+            meshEntry[meshEnt] = {'enzyme':enzlist,
+                                  'reaction':realist,
+                                  'pool':mollist,
+                                  'cplx':cplxlist,
+                                  'table':tablist,
+                                  'function':funclist
+                                  }
+            positionInfoExist = not(len(np.nonzero(xcord)[0]) == 0 \
+                and len(np.nonzero(ycord)[0]) == 0)
+            if positionInfoExist:
+                xmin = min(xcord)
+                xmax = max(xcord)
+                ymin = min(ycord)
+                ymax = max(ycord)
+    return meshEntry,xmin,xmax,ymin,ymax,positionInfoExist,listOfitems
+
+def sizeHint(self):
+    return QtCore.QSize(800,400)
+
+def getxyCord(xcord,ycord,list1,listOfitems):
+    for item in list1:
+        # if isinstance(item,Function):
+        #     objInfo = moose.element(item.parent).path+'/info'
+        # else:
+        #     objInfo = item.path+'/info'
+        if not isinstance(item,moose.Function):
+            objInfo = item.path+'/info'
+            xcord.append(xyPosition(objInfo,'x'))
+            ycord.append(xyPosition(objInfo,'y'))
+            if moose.exists(objInfo):
+                listOfitems[moose.element(moose.element(objInfo).parent)]={'x':xyPosition(objInfo,'x'),'y':xyPosition(objInfo,'y')}
+
+def setupItem(modelPath,cntDict):
+    '''This function collects information of what is connected to what. \
+    eg. substrate and product connectivity to reaction's and enzyme's \
+    sumtotal connectivity to its pool are collected '''
+    #print " setupItem"
+    sublist = []
+    prdlist = []
+    zombieType = ['ReacBase','EnzBase','Function','StimulusTable']
+    for baseObj in zombieType:
+        path = '/##[ISA='+baseObj+']'
+        if modelPath != '/':
+            path = modelPath+path
+        if ( (baseObj == 'ReacBase') or (baseObj == 'EnzBase')):
+            for items in moose.wildcardFind(path):
+                sublist = []
+                prdlist = []
+                uniqItem,countuniqItem = countitems(items,'subOut')
+                subNo = uniqItem
+                for sub in uniqItem: 
+                    sublist.append((moose.element(sub),'s',countuniqItem[sub]))
+
+                uniqItem,countuniqItem = countitems(items,'prd')
+                prdNo = uniqItem
+                if (len(subNo) == 0 or len(prdNo) == 0):
+                    print ("Substrate Product is empty ",path, " ",items)
+                    
+                for prd in uniqItem:
+                    prdlist.append((moose.element(prd),'p',countuniqItem[prd]))
+                
+                if (baseObj == 'CplxEnzBase') :
+                    uniqItem,countuniqItem = countitems(items,'toEnz')
+                    for enzpar in uniqItem:
+                        sublist.append((moose.element(enzpar),'t',countuniqItem[enzpar]))
+                    
+                    uniqItem,countuniqItem = countitems(items,'cplxDest')
+                    for cplx in uniqItem:
+                        prdlist.append((moose.element(cplx),'cplx',countuniqItem[cplx]))
+
+                if (baseObj == 'EnzBase'):
+                    uniqItem,countuniqItem = countitems(items,'enzDest')
+                    for enzpar in uniqItem:
+                        sublist.append((moose.element(enzpar),'t',countuniqItem[enzpar]))
+                cntDict[items] = sublist,prdlist
+        elif baseObj == 'Function':
+            for items in moose.wildcardFind(path):
+                sublist = []
+                prdlist = []
+                item = items.path+'/x[0]'
+                uniqItem,countuniqItem = countitems(item,'input')
+                for funcpar in uniqItem:
+                    sublist.append((moose.element(funcpar),'sts',countuniqItem[funcpar]))
+                
+                uniqItem,countuniqItem = countitems(items,'valueOut')
+                for funcpar in uniqItem:
+                    prdlist.append((moose.element(funcpar),'stp',countuniqItem[funcpar]))
+                cntDict[items] = sublist,prdlist
+
+        # elif baseObj == 'Function':
+        #     #ZombieSumFunc adding inputs
+        #     inputlist = []
+        #     outputlist = []
+        #     funplist = []
+        #     nfunplist = []
+        #     for items in moose.wildcardFind(path):
+        #         for funplist in moose.element(items).neighbors['valueOut']:
+        #             for func in funplist:
+        #                 funcx = moose.element(items.path+'/x[0]')
+        #                 uniqItem,countuniqItem = countitems(funcx,'input')
+        #                 for inPut in uniqItem:
+        #                     inputlist.append((inPut,'st',countuniqItem[inPut]))
+        #             cntDict[func] = inputlist
+        else:
+            for tab in moose.wildcardFind(path):
+                tablist = []
+                uniqItem,countuniqItem = countitems(tab,'output')
+                for tabconnect in uniqItem:
+                    tablist.append((moose.element(tabconnect),'tab',countuniqItem[tabconnect]))
+                cntDict[tab] = tablist
+
+def countitems(mitems,objtype):
+    items = []
+    items = moose.element(mitems).neighbors[objtype]
+    uniqItems = set(items)
+    countuniqItems = Counter(items)
+    return(uniqItems,countuniqItems)
\ No newline at end of file
diff --git a/python/moose/chemUtil/graphUtils.py b/python/moose/chemUtil/graphUtils.py
new file mode 100644
index 00000000..5bf05f54
--- /dev/null
+++ b/python/moose/chemUtil/graphUtils.py
@@ -0,0 +1,87 @@
+import moose
+
+pygraphvizFound_ = True
+try:
+    import pygraphviz as pgv
+except Exception as e:
+    pygraphvizFound_ = False
+
+def autoCoordinates(meshEntry,srcdesConnection):
+    global pygraphvizFound_ 
+    positionInfo = {}
+
+    if not pygraphvizFound_:
+        print( '[warn] python-pygraphviz could not be found.' )
+        print( '\tMOOSE Install pygraphviz to use this feature' )
+        return positionInfo
+
+    if meshEntry:
+        #G = nx.Graph()
+        G = pgv.AGraph()
+
+        for cmpt,memb in list(meshEntry.items()):
+            for enzObj in find_index(memb,'enzyme'):
+                #G.add_node(enzObj.path)
+                G.add_node(enzObj.path,label='',shape='ellipse',color='',style='filled',fontname='Helvetica',fontsize=12,fontcolor='blue')
+        for cmpt,memb in list(meshEntry.items()):
+            for poolObj in find_index(memb,'pool'):
+                #G.add_node(poolObj.path)
+                G.add_node(poolObj.path,label = poolObj.name,shape = 'box',color = '',style = 'filled',fontname = 'Helvetica',fontsize = 12,fontcolor = 'blue')
+            for cplxObj in find_index(memb,'cplx'):
+                G.add_node(cplxObj.path)
+                G.add_node(cplxObj.path,label = cplxObj.name,shape = 'box',color = '',style = 'filled',fontname = 'Helvetica',fontsize = 12,fontcolor = 'blue')
+                #G.add_edge((cplxObj.parent).path,cplxObj.path)
+            for reaObj in find_index(memb,'reaction'):
+                #G.add_node(reaObj.path)
+                G.add_node(reaObj.path,label='',shape='circle',color='')
+            
+        for inn,out in list(srcdesConnection.items()):
+            if (inn.className =='ZombieReac'): arrowcolor = 'green'
+            elif(inn.className =='ZombieEnz'): arrowcolor = 'red'
+            else: arrowcolor = 'blue'
+            if isinstance(out,tuple):
+                if len(out[0])== 0:
+                    print( inn.className + ':' +inn.name + "  doesn't have input message")
+                else:
+                    for items in (items for items in out[0] ):
+                        G.add_edge(moose.element(items[0]).path,inn.path)
+                if len(out[1]) == 0:
+                    print(inn.className + ':' + inn.name + "doesn't have output mssg")
+                else:
+                    for items in (items for items in out[1] ):
+                        G.add_edge(inn.path,moose.element(items[0]).path)
+            elif isinstance(out,list):
+                if len(out) == 0:
+                    print ("Func pool doesn't have sumtotal")
+                else:
+                    for items in (items for items in out ):
+                        G.add_edge(moose.element(items[0]).path,inn.path)
+        
+        # if int( nx.__version__.split( '.' )[-1] ) >= 11:
+        #     position = nx.spring_layout( G )
+        # else:
+        #     position = nx.graphviz_layout(G, prog = 'dot')    
+        # for item in position.items():
+        #     xy = item[1]
+        #     ann = moose.Annotator(item[0]+'/info')
+        #     ann.x = xy[0]
+        #     ann.y = xy[1]
+        #     positioninfo[(moose.element(item[0]))] ={'x':float(xy[0]),'y':float(xy[1])}
+        
+        G.layout()
+        for n in G.nodes():
+            value = str(n.attr['pos'])
+            valuelist = (value.split(','))
+            positionInfo[(moose.element(n))] ={'x':float(valuelist[0]),'y':float(valuelist[1])}
+            ann = moose.Annotator(moose.element(n).path+'/info')
+            ann.x = float(valuelist[0])
+            ann.y = float(valuelist[1])
+
+    return positionInfo
+
+def find_index(value, key):
+    """ Value.get(key) to avoid expection which would raise if empty value in dictionary for a given key """
+    if value.get(key) != None:
+        return value.get(key)
+    else:
+        raise ValueError('no dict with the key found')
diff --git a/python/moose/genesis/writeKkit.py b/python/moose/genesis/writeKkit.py
index 226fe2a3..2bd33e21 100644
--- a/python/moose/genesis/writeKkit.py
+++ b/python/moose/genesis/writeKkit.py
@@ -1,22 +1,27 @@
 """ Chemical Signalling model loaded into moose can be save into Genesis-Kkit format """
 
 __author__           = "Harsha Rani"
-__copyright__        = "Copyright 2015, Harsha Rani and NCBS Bangalore"
+__copyright__        = "Copyright 2017, Harsha Rani and NCBS Bangalore"
 __credits__          = ["NCBS Bangalore"]
 __license__          = "GNU GPL"
 __version__          = "1.0.0"
 __maintainer__       = "Harsha Rani"
 __email__            = "hrani@ncbs.res.in"
 __status__           = "Development"
-
+__updated__          = "Feb 13 2017"
 import sys
 import random
-import moose
-import numpy as np
 import re
-from collections import Counter
-import networkx as nx
-import matplotlib 
+import moose
+from moose.chemUtil.chemConnectUtil import *
+from moose.chemUtil.graphUtils import *
+
+foundmatplotlib_ = False
+try:
+    import matplotlib
+    foundmatplotlib_ = True
+except Exception as e:
+    pass
 
 GENESIS_COLOR_SEQUENCE = ((248, 0, 255), (240, 0, 255), (232, 0, 255), (224, 0, 255), (216, 0, 255), (208, 0, 255),
  (200, 0, 255), (192, 0, 255), (184, 0, 255), (176, 0, 255), (168, 0, 255), (160, 0, 255), (152, 0, 255), (144, 0, 255),
@@ -38,264 +43,117 @@ GENESIS_COLOR_SEQUENCE = ((248, 0, 255), (240, 0, 255), (232, 0, 255), (224, 0,
 #Todo : To be written
 #               --StimulusTable
 
-def mooseWriteKkit( modelpath, filename,sceneitems=None):
-    if filename.rfind('.') != -1:
-        filename = filename[:filename.rfind('.')]
-    else:
-        filename = filename[:len(filename)]
-    filename = filename+'.g'
-    global NA
-    NA = 6.0221415e23
-    global cmin,cmax,xmin,xmax,ymin,ymax
-    cmin = 0 
-    cmax = 1
-    xmin = 0
-    xmax = 1
-    ymin = 0
-    ymax = 1
-
-    compt = moose.wildcardFind(modelpath+'/##[ISA=ChemCompt]')
-    maxVol = estimateDefaultVol(compt)
-    f = open(filename, 'w')
-
-    if sceneitems == None:
-        srcdesConnection = {}
-        setupItem(modelpath,srcdesConnection)
-        meshEntry = setupMeshObj(modelpath)
-        cmin,cmax,sceneitems = autoCoordinates(meshEntry,srcdesConnection)
-        for k,v in list(sceneitems.items()):
-            v = sceneitems[k]
-            x1 = calPrime(v['x'])
-            y1 = calPrime(v['y'])
-            sceneitems[k]['x'] = x1
-            sceneitems[k]['y'] = y1
-    else:
-        cs, xcord, ycord = [], [] ,[]
-        for k,v in list(sceneitems.items()):
-            xcord.append(v['x'])
-            cs.append(v['x'])
-            ycord.append(v['y'])
-            cs.append(v['y'])
-        xmin = min(xcord)
-        xmax = max(xcord)
-        ymin = min(ycord)
-        ymax = max(ycord)
-
-        cmin = min(cs)
-        cmax = max(cs)
-    writeHeader (f,maxVol)
-    
-    if (compt > 0):
-        gtId_vol = writeCompartment(modelpath,compt,f)
-        writePool(modelpath,f,gtId_vol,sceneitems)
-        reacList = writeReac(modelpath,f,sceneitems)
-        enzList = writeEnz(modelpath,f,sceneitems)
-        writeSumtotal(modelpath,f)
-        f.write("simundump xgraph /graphs/conc1 0 0 99 0.001 0.999 0\n"
-                "simundump xgraph /graphs/conc2 0 0 100 0 1 0\n")
-        tgraphs = moose.wildcardFind(modelpath+'/##[ISA=Table2]')
-        first, second = " ", " "
-        if tgraphs:
-            first,second = writeplot(tgraphs,f)
-        if first:
-            f.write(first)
-        f.write("simundump xgraph /moregraphs/conc3 0 0 100 0 1 0\n"
-                "simundump xgraph /moregraphs/conc4 0 0 100 0 1 0\n")
-        if second:
-            f.write(second)
-        f.write("simundump xcoredraw /edit/draw 0 -6 4 -2 6\n"
-                "simundump xtree /edit/draw/tree 0 \\\n"
-                "  /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \"edit_elm.D <v>; drag_from_edit.w <d> <S> <x> <y> <z>\" auto 0.6\n"
-                "simundump xtext /file/notes 0 1\n")
-        storeReacMsg(reacList,f)
-        storeEnzMsg(enzList,f)
-        if tgraphs:
-            storePlotMsgs(tgraphs,f)
-        writeFooter1(f)
-        writeNotes(modelpath,f)
-        writeFooter2(f)
-        return True
-    else:
-        print(("Warning: writeKkit:: No model found on " , modelpath))
+def mooseWriteKkit( modelpath, filename, sceneitems={}):
+    global foundmatplotlib_ 
+    if not foundmatplotlib_:
+        print('No maplotlib found.' 
+            '\nThis module can be installed by following command in terminal:'
+            '\n\t sudo apt install python-maplotlib', "")
         return False
-
-def calPrime(x):
-    prime = int((20*(float(x-cmin)/float(cmax-cmin)))-10)
-    return prime
-
-def setupItem(modelPath,cntDict):
-    '''This function collects information of what is connected to what. \
-    eg. substrate and product connectivity to reaction's and enzyme's \
-    sumtotal connectivity to its pool are collected '''
-    #print " setupItem"
-    sublist = []
-    prdlist = []
-    zombieType = ['ReacBase','EnzBase','Function','StimulusTable']
-    for baseObj in zombieType:
-        path = '/##[ISA='+baseObj+']'
-        if modelPath != '/':
-            path = modelPath+path
-        if ( (baseObj == 'ReacBase') or (baseObj == 'EnzBase')):
-            for items in moose.wildcardFind(path):
-                sublist = []
-                prdlist = []
-                uniqItem,countuniqItem = countitems(items,'subOut')
-                subNo = uniqItem
-                for sub in uniqItem: 
-                    sublist.append((moose.element(sub),'s',countuniqItem[sub]))
-
-                uniqItem,countuniqItem = countitems(items,'prd')
-                prdNo = uniqItem
-                if (len(subNo) == 0 or len(prdNo) == 0):
-                    print("Substrate Product is empty ",path, " ",items)
-                    
-                for prd in uniqItem:
-                    prdlist.append((moose.element(prd),'p',countuniqItem[prd]))
-                
-                if (baseObj == 'CplxEnzBase') :
-                    uniqItem,countuniqItem = countitems(items,'toEnz')
-                    for enzpar in uniqItem:
-                        sublist.append((moose.element(enzpar),'t',countuniqItem[enzpar]))
-                    
-                    uniqItem,countuniqItem = countitems(items,'cplxDest')
-                    for cplx in uniqItem:
-                        prdlist.append((moose.element(cplx),'cplx',countuniqItem[cplx]))
-
-                if (baseObj == 'EnzBase'):
-                    uniqItem,countuniqItem = countitems(items,'enzDest')
-                    for enzpar in uniqItem:
-                        sublist.append((moose.element(enzpar),'t',countuniqItem[enzpar]))
-                cntDict[items] = sublist,prdlist
-        elif baseObj == 'Function':
-            for items in moose.wildcardFind(path):
-                sublist = []
-                prdlist = []
-                item = items.path+'/x[0]'
-                uniqItem,countuniqItem = countitems(item,'input')
-                for funcpar in uniqItem:
-                    sublist.append((moose.element(funcpar),'sts',countuniqItem[funcpar]))
-                
-                uniqItem,countuniqItem = countitems(items,'valueOut')
-                for funcpar in uniqItem:
-                    prdlist.append((moose.element(funcpar),'stp',countuniqItem[funcpar]))
-                cntDict[items] = sublist,prdlist
-        else:
-            for tab in moose.wildcardFind(path):
-                tablist = []
-                uniqItem,countuniqItem = countitems(tab,'output')
-                for tabconnect in uniqItem:
-                    tablist.append((moose.element(tabconnect),'tab',countuniqItem[tabconnect]))
-                cntDict[tab] = tablist
-def countitems(mitems,objtype):
-    items = []
-    items = moose.element(mitems).neighbors[objtype]
-    uniqItems = set(items)
-    countuniqItems = Counter(items)
-    return(uniqItems,countuniqItems)
-
-def setupMeshObj(modelRoot):
-    ''' Setup compartment and its members pool,reaction,enz cplx under self.meshEntry dictionaries \ 
-    self.meshEntry with "key" as compartment, 
-    value is key2:list where key2 represents moose object type,list of objects of a perticular type
-    e.g self.meshEntry[meshEnt] = { 'reaction': reaction_list,'enzyme':enzyme_list,'pool':poollist,'cplx': cplxlist }
-    '''
-    meshEntry = {}
-    if meshEntry:
-        meshEntry.clear()
     else:
-        meshEntry = {}
-    meshEntryWildcard = '/##[ISA=ChemCompt]'
-    if modelRoot != '/':
-        meshEntryWildcard = modelRoot+meshEntryWildcard
-    for meshEnt in moose.wildcardFind(meshEntryWildcard):
-        mollist = []
-        cplxlist = []
-        mol_cpl  = moose.wildcardFind(meshEnt.path+'/##[ISA=PoolBase]')
-        funclist = moose.wildcardFind(meshEnt.path+'/##[ISA=Function]')
-        enzlist  = moose.wildcardFind(meshEnt.path+'/##[ISA=EnzBase]')
-        realist  = moose.wildcardFind(meshEnt.path+'/##[ISA=ReacBase]')
-        tablist  = moose.wildcardFind(meshEnt.path+'/##[ISA=StimulusTable]')
-        if mol_cpl or funclist or enzlist or realist or tablist:
-            for m in mol_cpl:
-                if isinstance(moose.element(m.parent),moose.CplxEnzBase):
-                    cplxlist.append(m)
-                elif isinstance(moose.element(m),moose.PoolBase):
-                    mollist.append(m)
-                    
-            meshEntry[meshEnt] = {'enzyme':enzlist,
-                                  'reaction':realist,
-                                  'pool':mollist,
-                                  'cplx':cplxlist,
-                                  'table':tablist,
-                                  'function':funclist
-                                  }
-    return(meshEntry)
-def autoCoordinates(meshEntry,srcdesConnection):
-    G = nx.Graph()
-    for cmpt,memb in list(meshEntry.items()):
-        for enzObj in find_index(memb,'enzyme'):
-            #G.add_node(enzObj.path)
-            G.add_node(enzObj.path,label=enzObj.name,shape='ellipse',color='',style='filled',fontname='Helvetica',fontsize=12,fontcolor='blue')
-    for cmpt,memb in list(meshEntry.items()):
-        for poolObj in find_index(memb,'pool'):
-            #G.add_node(poolObj.path)
-            G.add_node(poolObj.path,label = poolObj.name,shape = 'box',color = '',style = 'filled',fontname = 'Helvetica',fontsize = 12,fontcolor = 'blue')
-        for cplxObj in find_index(memb,'cplx'):
-            pass
-            #G.add_node(cplxObj.path)
-            #G.add_edge((cplxObj.parent).path,cplxObj.path)
-        for reaObj in find_index(memb,'reaction'):
-            #G.add_node(reaObj.path)
-            G.add_node(reaObj.path,label=reaObj.name,shape='',color='')
-        for funcObj in find_index(memb,'function'):
-            G.add_node(poolObj.path,label = funcObj.name,shape = 'box',color = 'red',style = 'filled',fontname = 'Helvetica',fontsize = 12,fontcolor = 'blue')
+        
+        ignoreColor= ["mistyrose","antiquewhite","aliceblue","azure","bisque","black","blanchedalmond","blue","cornsilk","darkolivegreen","darkslategray","dimgray","floralwhite","gainsboro","ghostwhite","honeydew","ivory","lavender","lavenderblush","lemonchiffon","lightcyan","lightgoldenrodyellow","lightgray","lightyellow","linen","mediumblue","mintcream","navy","oldlace","papayawhip","saddlebrown","seashell","snow","wheat","white","whitesmoke","aquamarine","lightsalmon","moccasin","limegreen","snow","sienna","beige","dimgrey","lightsage"]
+        matplotcolor = {}
+        for name,hexno in matplotlib.colors.cnames.items():
+            matplotcolor[name]=hexno
 
+        if filename.rfind('.') != -1:
+            filename = filename[:filename.rfind('.')]
+        else:
+            filename = filename[:len(filename)]
+        filename = filename+'.g'
+        global NA
+        NA = 6.0221415e23
+        global cmin,cmax,xmin,xmax,ymin,ymax
+        cmin, xmin, ymin = 0, 0, 0
+        cmax, xmax, ymax = 1, 1, 1
         
-    for inn,out in list(srcdesConnection.items()):
-        if (inn.className =='ZombieReac'): arrowcolor = 'green'
-        elif(inn.className =='ZombieEnz'): arrowcolor = 'red'
-        else: arrowcolor = 'blue'
-        if isinstance(out,tuple):
-            if len(out[0])== 0:
-                print(inn.className + ':' +inn.name + "  doesn't have input message")
-            else:
-                for items in (items for items in out[0] ):
-                    G.add_edge(moose.element(items[0]).path,inn.path)
-            if len(out[1]) == 0:
-                print(inn.className + ':' + inn.name + "doesn't have output mssg")
-            else:
-                for items in (items for items in out[1] ):
-                    G.add_edge(inn.path,moose.element(items[0]).path)
-        elif isinstance(out,list):
-            if len(out) == 0:
-                print("Func pool doesn't have sumtotal")
-            else:
-                for items in (items for items in out ):
-                    G.add_edge(moose.element(items[0]).path,inn.path)
-    
-    position = nx.graphviz_layout(G, prog = 'dot')
-    if int( nx.__version__.split( '.' )[-1] ) >= 11:
-        position = nx.spring_layout( G )
+        compt = moose.wildcardFind(modelpath+'/##[ISA=ChemCompt]')
+        maxVol = estimateDefaultVol(compt)
+        positionInfoExist = True
+        if compt:
+            if bool(sceneitems):
+                cmin,cmax,xmin1,xmax1,ymin1,ymax1 = findMinMax(sceneitems)
+            elif not bool(sceneitems):
+                srcdesConnection = {}
+                setupItem(modelpath,srcdesConnection)
+                meshEntry,xmin,xmax,ymin,ymax,positionInfoExist,sceneitems = setupMeshObj(modelpath)
+                if not positionInfoExist:
+                    #cmin,cmax,sceneitems = autoCoordinates(meshEntry,srcdesConnection)
+                    sceneitems = autoCoordinates(meshEntry,srcdesConnection)
+
+            if not positionInfoExist:        
+                # if position are not from kkit, then zoom factor is applied while
+                # writing to genesis. Like if position is from pyqtSceneItem or auto-coordinates
+                cmin,cmax,xmin1,xmax1,ymin1,ymax1 = findMinMax(sceneitems)
+                for k,v in list(sceneitems.items()):
+                    anno = moose.element(k.path+'/info')
+                    x1 = calPrime(v['x'])
+                    y1 = calPrime(v['y'])
+                    sceneitems[k]['x'] = x1
+                    sceneitems[k]['y'] = y1
+
+            f = open(filename, 'w')
+            writeHeader (f,maxVol)
+
+            gtId_vol = writeCompartment(modelpath,compt,f)
+            writePool(modelpath,f,gtId_vol,sceneitems)
+            reacList = writeReac(modelpath,f,sceneitems)
+            enzList = writeEnz(modelpath,f,sceneitems)
+            writeSumtotal(modelpath,f)
+            f.write("simundump xgraph /graphs/conc1 0 0 99 0.001 0.999 0\n"
+                    "simundump xgraph /graphs/conc2 0 0 100 0 1 0\n")
+            tgraphs = moose.wildcardFind(modelpath+'/##[ISA=Table2]')
+            first, second = " ", " "
+            if tgraphs:
+                first,second = writeplot(tgraphs,f)
+            if first:
+                f.write(first)
+            f.write("simundump xgraph /moregraphs/conc3 0 0 100 0 1 0\n"
+                    "simundump xgraph /moregraphs/conc4 0 0 100 0 1 0\n")
+            if second:
+                f.write(second)
+            f.write("simundump xcoredraw /edit/draw 0 -6 4 -2 6\n"
+                    "simundump xtree /edit/draw/tree 0 \\\n"
+                    "  /kinetics/#[],/kinetics/#[]/#[],/kinetics/#[]/#[]/#[][TYPE!=proto],/kinetics/#[]/#[]/#[][TYPE!=linkinfo]/##[] \"edit_elm.D <v>; drag_from_edit.w <d> <S> <x> <y> <z>\" auto 0.6\n"
+                    "simundump xtext /file/notes 0 1\n")
+            storeReacMsg(reacList,f)
+            storeEnzMsg(enzList,f)
+            if tgraphs:
+                storePlotMsgs(tgraphs,f)
+            writeFooter1(f)
+            writeNotes(modelpath,f)
+            writeFooter2(f)
+            print('Written to file '+filename)
+            return True
+        else:
+            print(("Warning: writeKkit:: No model found on " , modelpath))
+            return False
 
-    #agraph = nx.to_agraph(G)
-    #agraph.draw("writetogenesis.png", format = 'png', prog = 'dot')
-    sceneitems = {}
+def findMinMax(sceneitems):
+    cmin = 0.0
+    cmax = 1.0
+    xmin,xymin = 0.0,0.0
+    xmax,xymax = 1.0,1.0
     xycord = []
-
-    for key,value in list(position.items()):
-        xycord.append(value[0])
-        xycord.append(value[1])
-        sceneitems[moose.element(key)] = {'x':value[0],'y':value[1]}
+    xcord = []
+    ycord = []
+    for k,v in list(sceneitems.items()):
+        xycord.append(v['x'])
+        xycord.append(v['y'])
+        xcord.append(v['x'])
+        ycord.append(v['y'])
+    xmin = min(xcord)
+    xmax = max(xcord)
+    ymin = min(ycord)
+    ymax = max(ycord)
     cmin = min(xycord)
     cmax = max(xycord)
-    return cmin,cmax,sceneitems
+    return cmin,cmax,xmin,xmax,ymin,ymax
 
-def find_index(value, key):
-    """ Value.get(key) to avoid expection which would raise if empty value in dictionary for a given key """
-    if value.get(key) != None:
-        return value.get(key)
-    else:
-        raise ValueError('no dict with the key found')
+def calPrime(x):
+    prime = int((20*(float(x-cmin)/float(cmax-cmin)))-10)
+    return prime
 
 def storeCplxEnzMsgs( enz, f ):
     for sub in enz.neighbors["subOut"]:
@@ -409,9 +267,7 @@ def nearestColorIndex(color, color_sequence):
     #Trying to find the index to closest color map from the rainbow pickle file for matching the Genesis color map
     distance = [ (color[0] - temp[0]) ** 2 + (color[1] - temp[1]) ** 2 + (color[2] - temp[2]) ** 2
                  for temp in color_sequence]
-
     minindex = 0
-
     for i in range(1, len(distance)):
         if distance[minindex] > distance[i] : minindex = i
 
@@ -500,11 +356,23 @@ def storePlotMsgs( tgraphs,f):
         for graph in tgraphs:
             slash = graph.path.find('graphs')
             if not slash > -1:
-                slash = graph.path.find('graph_0')
+                slash = graph.path.find('graph')
             if slash > -1:
-                conc = graph.path.find('conc')
-                if conc > -1 :
-                    tabPath = graph.path[slash:len(graph.path)]
+                foundConc = True
+                if not ( (graph.path.find('conc1') > -1 ) or
+                            (graph.path.find('conc2') > -1 ) or 
+                            (graph.path.find('conc3') > -1 ) or
+                            (graph.path.find('conc4') > -1) ):
+                    foundConc = False
+
+                #conc = graph.path.find('conc')
+                # if conc > -1 :
+                #     tabPath = graph.path[slash:len(graph.path)]
+                # else:
+                #     slash1 = graph.path.find('/',slash)
+                #     tabPath = "/graphs/conc1" +graph.path[slash1:len(graph.path)]
+                if foundConc == True:
+                    tabPath = "/"+graph.path[slash:len(graph.path)]
                 else:
                     slash1 = graph.path.find('/',slash)
                     tabPath = "/graphs/conc1" +graph.path[slash1:len(graph.path)]
@@ -527,14 +395,21 @@ def writeplot( tgraphs,f ):
         for graphs in tgraphs:
             slash = graphs.path.find('graphs')
             if not slash > -1:
-                slash = graphs.path.find('graph_0')
+                slash = graphs.path.find('graph')
             if slash > -1:
-                conc = graphs.path.find('conc')
-                if conc > -1 :
+                foundConc = True
+                if not ( (graphs.path.find('conc1') > -1 ) or
+                            (graphs.path.find('conc2') > -1 ) or 
+                            (graphs.path.find('conc3') > -1 ) or
+                            (graphs.path.find('conc4') > -1) ):
+                    foundConc = False
+                if foundConc == True:
                     tabPath = "/"+graphs.path[slash:len(graphs.path)]
                 else:
                     slash1 = graphs.path.find('/',slash)
                     tabPath = "/graphs/conc1" +graphs.path[slash1:len(graphs.path)]
+                    
+
                 if len(moose.element(graphs).msgOut):
                     poolPath = (moose.element(graphs).msgOut)[0].e2.path
                     poolEle = moose.element(poolPath)
@@ -586,7 +461,7 @@ def writePool(modelpath,f,volIndex,sceneitems):
                 color = getRandColor()
             if textcolor == ""  or textcolor == " ":
                 textcolor = getRandColor()
-	    #print " trimPath",trimPath(p)
+        #print " trimPath",trimPath(p)
             f.write("simundump kpool /kinetics/" + trimPath(p) + " 0 " +
                     str(p.diffConst) + " " +
                     str(0) + " " +
@@ -628,11 +503,6 @@ def getColorCheck(color,GENESIS_COLOR_SEQUENCE):
     else:
         raise Exception("Invalid Color Value!")
 
-ignoreColor= ["mistyrose","antiquewhite","aliceblue","azure","bisque","black","blanchedalmond","blue","cornsilk","darkolivegreen","darkslategray","dimgray","floralwhite","gainsboro","ghostwhite","honeydew","ivory","lavender","lavenderblush","lemonchiffon","lightcyan","lightgoldenrodyellow","lightgray","lightyellow","linen","mediumblue","mintcream","navy","oldlace","papayawhip","saddlebrown","seashell","snow","wheat","white","whitesmoke","aquamarine","lightsalmon","moccasin","limegreen","snow","sienna","beige","dimgrey","lightsage"]
-matplotcolor = {}
-for name,hexno in matplotlib.colors.cnames.items():
-    matplotcolor[name]=hexno
-
 def getRandColor():
     k = random.choice(list(matplotcolor.keys()))
     if k in ignoreColor:
@@ -761,13 +631,19 @@ def writeFooter2(f):
 
 if __name__ == "__main__":
     import sys
-
+    import os
     filename = sys.argv[1]
-    modelpath = filename[0:filename.find('.')]
+    filepath, filenameWithext = os.path.split(filename)
+    if filenameWithext.find('.') != -1:
+        modelpath = filenameWithext[:filenameWithext.find('.')]
+    else:
+        modelpath = filenameWithext
+
     moose.loadModel(filename,'/'+modelpath,"gsl")
-    output = modelpath+"_4mmoose.g"
-    written = write('/'+modelpath,output)
+    output = modelpath+"_.g"
+    written = mooseWriteKkit('/'+modelpath,output)
+    
     if written:
             print((" file written to ",output))
     else:
-            print(" could be written to kkit format")
+            print(" could be written to kkit format")
\ No newline at end of file
diff --git a/python/moose/moose.py b/python/moose/moose.py
index edc9954e..1309c68f 100644
--- a/python/moose/moose.py
+++ b/python/moose/moose.py
@@ -17,24 +17,9 @@ from collections import defaultdict
 from . import _moose
 from ._moose import *
 import __main__ as main
-
-sbmlSupport_, genesisSupport_ = True, True
-try:
-    import SBML.readSBML
-    import SBML.writeSBML 
-except Exception as e:
-    print( 'MOOSE could not load SBML support due to %s' % e )
-    sbmlSupport_ = False
-
-try:
-    import genesis.writeKkit
-except Exception as e:
-    print('MOOSE could not load GENESIS support')
-    print('\tError was %s' % e)
-    genesisSupport_ = False
-
-from . import add_Delete_ChemicalSolver 
-
+import genesis.writeKkit
+import SBML.readSBML
+import SBML.writeSBML
 sequence_types = ['vector<double>',
                   'vector<int>',
                   'vector<long>',
@@ -71,17 +56,10 @@ def mooseReadSBML(filepath, loadpath, solver='ee'):
     solver   -- Solver to use (default 'ee' ) \n
 
     """
-    global sbmlSupport_
-    if not sbmlSupport_:
-        print('SBML support was not loaded')
-        return None
-    if not os.path.isfile(filepath):
-        raise UserWarning('File %s not found' % filepath)
-
     return SBML.readSBML.mooseReadSBML( filepath, loadpath, solver )
 
 
-def mooseWriteSBML(modelpath, filenpath, sceneitems={}):
+def mooseWriteSBML(modelpath, filepath, sceneitems={}):
     """Writes loaded model under modelpath to a file in SBML format.
 
     keyword arguments:\n
@@ -97,16 +75,10 @@ def mooseWriteSBML(modelpath, filenpath, sceneitems={}):
                             --- else, auto-coordinates is used for layout position and passed
 
     """
-
-    global sbmlSupport_
-    if not sbmlSupport_:
-        print('SBML support was not loaded')
-        return None
-
     return SBML.writeSBML.mooseWriteSBML(modelpath, filepath, sceneitems)
 
 
-def mooseWriteKkit(modelpath, filepath):
+def mooseWriteKkit(modelpath, filepath,sceneitems={}):
     """Writes  loded model under modelpath to a file in Kkit format.
 
     keyword arguments:\n
@@ -114,12 +86,7 @@ def mooseWriteKkit(modelpath, filepath):
     modelpath -- model path in moose \n
     filepath -- Path of output file.
     """
-    global genesisSupport_
-    if not genesisSupport_:
-        print('GENESIS(kkit) support was not loaded')
-        return None
-
-    return moose.genesis.writeKkit.mooseWiteKkit(modelpath, filepath)
+    return genesis.writeKkit.mooseWriteKkit(modelpath, filepath,sceneitems)
 
 
 def moosedeleteChemSolver(modelpath):
@@ -128,7 +95,7 @@ def moosedeleteChemSolver(modelpath):
         this should be followed by mooseaddChemSolver for add solvers on to compartment to simulate else
         default is Exponential Euler (ee)
     """
-    return add_Delete_ChemicalSolver.moosedeleteChemSolver(modelpath)
+    return chemUtil.add_Delete_ChemicalSolver.moosedeleteChemSolver(modelpath)
 
 
 def mooseaddChemSolver(modelpath, solver):
@@ -142,7 +109,7 @@ def mooseaddChemSolver(modelpath, solver):
               "Runge Kutta"       ("gsl")
 
     """
-    return add_Delete_ChemicalSolver.mooseaddChemSolver(modelpath, solver)
+    return chemUtil.add_Delete_ChemicalSolver.mooseaddChemSolver(modelpath, solver)
 
 ################################################################
 # Wrappers for global functions
diff --git a/python/setup.py b/python/setup.py
index 47b5f3aa..94d51ca1 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -12,34 +12,19 @@
 # You should have received a copy of the GNU General Public License
 # along with MOOSE.  If not, see <http://www.gnu.org/licenses/>.
 
-
-"""setup.py: 
-
-    Script to install python targets.
-
-"""
-    
 __author__           = "Dilawar Singh"
-__copyright__        = "Copyright 2013, Dilawar Singh and NCBS Bangalore"
+__copyright__        = "Copyright 2013-17, Dilawar Singh"
 __credits__          = ["NCBS Bangalore"]
-__license__          = "GNU GPL"
-__version__          = "1.0.0"
+__license__          = "GNU GPLv3"
 __maintainer__       = "Dilawar Singh"
 __email__            = "dilawars@ncbs.res.in"
-__status__           = "Development"
 
 import os
 from distutils.core import setup
 
 script_dir = os.path.dirname( os.path.abspath( __file__ ) )
 
-version = '3.1'
-try:
-    with open( os.path.join( script_dir, '..', 'VERSION'), 'r' ) as f:
-        version = f.read( )
-except Exception as e:
-    print( 'Failed to read VERSION %s' % e )
-    print( 'Using default 3.1' )
+version = '3.1.2'
 
 try:
     import importlib.machinery
@@ -51,7 +36,7 @@ setup(
         name='moose',
         version=version,
         description='MOOSE python scripting module.',
-        author='MOOSERes',
+        author='See AUTHORS file',
         author_email='bhalla@ncbs.res.in',
         maintainer='Dilawar Singh',
         maintainer_email='dilawars@ncbs.res.in',
@@ -62,6 +47,7 @@ setup(
             , 'moose.SBML'
             , 'moose.neuroml'
             , 'moose.genesis'
+            , 'moose.chemUtil'
             ],
         package_dir = { 
             'moose' : 'moose' 
-- 
GitLab