diff --git a/Makefile b/Makefile
index b0da43adc8992ebdab25d66e0717755fcebe62a4..81b45c6930490600f0cde946766acf755836d22e 100644
--- a/Makefile
+++ b/Makefile
@@ -118,7 +118,7 @@ TOOLOBJ = $(SIMOBJ) \
 	  $(TARGET_DIR)/screen.o $(TARGET_DIR)/node.o			\
 	  $(TARGET_DIR)/tool.o $(TARGET_DIR)/utils.o		\
 	  $(TARGET_DIR)/pagewriter.o $(TARGET_DIR)/pagereader.o	\
-	  $(TARGET_DIR)/configreader.o
+	  $(TARGET_DIR)/configreader.o $(TARGET_DIR)/attrs.o
 
 
 $(TARGET_DIR)/ana/%.o: $(SRC_DIR)/ana/%.c
diff --git a/include/attrs.h b/include/attrs.h
new file mode 100644
index 0000000000000000000000000000000000000000..5622569f2019284780633c25ac4a57ce95933ded
--- /dev/null
+++ b/include/attrs.h
@@ -0,0 +1,10 @@
+#ifndef LOG_ATTRS_H
+#define LOG_ATTRS_H
+#include "logdef.h"
+
+
+void newattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr);
+void disposeattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr);
+void copyattrs(log_gattrrec **gattr, log_gattrrec *oldattr, short numattrs, log_kattrrec *kattr);
+
+#endif
diff --git a/src/attrs.c b/src/attrs.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebcd76d709e6335fe58170eaef5b50d6c0d2f041
--- /dev/null
+++ b/src/attrs.c
@@ -0,0 +1,95 @@
+#include "attrs.h"
+#include "settings.h"
+#include <utils/strings.h>
+
+void newattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr)
+{
+	short i;
+
+	*gattr = (log_gattrrec *)Malloc(numattrs * gattrrecsize);
+	for (i = 0; i < numattrs; i++)
+	{
+		switch (kattr[i].dtype)
+		{
+
+			case 'R':
+			case 'U':
+			case 'F':
+				(*gattr)[i].UU.r = kattr[i].UU.U82.r;
+				break;
+
+			case 'I':
+			case 'H':
+				(*gattr)[i].UU.U73.i1 = kattr[i].UU.U73.i1;
+				break;
+
+			case 'C':
+				(*gattr)[i].UU.c = (char *)Malloc(kattr[i].prec + 1L);
+				strcpy((*gattr)[i].UU.c, kattr[i].UU.c);
+				break;
+
+			case 'A':
+				(*gattr)[i].UU.sp = strdup(kattr[i].UU.sp);
+				break;
+
+			case 'B':
+				(*gattr)[i].UU.b = kattr[i].UU.b;
+				break;
+
+			case 'V':
+				(*gattr)[i].UU.nv = kattr[i].UU.U86.dv;
+				break;
+		}
+
+		(*gattr)[i].blnk = kattr[i].blnk;
+		(*gattr)[i].changed = false;
+	}
+}
+
+
+void disposeattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr)
+{
+	short i;
+
+	for (i = 0; i < numattrs; i++)
+	{
+		switch (kattr[i].dtype)
+		{
+
+			case 'C':
+				Free((*gattr)[i].UU.c);
+				break;
+
+			case 'A':
+				strdispose(&(*gattr)[i].UU.sp);
+				break;
+		}
+	}
+	Free(*gattr);
+}
+
+
+void copyattrs(log_gattrrec **gattr, log_gattrrec *oldattr, short numattrs, log_kattrrec *kattr)
+{
+	short i;
+
+	*gattr = (log_gattrrec *)Malloc(numattrs * gattrrecsize);
+	for (i = 0; i < numattrs; i++)
+	{
+		(*gattr)[i] = oldattr[i];
+		switch (kattr[i].dtype)
+		{
+
+			case 'C':
+				(*gattr)[i].UU.c = (char *)Malloc(kattr[i].prec + 1L);
+				strcpy((*gattr)[i].UU.c, oldattr[i].UU.c);
+				break;
+
+			case 'A':
+				(*gattr)[i].UU.sp = strdup(oldattr[i].UU.sp);
+				break;
+		}
+	}
+}
+
+
diff --git a/src/log.c b/src/log.c
index 84d93be11b621980b937a410896d7f8f0b63ccd5..feb06265ee679a95e1a19ed5f148f8947c90894a 100644
--- a/src/log.c
+++ b/src/log.c
@@ -62,6 +62,7 @@
 #include "logstructs.h"
 #include "logglobals.h"
 
+#include "attrs.h"
 #include "screen.h"
 #include "label.h"
 #include "gate.h"
@@ -1878,97 +1879,6 @@ static void clearconflicts(log_tool *tool)
 
 short getsignal (int d, char *n);
 
-
-void newattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr)
-{
-	short i;
-
-	*gattr = (log_gattrrec *)Malloc(numattrs * gattrrecsize);
-	for (i = 0; i < numattrs; i++)
-	{
-		switch (kattr[i].dtype)
-		{
-
-			case 'R':
-			case 'U':
-			case 'F':
-				(*gattr)[i].UU.r = kattr[i].UU.U82.r;
-				break;
-
-			case 'I':
-			case 'H':
-				(*gattr)[i].UU.U73.i1 = kattr[i].UU.U73.i1;
-				break;
-
-			case 'C':
-				(*gattr)[i].UU.c = (char *)Malloc(kattr[i].prec + 1L);
-				strcpy((*gattr)[i].UU.c, kattr[i].UU.c);
-				break;
-
-			case 'A':
-				(*gattr)[i].UU.sp = strdup(kattr[i].UU.sp);
-				break;
-
-			case 'B':
-				(*gattr)[i].UU.b = kattr[i].UU.b;
-				break;
-
-			case 'V':
-				(*gattr)[i].UU.nv = kattr[i].UU.U86.dv;
-				break;
-		}
-
-		(*gattr)[i].blnk = kattr[i].blnk;
-		(*gattr)[i].changed = false;
-	}
-}
-
-
-void disposeattrs(log_gattrrec **gattr, short numattrs, log_kattrrec *kattr)
-{
-	short i;
-
-	for (i = 0; i < numattrs; i++)
-	{
-		switch (kattr[i].dtype)
-		{
-
-			case 'C':
-				Free((*gattr)[i].UU.c);
-				break;
-
-			case 'A':
-				strdispose(&(*gattr)[i].UU.sp);
-				break;
-		}
-	}
-	Free(*gattr);
-}
-
-
-void copyattrs(log_gattrrec **gattr, log_gattrrec *oldattr, short numattrs, log_kattrrec *kattr)
-{
-	short i;
-
-	*gattr = (log_gattrrec *)Malloc(numattrs * gattrrecsize);
-	for (i = 0; i < numattrs; i++)
-	{
-		(*gattr)[i] = oldattr[i];
-		switch (kattr[i].dtype)
-		{
-
-			case 'C':
-				(*gattr)[i].UU.c = (char *)Malloc(kattr[i].prec + 1L);
-				strcpy((*gattr)[i].UU.c, oldattr[i].UU.c);
-				break;
-
-			case 'A':
-				(*gattr)[i].UU.sp = strdup(oldattr[i].UU.sp);
-				break;
-		}
-	}
-}
-
 /// Link box to the current page.
 static void linkbox(log_brec *b)
 {