diff --git a/libsrc/atari/open.s b/libsrc/atari/open.s
index 306cf52c2..2188257cb 100644
--- a/libsrc/atari/open.s
+++ b/libsrc/atari/open.s
@@ -91,7 +91,10 @@ cont:   ldy     #3
         jsr     ldaxysp
 
 .ifdef  UCASE_FILENAME
-
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
         jsr     ucase_fn
         bcc     ucok1
 invret: lda     #<EINVAL        ; file name is too long
diff --git a/libsrc/atari/syschdir.s b/libsrc/atari/syschdir.s
index 16cb3a1fe..d57708384 100644
--- a/libsrc/atari/syschdir.s
+++ b/libsrc/atari/syschdir.s
@@ -15,6 +15,9 @@
         .importzp tmp3
         .import addysp
         .import ucase_fn
+.ifdef  DEFAULT_DEVICE
+        .importzp tmp2
+.endif
 .endif
         .export __syschdir
 
@@ -40,6 +43,10 @@ iocbok: stx     tmp4            ; remember IOCB index
 
 .ifdef  UCASE_FILENAME
 
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
         jsr     ucase_fn
         bcc     ucok1
 
diff --git a/libsrc/atari/sysmkdir.s b/libsrc/atari/sysmkdir.s
index 56a068757..cc1b3e2bf 100644
--- a/libsrc/atari/sysmkdir.s
+++ b/libsrc/atari/sysmkdir.s
@@ -15,6 +15,9 @@
 .ifdef  UCASE_FILENAME
         .importzp tmp3
         .import ucase_fn
+.ifdef  DEFAULT_DEVICE
+        .importzp tmp2
+.endif
 .endif
         .export __sysmkdir
 
@@ -46,6 +49,10 @@ iocbok: stx     tmp4            ; remember IOCB index
 
 .ifdef  UCASE_FILENAME
 
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
         jsr     ucase_fn
         bcc     ucok1
 
diff --git a/libsrc/atari/sysremove.s b/libsrc/atari/sysremove.s
index 1e7b4760f..15bc19e1c 100644
--- a/libsrc/atari/sysremove.s
+++ b/libsrc/atari/sysremove.s
@@ -12,6 +12,9 @@
         .importzp tmp3
         .import addysp
         .import ucase_fn
+.ifdef  DEFAULT_DEVICE
+        .importzp tmp2
+.endif
 .endif
         .export __sysremove
 
@@ -37,6 +40,10 @@ iocbok: stx     tmp4            ; remember IOCB index
 
 .ifdef  UCASE_FILENAME
 
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
         jsr     ucase_fn
         bcc     ucok1
 
diff --git a/libsrc/atari/sysrename.s b/libsrc/atari/sysrename.s
new file mode 100644
index 000000000..fef18bded
--- /dev/null
+++ b/libsrc/atari/sysrename.s
@@ -0,0 +1,185 @@
+;
+; Christian Groessler, 2013-07-24
+;
+; unsigned char __fastcall__ _sysrename (const char* oldname, const char* newname);
+;
+
+        .include "atari.inc"
+        .import findfreeiocb
+        .importzp tmp4, sp, ptr2, ptr3
+        .import incsp2, subysp, addysp, popax
+.ifdef  UCASE_FILENAME
+        .importzp tmp3
+        .import ucase_fn
+.ifdef  DEFAULT_DEVICE
+        .importzp tmp2
+.endif
+.endif
+        .export __sysrename
+
+.proc   __sysrename
+
+        pha                     ; save input parameter
+        txa
+        pha
+
+        jsr     findfreeiocb
+        beq     iocbok          ; we found one
+
+        pla
+        pla                     ; fix up stack
+        jsr     incsp2
+
+        lda     #TMOF           ; too many open files
+        rts
+
+iocbok: stx     tmp4            ; remember IOCB index
+
+        pla
+        sta     ptr2+1          ; remember newname
+        pla
+        sta     ptr2            ; ditto.
+
+        jsr     popax           ; get oldname
+
+        ldy     #0
+        sty     sspc+1          ; initialize stack space
+
+.ifndef  UCASE_FILENAME
+
+        sta     ptr3
+        stx     ptr3+1
+        sty     sspc
+
+.else
+
+; uppercase first (old) name and prepend device if needed
+
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
+        jsr     ucase_fn
+        bcc     ucok1
+
+        lda     #183            ; see oserror.s
+        rts
+
+ucok1:  sta     ptr3
+        stx     ptr3+1          ; remember pointer to uppercased old name
+        lda     tmp3            ; # of bytes reserved on the stack
+        sta     sspc            ; remember...
+
+; uppercase second (new) name and don't prepend device
+
+.ifdef  DEFAULT_DEVICE
+        ldy     #0
+        sty     tmp2            ; set flag for ucase_fn
+.endif
+        lda     ptr2
+        ldx     ptr2+1
+
+        jsr     ucase_fn
+        bcc     ucok2
+
+        ldy     tmp3            ; get size
+        jsr     addysp          ; free used space on the stack
+        lda     #183            ; see oserror.s
+        rts
+
+ucok2:  sta     ptr2            ; remember pointer to uppercased new name
+        stx     ptr2+1
+
+; update sspc -- # of bytes used on the stack
+
+        lda     sspc
+        clc
+        adc     tmp3
+        sta     sspc
+        bcc     ukok4
+        inc     sspc+1
+ukok4:
+
+.endif
+
+; create a string on the stack with the old filename and the new filename separated by an invalid character (space in our case)
+; ptr2 - pointer to new name
+; ptr3 - pointer to old name
+
+        lda     #128
+        tay
+        clc
+        adc     sspc
+        sta     sspc
+        bcc     L1
+        inc     sspc+1
+L1:     jsr     subysp          ; make room on the stack
+
+; copy old name
+        ldy     #0
+con:    lda     (ptr3),y
+        sta     (sp),y
+        beq     copyend
+        iny
+        bne     con
+
+copyend:lda     #$20            ; space
+        sta     (sp),y
+        iny
+        tya                     ; get current offset (beyond old name)
+        clc
+        adc     sp
+        sta     ptr3
+        lda     sp+1
+        adc     #0
+        sta     ptr3+1          ; ptr3 now contains pointer to space for new filename
+
+; copy new name
+        ldy     #0
+cnn:    lda     (ptr2),y
+        sta     (ptr3),y
+        beq     copend2
+        iny
+        bne     cnn
+
+copend2:ldx     tmp4
+        lda     sp
+        sta     ICBAL,x
+        lda     sp+1
+        sta     ICBAH,x
+        lda     #RENAME
+        sta     ICCOM,x
+        lda     #0
+        sta     ICAX1,x
+        sta     ICAX2,x
+        sta     ICBLL,x
+        sta     ICBLH,x
+        jsr     CIOV
+        tya
+        pha
+
+; clean up stack
+
+        lda     sp
+        clc
+        adc     sspc
+        sta     sp
+        lda     sp+1
+        adc     sspc+1
+        sta     sp+1
+
+; handle status
+
+        pla
+        tay
+        bmi     cioerr
+        lda     #0
+        rts
+cioerr: tya
+        rts
+
+.endproc        ; __sysrename
+
+        .bss
+
+sspc:   .res    2               ; stack space used
diff --git a/libsrc/atari/sysrmdir.s b/libsrc/atari/sysrmdir.s
index 2a2b160c1..126c11cca 100644
--- a/libsrc/atari/sysrmdir.s
+++ b/libsrc/atari/sysrmdir.s
@@ -12,12 +12,17 @@
         .export         __sysrmdir
         .import         __sysremove
         .import         __dos_type
-        .import         ucase_fn
         .import         findfreeiocb
+        .importzp       tmp4
+.ifdef  UCASE_FILENAME
+        .import         ucase_fn
         .import         addysp
         .importzp       sreg
         .importzp       tmp3
-        .importzp       tmp4
+.ifdef  DEFAULT_DEVICE
+        .importzp tmp2
+.endif
+.endif
 
 .proc   __sysrmdir
 
@@ -53,6 +58,10 @@ do_sparta:
 
 .ifdef  UCASE_FILENAME
 
+.ifdef  DEFAULT_DEVICE
+        ldy     #$80
+        sty     tmp2            ; set flag for ucase_fn
+.endif
         jsr     ucase_fn
         bcc     ucok1
 
diff --git a/libsrc/atari/ucase_fn.s b/libsrc/atari/ucase_fn.s
index a32ddce23..e53750e29 100644
--- a/libsrc/atari/ucase_fn.s
+++ b/libsrc/atari/ucase_fn.s
@@ -7,6 +7,8 @@
 ;
 ; Calling parameters:
 ;       AX   - points to filename
+;       tmp2 - 0/$80 for don't/do prepend default device if no device
+;              is present in the passed string (only .ifdef DEFAULT_DEVICE)
 ; Return parameters:
 ;       C    - 0/1 for OK/Error (filename too long)
 ;       AX   - points to uppercased version of the filename on the stack
@@ -38,15 +40,16 @@
         stx     ptr4+1
 
 .ifdef  DEFAULT_DEVICE
+        ; bit #0 of tmp2 is used as a flag whether device name is present in passed string (1 = present, 0 = not present)
         ldy     #1
-        sty     tmp2            ; initialize flag: device present in passed string
+        inc     tmp2            ; initialize flag: device present
         lda     #':'
         cmp     (ptr4),y
         beq     hasdev
         iny
         cmp     (ptr4),y
         beq     hasdev
-        sta     tmp2            ; set flag: no device in passed string
+        dec     tmp2            ; set flag: no device in passed string
 hasdev:
 .endif
 
@@ -54,7 +57,7 @@ hasdev:
         sty     tmp3            ; save size
         jsr     subysp          ; make room on the stack
 
-        ; copy filename to the temp. place on the stack, also uppercasing it
+        ; copy filename to the temp. place on the stack, while uppercasing it
         ldy     #0
 
 loop2:  lda     (ptr4),y
@@ -77,9 +80,10 @@ L1:
 copy_end:
 
 .ifdef  DEFAULT_DEVICE
-        lda     tmp2
-        cmp     #1              ; was device present in passed string?
-        beq     hasdev2         ; yes, don't prepend something
+        lda     #1
+        bit     tmp2
+        bne     hasdev2         ; yes, don't prepend something
+        bpl     hasdev2
 
         ldy     #128+3          ; no, prepend "D:" (or other device)
         sty     tmp3            ; adjust stack size used