diff --git a/mapper/mapper.go b/mapper/mapper.go
index b7c8066..852ed83 100644
--- a/mapper/mapper.go
+++ b/mapper/mapper.go
@@ -24,37 +24,29 @@
 	parsedRules  map[string][]*parser.MappingResult
 }
 
-// NewMapper creates a new Mapper instance
-func NewMapper(configFiles ...string) (*Mapper, error) {
+// NewMapper creates a new Mapper instance from a list of MappingLists
+func NewMapper(lists []config.MappingList) (*Mapper, error) {
 	m := &Mapper{
 		mappingLists: make(map[string]*config.MappingList),
 		parsedRules:  make(map[string][]*parser.MappingResult),
 	}
 
-	// Load and parse all config files
-	for _, file := range configFiles {
-		cfg, err := config.LoadConfig(file)
+	// Store mapping lists by ID
+	for _, list := range lists {
+		if _, exists := m.mappingLists[list.ID]; exists {
+			return nil, fmt.Errorf("duplicate mapping list ID found: %s", list.ID)
+		}
+
+		// Create a copy of the list to store
+		listCopy := list
+		m.mappingLists[list.ID] = &listCopy
+
+		// Parse the rules immediately
+		parsedRules, err := list.ParseMappings()
 		if err != nil {
-			return nil, fmt.Errorf("failed to load config from %s: %w", file, err)
+			return nil, fmt.Errorf("failed to parse mappings for list %s: %w", list.ID, err)
 		}
-
-		// Store mapping lists by ID
-		for _, list := range cfg.Lists {
-			if _, exists := m.mappingLists[list.ID]; exists {
-				return nil, fmt.Errorf("duplicate mapping list ID found: %s", list.ID)
-			}
-
-			// Create a copy of the list to store
-			listCopy := list
-			m.mappingLists[list.ID] = &listCopy
-
-			// Parse the rules immediately
-			parsedRules, err := list.ParseMappings()
-			if err != nil {
-				return nil, fmt.Errorf("failed to parse mappings for list %s: %w", list.ID, err)
-			}
-			m.parsedRules[list.ID] = parsedRules
-		}
+		m.parsedRules[list.ID] = parsedRules
 	}
 
 	return m, nil
diff --git a/mapper/mapper_test.go b/mapper/mapper_test.go
index d5d4020..a83586d 100644
--- a/mapper/mapper_test.go
+++ b/mapper/mapper_test.go
@@ -2,35 +2,31 @@
 
 import (
 	"encoding/json"
-	"os"
-	"path/filepath"
 	"testing"
 
 	"github.com/KorAP/KoralPipe-TermMapper/ast"
+	"github.com/KorAP/KoralPipe-TermMapper/config"
 	"github.com/KorAP/KoralPipe-TermMapper/matcher"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
 
 func TestMapper(t *testing.T) {
-	// Create a temporary config file
-	tmpDir := t.TempDir()
-	configFile := filepath.Join(tmpDir, "test-config.yaml")
-
-	configContent := `- id: test-mapper
-  foundryA: opennlp
-  layerA: p
-  foundryB: upos
-  layerB: p
-  mappings:
-    - "[PIDAT] <> [opennlp/p=PIDAT & opennlp/p=AdjType:Pdt]"
-    - "[DET] <> [opennlp/p=DET]"`
-
-	err := os.WriteFile(configFile, []byte(configContent), 0644)
-	require.NoError(t, err)
+	// Create test mapping list
+	mappingList := config.MappingList{
+		ID:       "test-mapper",
+		FoundryA: "opennlp",
+		LayerA:   "p",
+		FoundryB: "upos",
+		LayerB:   "p",
+		Mappings: []config.MappingRule{
+			"[PIDAT] <> [opennlp/p=PIDAT & opennlp/p=AdjType:Pdt]",
+			"[DET] <> [opennlp/p=DET]",
+		},
+	}
 
 	// Create a new mapper
-	m, err := NewMapper(configFile)
+	m, err := NewMapper([]config.MappingList{mappingList})
 	require.NoError(t, err)
 
 	tests := []struct {
@@ -318,23 +314,20 @@
 }
 
 func TestInvalidPatternReplacement(t *testing.T) {
-	// Create a temporary config file
-	tmpDir := t.TempDir()
-	configFile := filepath.Join(tmpDir, "test-config.yaml")
-
-	configContent := `- id: test-mapper
-  foundryA: opennlp
-  layerA: p
-  foundryB: upos
-  layerB: p
-  mappings:
-    - "[PIDAT] <> [opennlp/p=PIDAT & opennlp/p=AdjType:Pdt]"`
-
-	err := os.WriteFile(configFile, []byte(configContent), 0644)
-	require.NoError(t, err)
+	// Create test mapping list
+	mappingList := config.MappingList{
+		ID:       "test-mapper",
+		FoundryA: "opennlp",
+		LayerA:   "p",
+		FoundryB: "upos",
+		LayerB:   "p",
+		Mappings: []config.MappingRule{
+			"[PIDAT] <> [opennlp/p=PIDAT & opennlp/p=AdjType:Pdt]",
+		},
+	}
 
 	// Create a new mapper
-	m, err := NewMapper(configFile)
+	m, err := NewMapper([]config.MappingList{mappingList})
 	require.NoError(t, err)
 
 	tests := []struct {
